[TIL] 211130

dev·2021년 11ė›” 30ėž
0

TIL

ëŠĐ록 ëģīęļ°
104/204
post-thumbnail

📝 ė˜Ī늘 한 ęēƒ

  1. user authentication - login

  2. stateless / session / cookie


📚 ë°°ėšī ęēƒ

user authentication

1. 로ę·ļėļ

ė–ī렜 ęģĩëķ€ė—ė„œ ėīė–īė„œ

ė§€ęļˆęđŒė§€ ė™„ė„ąëœ postLogin ėŧĻíŠļëĄĪ럮

import bcrypt from "bcrypt";

export const postLogin = async (req, res) => {
  cont { username, password } = req.body;
  const pageTitle = "Login";
  const user = await User.findOne({ username });
  if (!user) {
    return res.render("login", { pageTitle, errorMessage: "ė•„ėī디ëĨž ė°ūė„ 눘 ė—†ėŠĩ니ë‹Ī".});
  }
  const ok = await bcrypt.compare(password, user.password);
  if (!ok) {
    return res.render("login", { pageTitle, errorMessage: "ëđ„ë°€ëēˆí˜ļ가 틀ëĶ―ë‹ˆë‹Ī."});
  }
  
  // ė‹Īė œëĄœ 로ę·ļėļ 되도록 í•īė•ž í•Ļ
  // (ėž‘ė„ą ėĪ‘)
  
  return res.redirect("/");
};

로ę·ļėļė„ ė‹œë„í•œ user가 누ęĩŽėļė§€ëŠ” ė•Œęģ  ėžˆë‹Ī.
user가 ė‹Īė œëĄœ 로ę·ļėļ 되도록 하ë ĪëĐī ė„ļė…˜ęģž ėŋ í‚Ī뗐 대í•ī ė•Œė•„ė•ž 한ë‹Ī.

1) ė„ļė…˜(session)

(1) ëŽīėƒíƒœ(session)

ė„œëē„ę°€ ëļŒëžėš°ė €ė˜ ėš”ėē­ė„ 받ęģ  ėē˜ëĶŽëĨž í•ī ė‘ë‹ĩė„ 마ėđ˜ëĐī ė„œëē„뙀 ëļŒëžėš°ė €ëŠ” ėī뗐 대한 ė •ëģīëĨž ė™„ė „ížˆ ėžŠė–īëē„ëͰë‹Ī.
ėīėē˜ëŸž 한ëēˆ ė—°ęē°ėī 됐ë‹Ī가 끊ė–īė§€ëŠ” ęēƒė„ ëŽīėƒíƒœ(stateless)띞ęģ  í•œë‹Ī.

(2) ė„ļė…˜(session)

ë”°ëžė„œ ė„œëē„ę°€ 누가 ėš”ėē­í•˜ëД맀ëĨž ė•Œ 눘 ėžˆë„ëĄ 하ë ĪëĐī, user가 ė„œëē„뗐 ëŽīė–ļ가ëĨž ėš”ėē­í•  때마ë‹Ī user뗐ęēŒ ė •ëģīëĨž ë‚ĻęēĻėĪ˜ė•ž 한ë‹Ī.
ėīėē˜ëŸž ëļŒëžėš°ė €ė™€ ë°ąė—”ë“œ 氄뗐 ė–īë–Ī í™œë™ė„ í–ˆëŠ”ė§€ëĨž ęļ°ė–ĩ하는 ęēƒė„ ė„ļė…˜(session)ėī띞ęģ  í•œë‹Ī.

ėīëĨž ėœ„í•ī user가 로ę·ļėļ 할 때마ë‹Ī user뗐ęēŒ ė–īë–Ī 텍ėŠĪíŠļëĨž ėĢžęģ  ę·ļ ë‹ĪėŒëķ€í„°ëŠ” user가 ė„œëē„뗐 ėš”ėē­ė„ ëģī낾 때마ë‹Ī ę·ļ 텍ėŠĪíŠļëĨž 같ėī ëģīë‚ī도록 한ë‹Ī.

(3) express-session

express-sessionė„ ė„Īėđ˜í•˜ëĐī, ė›đ ė‚ŽėīíŠļëĨž ë°ĐëŽļ할 때마ë‹Ī express가 ė•Œė•„ė„œ ę·ļ 텍ėŠĪíŠļ(ė„ļė…˜ id)ëĨž 만ë“Īė–ī ëļŒëžėš°ė €ė—ęēŒ ëģīë‚īėĢžęģ , ė„ļė…˜ DBė—ë„ ę·ļ ė„ļė…˜ id뙀 í•Ļęŧ˜ ė„ļė…˜ objectëĨž ė €ėžĨí•īėĪ€ë‹Ī.

$ npm i express-session

ëĻžė €, express-sessionė„ ė„Īėđ˜í•œë‹Ī.

import session from "express-session";

app.use(session({
  secret: "Hello!",
  resave: true,
  saveUninitialized: true,
}));

server.js íīë”ė—ė„œ express-sessionė„ import 한 후 router ė―”ë“œ ė•žė—ė„œ ėīˆęļ°í™”í•īėĪ€ë‹Ī.
secret ę°’ė€ ë’Īė—ė„œ ė•„ëŽī도 ëŠĻëĨī는 ëŽļėžė—ī로 바ęŋ€ ęēƒėīë‹Ī.
resave뙀 saveUninitialized ė˜ĩė…˜ė€ ė―˜ė†” ė°―ė— 뜮 ëŽļęĩŽëĨž ė°ļęģ í•ī ėķ”ę°€í–ˆë‹Ī.

