백엔드/session

session

테오구 2021. 11. 23. 00:42
728x90

세션(Session)이란?

  • HTTP Session id를 식별자로 구별하여 데이터를 사용자의 브라우저에 쿠키형태가 아닌 접속한 서버 DB에 정보를 저장한다.
  • 클라이언트는 HTTP Session id를 쿠키로 메모리 저장된 형태로 가지고 있다.
  • 메모리에 저장하기 때문에 브라우저가 종료되면 사라지게 된다.

중요

서버가 client에 유일하고 암호화된 ID를 부여

중요 데이터는 서버에서 관리

서버에 접속 상태가 저장

신뢰할 수 있는 유저인지 확인이 가능

Cookie에 세션 아이디가 저장

세션의 흐름

 

1. 클라이언트가 서버에 Resource를 요청합니다.

2. 서버에서는 HTTP Request를 통해 쿠키에서 Session id를 확인을 한 후에 없으면

Set-Cookie를 통해 새로 발행한 Session-id 보냅니다.

3. 클라이언트는 HTTP Request 헤더에 Session id를 포함하여 원하는 Resource를 요청을 합니다.

4. 서버는 Session id를 통해 해당 세션을 찾아 클라이언트 상태 정보를 유지하며 적절한 응답을 합니다.

 

쿠키 vs 세션

 

세션의 단점

1. 기본적으로 세션은 서버 메모리에 저장하고 있다. 우리의 서버에 사용자가 많아지면 메모리의 일정부분을 항상 차지하고 있으므로 가용메모리의 양이 줄어들어 서버의 성능이 안좋아지게 된다.

2. 세션은 기존 쿠키를 완전 대체한게 아니기 때문에 쿠키를 사용한다. 쿠키는 XSS공격에 매우 취약하다. 세션은 쿠키를 여전히 사용하기에 쿠키의 한계를 그대로 가지고 있다. 

 

세션 주요 메서드

설정

express-session 라이브러ㄹ를 이용해 쿠키 설정

const session = require('express-session'); // 세션관리용 미들웨어

app.use(
  session({
    secret: '@codestates', //암호화하는 데 쓰일 키
    resave: false, // 세션을 언제나 저장할지 설정함 (?)
    saveUninitialized: true, //세션이 저장되기 전 uninitialized 상태로 미리 만들어 저장
    cookie: {
      domain: 'localhost', // 클라는 서버도메인이 설정과 같아야 쿠키전송가능
      path: '/', // 해당 path를 만족하면 쿠키 보내줌
      maxAge: 24 * 6 * 60 * 10000,
      sameSite: 'None',
      httpOnly: true, // JS로 쿠키를 사용할 수 없도록 함
      secure: true, // https 쿠키 주고받게 함
    },
  })
);

2. session 객체에 저장

(로그인에 성공한 경우)

req.session.save(function () {
  req.session.userId = userInfo.userId;
  res.json({ data: userInfo, message: 'ok' }); // save 비동기라서 여기안에 있어야함
});

3. session 삭제

      req.session.destroy();
      res.json({ data: null, message: 'ok' });
728x90