๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Back-end/Server

Session & Session-based Authentication ์˜ ๋™์ž‘ ๊ณผ์ •

by ciocio 2021. 11. 25.

๐Ÿ“Œ  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 ์ž‘๋™๊ณผ์ •์„ ์ •ํ™•ํžˆ๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค. ์š”์ฒญ๊ณผ ์‘๋‹ต ์‚ฌ์ด๋ฅผ ๋œฏ์–ด๋ณด๋Š” ์ˆ˜๋ฐ–์—.

๋ฐ˜์‘ํ˜•

'Back-end > Server' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Token & Token-based Authentication ์˜ ๋™์ž‘ ๊ณผ์ • (feat. JWT)  (0) 2021.11.26

๋Œ“๊ธ€