Session

Judo·2021년 1월 24일
2

Session


  • 서버가 클라이언트에 유일하고 암호화된 ID를 부여
  • 중요 데이터는 서버(세션 객체)에서 관리

Session 전달 방법

  • 클라이언트에서 요청 시 서버는 DB에 정보를 저장하고 암호화된 세션 아이디를 쿠키에 담아 클라이언트에 전달
  • 이후 클라이언트가 추가 요청 시 헤더에 세션 아이디를 담아 전달한다.
  • 서버는 세션 아이디를 확인하고 요청을 처리한다.

  • 중요한 점
    • 결국 세션도 쿠키를 이용해 세션 아이디를 전달!
    • 저장되는 위치가 쿠키는 클라이언트, 세션은 서버라는 점!

Session의 단점

  • 클라이언트의 정보를 세션 객체, 즉 서버에 저장하기 때문에 저장해야하는 데이터가 많아질수록 서버에 부담이 커진다.
  • 세션 아이디가 담긴 쿠키는 인터넷 탭을 닫으면 삭제된다. 하지만 유효기간이 따로 정해져 있지 않기 때문에 유출된 쿠키를 이용한 요청인지 아닌지 확인할 길이 없다. 따라서 서버에서 세션을 파괴하는 과정이 필요하다.

express-session


  • express-session
  • 세션을 관리해주는 모듈
  • 세션을 위한 미들웨어로 'Express'에서 세션을 다룰 수 있는 공간을 쉽게 만들어줌.

express-session 사용하기

app.use(
  session({
    secret: '@codestates',
    resave: false,
    saveUninitialized: true,
    cookie: {
      domain: 'localhost',
      path: '/',
      maxAge: 24 * 6 * 60 * 10000,
      sameSite: 'none',
      httpOnly: true,
      secure: true,
    },
  })
);
  • secret: 쿠키를 임의로 변조하는것을 방지하기 위한 값. 이 값을 통하여 세션을 암호화하여 저장
  • resave: 세션을 언제나 저장할 지(변경하지 않아도) 정하는 값
  • saveUninitialized: 세션이 저장되기 전에 uninitialized 상태로 미리 만들어서 자장

session 이용

  • express-session을 사용하면 request.session 객체가 생성된다.
  • 해당 객체에 property를 할당함으로써 세션에 값을 줄 수 있다.
  • req.session.userId = '김코딩'
  • 세션 데이터를 삭제할 경우 req.session.destroy(callback)을 이용하면 세션을 완전히 삭제한다.

세션 흐름

  1. 서버는 웹 브라우저에게 세션 값을 보내준다.(sid 라고하며, 아무런 의미도 없는 단순 식별자)
    • 요청이 들어올 때 express-session 미들웨어에서 secret을 이용해 sid를 설정해주는 것 같다.
  2. 클라이언트는 접속할 때 자신이 가지고 있는 sid를 서버에게 전달
  3. 서버는 클라이언트가 보내준 sid를 가지고, 해당 유저를 식별

헷갈려던 점

  • 세션을 사용할 때 세션 아이디를 쿠키에 담아 전달하고 다른 데이터는 세션 객체, 즉 서버에 저장한다고 배웠다. 근데 express-session을 사용하면서 세션 아이디를 쿠키에 넣어주지 않아도 쿠키에 세션 아이디가 전달이 됐다. 처음에 이해가 되질 않았는데, express-session을 이용하면 secret을 이용해 임의의 식별자(sid)를 생성해 넘겨주는 것 같다.
    다수의 클라이언트들은 각자의 고유한 sid를 받아 서버와 통신하고 서버는 각각의 sid에 맞는 세션 객체를 저장해둠으로써 통신을 한다.
profile
즐거운 코딩

0개의 댓글