본문 바로가기
Back-end

Session 이란?

by 신재권 2022. 10. 17.

동작방식

  1. 클라이언트가 서버에 최초 요청
  2. 서버는 세션 ID를 새로 생성하고, 자신만의 목록에 세션 ID를 등록한다.
  3. 서버는 응답을 보낼 때 Header 영역의 쿠키 영역에 세션 ID를 담아 전송한다.
  4. 클라이언트는 세션 ID를 가지게 된다.
  5. 이후 요청시 클라이언트는 세션 ID를 함께 전송한다.
  6. 서버는 세션 ID를 목록에서 비교 후 그에 맞게 응답한다.

세션 ID가 사라지는 경우

  1. 서버에서 세션 제거
  2. 사용자가 브라우저를 모두 종료 → 클라이언트에서는 세션 값이 날라간다. 하지만 서버는 아직 이전값을 가지고 있어, 이 후 클라이언트 요청시 세션 ID 재발급을 해준다.
  3. 서버에서 설정한 세션 만료 시간이 초과된 경우

로그인 요청 동작방식

주로 로그인 요청(인증)을 할 때 많이 사용한다.

  1. 클라이언트가 서버에게 요청
  2. 서버는 요청을 받고, 세션 ID를 생성해 세션 저장소에 등록한다.
    • 세션 저장소 내부에서 각 세션 ID마다 또 하나의 저장소가 존재한다.
  3. 서버에서 응답할 때 Header 영역에 세션 ID를 담아 보낸다.
  4. 클라이언트에 세션 ID가 저장된다.
  5. 클라이언트가 서버에게 로그인을 요청
  6. 서버는 로그인 정보를 통해 DB에서 조회하고 맞는 데이터 일시 클라이언트에게 받은 세션 ID로, 세션 저장소에서 알맞은 값을 찾은 후 세션 ID 내부의 저장소에 로그인 유저 정보를 등록한다.
  7. 서버는 클라이언트에게 로그인 후 알맞은 페이지로 보낸다.
  8. 이후 클라이언트가 인증이 필요한 서비스를 요청한다.
  9. 서버는 인증이 필요하기 때문에 세션 ID를 확인하고, 세션 ID 내부 저장소에 유저 정보가 있다면 로그인 한 것으로 간주한다.
  10. 이후 DB에서 요청한 데이터를 가져와 정상적으로 응답해준다.

세션의 단점

서버는 클라이언트의 접속자 수에 맞춰 수용 서버가 있어야 한다.

서버 한개가 꽉차면 다른 서버에서 응답을 해줘야 하기 때문이다.

즉 서버를 여러개 만들어야 한다. 이것이 로드밸런싱이다.

로드밸런싱은 부하를 분산시키는 것이다.

만약 클라이언트가 서버 1에서 세션 ID를 발급받고, 이 후 서버 1이 바빠 서버 2 한테 세션 ID로 요청을하면, 서버 2의 세션저장소에는 클라이언트의 세션 ID가 등록되어 있지 않아 처음 온사람으로 인식을 한다.

이 문제점을 해결하는 방법은 스티키 서버, 세션 저장소 복제, DB에 세션 값 저장 등 다양한 방법이 존재한다.

세션 값을 여러 서버에서 공유하는 경우 RAM 저장소를 이용해야 한다. 대표적으로 Redis 이다.