(4) ėŋ í‚Ī(cookie)

❗ í•ĩė‹Ž ❗

ėī렜 ëļŒëžėš°ė €ę°€ ė„œëē„뗐 ėš”ėē­ė„ ëģīë‚īëĐī ė„œëē„는 ëļŒëžėš°ė €ė—ęēŒ ė–īë–Ī 텍ėŠĪíŠļ(ė„ļė…˜ id)ëĨž ėĪ€ë‹Ī.
ę·ļ ėī후로 ëļŒëžėš°ė €ëŠ” localhost:4000ė˜ ëŠĻ든 url뗐 ėš”ėē­ė„ ëģī낾 때마ë‹Ī ėŋ í‚Īė—ė„œ ė„ļė…˜ idëĨž 가ė ļ뙀 í•Ļęŧ˜ ëģīë‚īėĪ€ë‹Ī. (ė„œëĄœ ë‹ĪëĨļ ëļŒëžėš°ė €ëŠ” ė„œëĄœ ë‹ĪëĨļ ėŋ í‚ĪëĨž 氀맄ë‹Ī.)
ėīëĨž í†ĩí•ī ė„œëē„는 ė„ļė…˜ DBė—ė„œ í•īë‹đ ė„ļė…˜ idëĨž 氀맄 ė„ļė…˜ object, ė͉ user뗐 대한 ė •ëģīëĨž ė°ūė„ 눘 ėžˆë‹Ī.
ė͉, ėŋ í‚Ī뗐 ėžˆëŠ” ė„ļė…˜ id뙀 ė„ļė…˜ DB뗐 ėžˆëŠ” ė„ļė…˜ id가 ę°™ė€ ė„ļė…˜ė„ ė°ū는 ęēƒėīë‹Ī.
ė„œëē„는 ė–īë–Ī user가 ė–īë–Ī ëļŒëžėš°ė €ė—ė„œ ėš”ėē­ė„ ëģīëƒˆëŠ”ė§€ ė•Œ 눘 ėžˆęģ , user뗐 대한 ė •ëģīëĨž ęļ°ė–ĩ하ęģ  ėķ”가할 눘 ėžˆë‹Ī.

2) user ė •ëģīëĨž ė„ļė…˜ė— ėķ”ę°€

import bcrypt from "bcrypt";

export const postLogin = async (req, res) => {
  cont { username, password } = req.body;
  const pageTitle = "Login";
  // user(username)가 ėĄīėžŽí•˜ëŠ”ė§€ 확ėļ
  const user = await User.findOne({ username });
  if (!user) {
    return res.render("login", { pageTitle, errorMessage: "ė•„ėī디ëĨž ė°ūė„ 눘 ė—†ėŠĩ니ë‹Ī".});
  }
  // user가 ėž…ë Ĩ한 password가 passwordė˜ í•īė‹œ 값ęģž ėžėđ˜í•˜ëД맀 확ėļ
  const ok = await bcrypt.compare(password, user.password);
  if (!ok) {
    return res.render("login", { pageTitle, errorMessage: "ëđ„ë°€ëēˆí˜ļ가 틀ëĶ―ë‹ˆë‹Ī."});
  }
  // user뗐 대한 ė •ëģīëĨž ė„ļė…˜ė— ėķ”ę°€í•œë‹Ī
  req.session.loggedIn = true;
  req.session.user = user;
  
  // user뗐ęēŒ ëĄœę·ļėļ뗐 ė„ąęģĩí–ˆėŒė„ ė•Œë Īė•ž 한ë‹Ī
  // ...
  
  return res.redirect("/");
};

3) 템플ëĶŋ ėˆ˜ė •

user뗐ęēŒ ëĄœę·ļėļ뗐 ė„ąęģĩí–ˆėŒė„ ė•ŒëĶŽęļ° ėœ„í•ī ė„ļė…˜ė— ęļ°ë°˜í•ī 프론íŠļė—”ë“œė— ë‚īėšĐėī í‘œė‹œë˜ë„ëĄ 템플ëĶŋė„ ėˆ˜ė •í•īė•ž 한ë‹Ī.
req.session.loggedInėī falseėž 때 base.pug íŒŒėžė—ė„œ Joinęģž Login 링큎ëĨž ëģīė—ŽėĢžë„ëĄ 하ęģ , trueėž 때 Joinęģž Logout 링큎ëĨž ëģīė—ŽėĢžë„ëĄ 한ë‹Ī.

ę·ļ럮나, ė•„ëž˜ė™€ 같ėī ėˆ˜ė •í•īëīĪė§€ë§Œ ė—ëŸŽę°€ ë°œėƒí–ˆë‹Ī.

if req.session.loggedIn
li
  a(href="/login") Login

ėī는 템플ëĶŋė—ė„œ ė„ļė…˜ė— ė ‘ę·ží•  ėˆ˜ę°€ ė—†ęļ° ë•ŒëŽļ뗐 ėƒęļī ė—ëŸŽėīë‹Ī.
ėīëĨž ė–īë–ŧęēŒ ėˆ˜ė •í•īėĪ˜ė•ž 할ęđŒ?

âœĻ ë‚īėž 할 ęēƒ

  1. ę°•ė˜ ęģ„ė† ë“Ģęļ°
profile
dev log

0ę°œė˜ 댓ęļ€