세션 (Session)

지은·2022년 11월 10일
0

네트워크

목록 보기
10/17

세션 (Session)

: 사용자가 인증(Authentication)에 성공한 상태

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

  1. 사용자가 인증에 성공하면, 서버는 로그인 상태를 유지하기 위해 해당 사용자의 정보를 담은 세션 객체를 생성하고, 일종의 저장소(세션 스토어 / in-memory)에 세션을 저장한다.
  2. 세션이 만들어지면, 각 세션을 구분할 수 있는 세션 ID가 만들어진다.
  3. 세션 ID는 클라이언트에게 전달되고, 클라이언트의 세션 성공을 증명할 수단으로써 사용된다.
  • 이때 웹사이트는 로그인을 유지하기 위한 수단으로 쿠키를 사용하는데, 쿠키에는 서버에서 발급한 세션 ID가 저장된다.
  1. 이후, 클라이언트가 요청을 보낼 때 쿠키를 통해 유효한 세션 ID가 서버에 전달되고, 세션 스토어에 해당 세션이 존재한다면, 서버는 해당 요청이 접근 가능(Authorization)하다고 판단한다.


세션 기반 인증의 단점

  • 서버(혹은 DB 통합)에서 유저에 대한 정보를 저장하기 때문에, 서버의 자원을 사용하고 있으므로 유저가 많아지면 서버의 성능이 떨어지게 된다.
    • 사용하는 유저가 많아지만 토큰 기반 인증이어도 과부하가 될 수 있겠지만, 세션 기반 인증만큼은 아니다.
  • 세션은 보통 하나의 서버에서만 접속 상태를 저장하므로 분산에 불리하다.
    • 만약, 여러 개의 서버에서 세션 데이터에 접근하려고 하면 session clustering 혹은 공통 session store를 사용해야하는 번거로움이 있다.
    • 여러 개의 서버를 사용하며 점점 확장해나갈 앱이라면, 토큰 기반 인증을 사용하는 게 좋다.

로그아웃

클라이언트에 저장된 쿠키세션 ID(인증 성공에 대한 증명)을 가지고 있고, 서버세션을 저장하고 있다.
그리고 서버는 클라이언트가 보내는 세션 ID로만 인증 여부를 판단한다.

로그아웃을 구현하기 위해서는 다음 두 가지 작업을 해야 한다.

  • 클라이언트 : 쿠키를 갱신해야 한다.
    (서버는 클라이언트의 쿠키를 임의로 삭제할 수 없으므로, set-cookie로 쿠키를 전송할 때, 세션 ID값을 무효한 값으로 갱신해야 한다.)
  • 서버 : 세션 정보를 삭제해야 한다.

express-session

: Node.js에서 세션을 쉽게 관리할 수 있도록 돕는 미들웨어

express-session 공식 문서

const express = require('express'); // Express 모듈 불러오기
const session = require('express-session'); // express-session 모듈 불러오기

const app = express(); // 서버 실행

express-session을 사용해 세션의 옵션을 지정할 수 있다.

  • 언뜻 보면 쿠키 옵션과 비슷해 보이지만, secret 옵션의 비밀 키를 이용해 암호화한 세션 ID를 생성하고, 이것을 클라이언트에게 쿠키로 전송한다.
app.use(
  session({
    secret: '@codestates',
    resave: false,
    saveUninitialized: true,
    cookie: {
      domain: 'localhost',
      path: '/',
      maxAge: 24 * 6 * 60 * 10000,
      sameSite: 'none',
      httpOnly: false,
      secure: true,
    }
  })
);

세션 객체

  • 쿠키로 전송된 세션 ID는 이에 종속되는 고유한 세션 객체를 가지며, 이는 서버에 저장된다.
  • 이때 세션 객체는 유저별로 독립적으로 생성된 객체이므로 유저별로 각각 다른 데이터를 저장할 수 있다.
    ➡️ 따라서 클라이언트에 유저의 개인정보를 담지 않고도, 서버가 클라이언트의 세션 ID를 이용해 유저의 인증 여부를 판단할 수 있다.
  • 세션 객체는 req.session으로 접근할 수 있으며, 세션에 임의의 데이터를 저장하거나 불러올 수 있다.
    express-session GitHub

쿠키와 세션의 차이점

쿠키세션
설명쿠키는 그저 HTTP의 무상태성(Stateless)을 보완해주는 도구- 접속 상태를 서버가 가진다.(Stateful)
- 접속 상태와 권한 부여를 위해 세션 아이디를 쿠키로 전송한다.
접속 상태 저장 경로클라이언트서버
장점서버의 부담을 덜어준다.신뢰할 수 있는 유저인지 서버에서 추가로 확인 가능하다.
단점쿠키 그 자체는 인증이 아니다.하나의 서버에서만 접속 상태를 가지므로 분산에 분리하다.
profile
개발 공부 기록 블로그

0개의 댓글