세션이란?
세션(Session)은 클라이언트와 서버 간의 상태를 유지하기 위한 기술이다. 클라이언트가 서버에 접속해서 통신을 시작한 시점부터 종료할 때까지의 기간 또는 그 기간 동안 서버에서 클라이언트를 식별하고 상태를 유지하는 방식이다.
세션의 주요 특징
1. 상태 유지
- HTTP는 무상태(Stateless) 프로토콜이기 때문에, 기본적으로 클라이언트와 서버 간의 이전 요청 상태를 기억하지 않는다.
- 세션은 클라이언트를 식별해 서버가 클라이언트 상태를 유지하도록 도와준다.
2. 서버에 저장
- 세션 정보는 보통 서버의 메모리나 데이터베이스에 저장된다.
- 클라이언트는 세션 ID를 쿠키나 URL 파라미터 등을 통해 서버로 전송한다.
3. 유효 기간
- 세션은 기본적으로 유효 기간(예: 30분)이 있으며, 유효 기간 동안 클라이언트와 서버의 상태를 유지한다.
- 유효 기간이 지나면 세션 정보는 삭제된다.
세션의 구성 요소
1. 세션 ID
- 세션을 식별하는 고유한 키.
- 보통 랜덤 문자열로 생성되어 클라이언트에 전달된다.
2. 세션 저장소
- 서버에서 세션 데이터를 저장하는 공간.
- 메모리, 데이터베이스, 파일 시스템 등을 사용한다.
3. 쿠키
- 세션 ID를 저장하고 클라이언트가 서버에 요청할 때마다 이를 전송하는 역할.
세션의 동작 원리
[로그인을 통한 세션 동작 구조]

1. 클라이언트가 서버로 요청을 보낸다
- 주소, 로그인등을 클라이언트가 서버로 요청한다.
2. 서버는 해당 요청이 최초인지 판단한다.
- 해댕 요청에 대한 응답하는 메서드가 존재하는지 확인한다.
- 최초 요청이면 세션ID를 생성하고 메모리나 데이터베이스에 저장한다.
- 최초 요청이 아니라면 Client에게 전달받은 SessionId를 메모리나 데이터베이스에서 찾는다.
3. 클라이언트한테 세션ID를 전달한다.

4. 다음 요청 부터 Client는 Header안 쿠키에 세션ID를 들고 간다.
- 클라이언트는 이후 요청마다 세션 ID를 서버로 전송한다.
- 서버는 세션 ID를 확인하여 저장된 세션 정보를 로드한다.
5. 세션 종료
- 세션의 유효 기간이 만료, 사용자의 로그아웃, 사용자 브라우저 종료등을 하면 세션이 종료되고, 서버는 해당 세션 데이터를 삭제한다.
세션과 로드밸런싱

만약 서버1
이 동시 요청을 100개까지 정상적으로 처리한다고 했을때 101번째 부터는 요청을 처리하는 속도가 느려질 것이다. 그때 101번째 요청부터 서버2
로 요청을 넘겨 분담하는 것이 로드 밸런싱이다.
궁금증
- Client가
서버1
에 요청을 보낸다면 서버1
안에서 세션ID를 생성,저장 후에 Client한테 header안의 쿠키를 통하여 세션ID를 담아 보낼 것이다.
- 만약 Client가 요청을 보냈는데 로드 밸런싱으로 인해
서버2
로 세션ID를 보내면 서버2
는 해당 세션ID를 저장하고 있지 않기 때문에 최초의 요청으로 받아들일것이다.
이 문제를 어떻게 해결할까?
해결방안
1. Sticky Session 사용
로드밸런서가 세션 기간 동안 동일한 클라이언트의 request를 항상 동일한 서버로 라우팅 해주는 기능이다.
예를 들어, Client가 1번부터 3번까지의 서버 중 1번 서버에 세션을 생성하였다면, 이후에 Client가 보내는 모든 요청은 1번 서버로만 보내지게 된다. 즉, Load Balancer는 User가 첫 번째 세션을 생성한 서버로 모든 요청을 리다이렉트 하여 고정된 세션만 사용하게 한다.
장점
- 서버들간의 세션 데이터 교환을 할 필요가 없다.
단점
- 특정 서버에 과부하가 발생할 수 있다.
- 트래픽이 균등하게 배분될 수 없다.
- 특정 서버의 사람들만 활발히 활동할 경우 해당 서버만 과부하가 걸린다.
2. Session Storage 사용
세션을 저장하는 공간을 의미한다. 각 서버는 세션 스토리지를 공유하여 사용한다.
많은 사람들이 이 방식을 채택한다고 한다.
장점
- Sticky Session처럼 트래픽이 몰리는 현상을 방지할 수 있다.
- 서버가 증설되더라도 각 서버에 세션 스토리지의 정보만을 입력하면 사용가능하다.
단점
- 세션 스토리지에 문제가 생기면 모든 세션이 이용이 불가하다.
3. 세션 복제
하나의 세션 저장소에서 변경이 발생하면 변경 사항이 모든 다른 세션에 복제를 하는 것이다.
장점
- 세션을 복제한다면 클라이언트가 이후에 어떤 서버에 접속하더라도 로그인 정보가 세션에서 복제되어 있으므로 세션을 사용 가능하다.
- 장애가 발생하더라도 서비스가 중단 되지 않는다.
단점
- 모든 서버가 동일한 세션 객체를 가져야 하기 때문에 많은 메모리가 필요하다.