Back-end/Server

Session & Session-based Authentication 의 λ™μž‘ κ³Όμ •

ciocio 2021. 11. 25. 01:44

πŸ“Œ  Session ?

 

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— data λ₯Ό μ €μž₯ν•  수 μžˆλŠ” 방법 쀑 ν•˜λ‚˜λ‘œ, νŠΉμ • μ €μž₯ 곡간을 μ˜λ―Έν•œλ‹€.

session 은 νŠΉλ³„ν•œ κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ μ‚¬μš©μžκ°€ μ›Ή λΈŒλΌμš°μ €λ₯Ό μ ‘μ†ν•œ μ‹œμ λΆ€ν„° μ’…λ£Œν•˜λŠ” μ‹œμ κΉŒμ§€ μœ μ§€λœλ‹€.

 

 

πŸ“Œ  Session-based Authentication λ™μž‘ κ³Όμ • ?

 

 

 

πŸ“Ž  express-session λͺ¨λ“ˆ

 

// express-session λͺ¨λ“ˆ

const express = require('express');
const session = require('express-session');

const app = express();

app.use(
  session({
    secret: ,
    resave: ,
    saveUninitialized: ,
    .
    .
    .
    cookie: {
      domain: ,
      path: ,
      maxAge: ,
      sameSite: ,
      httpOnly: ,
      secure: ,
      .
      .
      .
    }
  })
);

 

express-session μ‚¬μš©λ²•

 

μ„œλ²„λ₯Ό μƒμ„±ν•˜λ©΄μ„œ session λ―Έλ“€ 웨어λ₯Ό μ‚½μž…ν•΄μ£Όλ©΄, μ„œλ²„ 츑에 data λ₯Ό μ €μž₯ν•  수 μžˆλŠ” session 이 μƒμ„±λœλ‹€.

 

// controller/users/login.js

// DBμ—μ„œ 뢈러온 Users TABLE
const { Users } = require('../models');  // (model/index.js)

module.exports = {
  post: async (req, res) => {
    // Users ν…Œμ΄λΈ”μ—μ„œ μš”μ²­κ³Ό μΌμΉ˜ν•˜λŠ” 정보λ₯Ό query ν•΄μ˜¨λ‹€.
    const userInfo = await Users.findOne({
      where: { userId: req.body.userId, password: req.body.password },  
    });
    
    if(!userInfo){
      // λ“±λ‘λœ νšŒμ›μ΄ μ•„λ‹ˆλΌλ©΄ μ ‘κ·Ό λΆˆκ°€ν•˜λ‹€κ³  μ•Œλ €μ€€λ‹€.
      res.status(401).send({ data: null, message: 'not authorized' });
    }
    else{
      // λ“±λ‘λœ νšŒμ›μ΄λΌλ©΄ μ„Έμ…˜μ— μ„Έμ…˜ 아이디 값을 λ„£μ–΄μ€€λ‹€.
      // μ—¬κΈ°μ„  μ„Έμ…˜ 아이디λ₯Ό κ·Έλƒ₯ 일반 κ°’μœΌλ‘œ λ„˜κ²¨μ€¬μ§€λ§Œ, μ•”ν˜Έν™”ν•΄μ„œ λ„˜κ²¨μ£ΌλŠ” κ²½μš°κ°€ λ§Žλ‹€.
      req.session.session_id = userInfo.userId;
      // μ„Έμ…˜μ— μ„Έμ…˜ 아이디λ₯Ό 넣어쀬닀면 μΌμΉ˜ν•˜λŠ” νšŒμ› 정보λ₯Ό body에 λ‹΄μ•„ μ‘λ‹΅ν•œλ‹€.
      res.status(200).json({ data: userInfo, message: 'ok' });
    }
  }
};

 

DB μ—μ„œ μ›ν•˜λŠ” 정보λ₯Ό 가져와 session ID 와 ν•¨κ»˜ 응닡해쀀닀.

 

 

 

// controller/users/userinfo.js

// DBμ—μ„œ 뢈러온 Users TABLE
const { Users } = require('../models');  // (model/index.js)

