ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [인증/보안] Session
    codeStates front-end/node(server) 2023. 3. 8. 19:56
    반응형

    목차

       

      📌  Session

       

       

      📍Session 

       

      쿠키는 클라이언트에 정보를 저장하는 방식

      세션은 데이터를 서버에 저장하고 쿠키에는 데이터에 대한 아이디만 암호화된 상태로 부여한다

       

       

       

      세션기반 인증 (Session-based Authentication) - 로그인

       

      • 서버 :  사용자가 로그인을 한 것을 알고 있어야한다
      • 클라이언트 :  인증 성공을 증명할 수단을 갖고 있어야 한다

       

      ❗️❗️이때, 사용자가 인증에 성공한 상태를 세션이라한다.

      서버는 일종의 저장소에 세션 또는 세션 저장소(DB)을 저장

      👉🏻👉🏻 웹사이트에서 로그인을 유지하는 수단으로 쿠키를 사용한다.

      쿠키에는 서버에서 발급한 세션 아이디를 저장한다.

       

       

      [인증/보안] Cookie

      HTML 삽입 미리보기할 수 없는 소스 📌 Cookie 📍 Cookie 서버에서 클라이언트에 영속성있는 데이터를 저장하는 방법 서버는 클라이언트의 쿠키를 이용하여 데이터를 가져올 수 있다 http 프로토콜

      hwantech.tistory.com

       

       

      세션기반 인증 (Session-based Authentication) - 로그아웃

       

      세션 아이디가 담긴 쿠키는 클라이언트에 저장되어 있어, 서버는 세션을 저장

      서버는 세션 아이디로만 인증 여부를 판단

       

      주의: 쿠키는 세션 아이디, 즉 인증 성공에 대한 증명을 갖고 있으므로, 탈취될 경우 서버는 해당 요청이 인증된 사용자의 요청이라고 판단합니다. 이것이, 우리가 공공 PC에서 로그아웃해야 하는 이유이다.

       

      • 서버: 세션 정보를 삭제
      • 클라이언트: 쿠키를 갱신하거나 삭제

       

      express-session

       

      express 서버에서는 쉽게 세션을 위한 공간을 다룰 수 있도록 만들어 놓았다.

       

      const express = require('express');
      const session = require('express-session');
      
      const app = express();
      
      app.use(
        session({
          secret: '@codestates',
          resave: false,
          saveUninitialized: true,
          cookie: {
            domain: 'localhost',
            path: '/',
            maxAge: 24 * 6 * 60 * 10000,
            sameSite: 'none',
            httpOnly: false,
            secure: true,
          },
        })
      );

       

       

      🔗  [실습] 세션을 활용하여 로그인 상태 유지

       

       

      대부분의 코드는 cookie와 비슷하므로 한번 더 링크를 올린다.

       

       

      [인증/보안] Cookie

      HTML 삽입 미리보기할 수 없는 소스 📌 Cookie 📍 Cookie 서버에서 클라이언트에 영속성있는 데이터를 저장하는 방법 서버는 클라이언트의 쿠키를 이용하여 데이터를 가져올 수 있다 http 프로토콜

      hwantech.tistory.com

       

       

      튜토리얼

       

      쿠키 튜토리얼때와 로직은 비슷하다

       

       

      세션의 쿠키 옵션 설정

       

      server/index.js

       

      express 미들웨어에서 쉽게 세션 공간을 만들어 놓았다.

       

      app.use(
      session({
          secret: '@codestates',
          resave: false,
          saveUninitialized: true,
          cookie: {
            domain: 'localhost',
            path: '/',
            httpOnly: true,

       

       

      session은 req.session을 사용해 세션 객체에 userInfo.id를 저장

       

       

      // 이번에는 쿠키 튜토리얼과 다르게 res가 아니라 req에 작성해야됩니다. 정해진 사용법이니 주의!!
      req.session.sessionId = userInfo.id

       

      server/login 구현

       

      server/controllers/users/login.js

       

      const { USER_DATA } = require('../../db/data');
      module.exports = (req, res) => {
        const { userId, password } = req.body.loginInfo;
        const { checkedKeepLogin } = req.body;
        const userInfo = {
          ...USER_DATA.filter((user) => user.userId === userId && user.password === password)[0],
        };
        // session 옵션은 index.js 저장
        if (!userInfo.id) {
          res.status(401).send('Not Authorized');
        } else if (checkedKeepLogin) {
        //session은 req를 사용하니 주의!
          req.session.userId = userInfo.id;
          req.session.cookie.maxAge = 24 * 6 * 60 * 10000;
          // 로그인 정보를 저장하기 위해 redirect 사용
          res.redirect('/userinfo');
        } else {
          req.session.userId = userInfo.id;
          console.log(req.session)
          res.redirect('/userinfo');
        }
      };

       

      server/controllers/users/useInfo.js

       

      const { USER_DATA } = require('../../db/data');
      
      module.exports = (req, res) => {
        console.log(req.session)
        const userInfo = USER_DATA.filter((user) => user.id === req.session.userId)[0];
        if (!userInfo) {
          res.status(401).send('Not Authorized');
        } else {
          res.json({ ...userInfo, password: undefined });
        }
      };

       

       

      server/controllers/users/logout.js

       

      // 이 소스 만능
      req.session.destroy()
      res.status(205).send('Logged Out Successfully');
      반응형

      댓글

    Designed by Tistory.