[TIL] 211130

Lee Syong·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
ëŠĨ동ė ėœžëĄœ ė‚īėž, 행ëģĩ하ęēŒðŸ˜

0개ė˜ 댓ęļ€