module.exports = {
  get: async (req, res) => {
    // μš”μ²­μ— session_id 값이 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄,
    if(!req.session.session_id){
      // λ“±λ‘λœ νšŒμ›μ˜ μ •λ³΄λŠ” μ—†μœΌλ―€λ‘œ, μŠΉμΈμ„ κ±°λΆ€ν•œλ‹€.
      res.status(400).send({ data: null, message: 'not authorized' });
    }
    else {
      // session_id 값을 κ°€μ§€κ³  μžˆλ‹€λ©΄,
      // session_id κ°’κ³Ό μΌμΉ˜ν•˜λŠ” 정보가 λ‹΄κΈ΄ νšŒμ› 정보λ₯Ό λΆˆλŸ¬μ˜¨λ‹€.
      // μ„œλ²„ μ„Έμ…˜μ— λͺ¨λ“  정보가 μ €μž₯λ˜μ–΄ μžˆμœΌλ―€λ‘œ, μ„œλ²„μ—μ„œ 비ꡐ가 μ§„ν–‰λœλ‹€.
      const userData = await Users.findOne({
        where: { userId : req.session.session_id.userId },
      });
      // μΌμΉ˜ν•˜λŠ” 정보λ₯Ό λ‹΄μ•„ μ‘λ‹΅ν•œλ‹€.
      res.status(200).json({ data: userData.dataValues, message: 'ok' });
    }
  },
};

 

둜그인 ν›„ ( session ID λ₯Ό μ·¨λ“ν•œ ν›„ ) νšŒμ› 정보λ₯Ό 얻을 λ•Œ

ν΄λΌμ΄μ–ΈνŠΈκ°€ 보낸 μš”μ²­μ— λ“€μ–΄μžˆλŠ” session ID 와 μ„œλ²„μ— μ €μž₯된 session ID λ₯Ό λŒ€μ‘°ν•˜μ—¬ μΌμΉ˜ν•˜λŠ” 정보λ₯Ό λ°˜ν™˜ν•œλ‹€. !-!

 

 

 

 

 

 

πŸ“  μΆ”κ°€ 질문 사항

 

μ½”λ“œλ₯Ό 보면, session 에 session_id λ₯Ό μ €μž₯ν•˜λŠ” 뢀뢄은 μžˆμ–΄λ„

ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ ( set-cookie λ₯Ό μ΄μš©ν•˜λ“  req.cookie( ) λ₯Ό μ΄μš©ν•˜λ“  ) cookie 둜 μ „λ‹¬ν•΄μ£ΌλŠ” 뢀뢄은 μ—†λ‹€.

λ”°λ‘œ κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ”κ±΄μ§€ λ‚΄κ°€ 빼먹은 건지 μ•Œμ•„λ³Ό 것

 

->  슀슀둜 λ‚΄λ¦° κ²°λ‘ 

 

express-session 을 μ΄μš©ν•΄ μƒμ„±ν•œ session 객체 μ•ˆμ— cookie 정보가 ν¬ν•¨λ˜μ–΄μžˆλŠ”λ°,

이λ₯Ό session-cookie 둜 ν†΅ν•©ν•΄μ„œ 봐야할 것 κ°™λ‹€.

κ·Έλž˜μ„œ μ„œλ²„μͺ½μ—μ„œ λ”°λ‘œ μΏ ν‚€λ₯Ό μ„€μ •ν•˜μ§€ μ•Šμ•„λ„ session μ•ˆμ— μ›ν•˜λŠ” 킀와 값을 λ„£μ–΄μ£Όλ©΄ 

μžλ™μœΌλ‘œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 전솑될 μΏ ν‚€κ°€ μƒμ„±λ˜λŠ” 것 μ•„λ‹Œκ°€ ...! μΆ”μΈ‘ .

express-session μž‘λ™κ³Όμ •μ„ μ •ν™•νžˆλŠ” λͺ¨λ₯΄κ² λ‹€. μš”μ²­κ³Ό 응닡 사이λ₯Ό λœ―μ–΄λ³΄λŠ” μˆ˜λ°–μ—.

λ°˜μ‘ν˜•