웹 서버가 사용자 상태(State) 를 어떻게 관리하느냐와 관련된 핵심 개념을 말한다.

HttpSession은 HTTP의 무상태(stateless) 특성을 보완하기 위한 기술이다.
즉, HTTP 요청은 기본적으로 요청 간의 상태를 기억하지 않기 때문에,
서버는 Session 객체를 이용해 사용자 상태를 서버 메모리에 저장한다.
예) 로그인 유지, 장바구니 정보, 최근 본 상품, 권한 정보 등
HttpSession 객체가 생성됨Session ID를 부여하고, 이를 JSESSIONID 쿠키로 클라이언트에게 전달JSESSIONID 쿠키를 함께 전송@GetMapping("/login")
public String login(HttpSession session) {
session.setAttribute("userId", "1234");
return "welcome";
}
@GetMapping("/mypage")
public String myPage(HttpSession session) {
String userId = (String) session.getAttribute("userId");
// 로그인 상태 유지 가능
}
HttpSession은 기본적으로 서버 메모리에 저장된다.
👉 그런데 서버를 여러 대 두는 클러스터 환경(로드 밸런싱) 에서는 문제가 생긴다.
사용자가 첫 번째 요청은
Server A로 갔는데,
두 번째 요청은Server B로 가면,
B 서버에는 세션 정보가 없어서 로그인 상태가 유지되지 않는 문제 상황 발생.
Session Clustering은 클러스터된 여러 서버 간에 세션 정보를 공유(복제)하는 기술이다.
이를 통해 사용자가 어느 서버로 요청을 보내도 같은 세션 상태를 유지할 수 있다.
| 방식 | 설명 | 장점 | 단점 |
|---|---|---|---|
| Sticky Session (Session Affinity) | 같은 사용자의 요청을 항상 같은 서버로 보내는 방식 | 구현 간단 | 특정 서버에 트래픽 집중 (부하 불균형) |
| Session Replication | 세션 정보를 모든 서버에 복제 | 장애 시에도 세션 유지 | 메모리 낭비, 네트워크 부하 |
| External Session Store (Redis 등) | 세션을 Redis나 DB에 저장 | 확장성 높고 안정적 | 외부 저장소 관리 필요 |
현재 대부분의 MSA나 대규모 서비스에서는 Session Replication 대신 Redis 세션 공유 구조를 쓴다고 한다.
[Client]
|
v
[Load Balancer]
|——> [Server A] —\
|——> [Server B] —+——> [Redis: Session Store]
application.yml)spring:
session:
store-type: redis
redis:
host: localhost
port: 6379
→ 이렇게 하면 여러 인스턴스가 동일한 Redis를 통해 세션을 공유하므로, 서버 간 세션 일관성이 유지된다.
| 항목 | Http Session | Session Clustering |
|---|---|---|
| 목적 | 개별 사용자 상태 유지 | 다중 서버 간 세션 일관성 유지 |
| 저장 위치 | 단일 서버 메모리 | 여러 서버 또는 외부 저장소 |
| 문제점 | 서버 확장 시 세션 불일치 | 네트워크 부하 또는 외부 의존성 |
| 대안 | JWT, Redis, DB 세션 | Redis 기반 Session Store (추천) |