웹 개발을 하다 보면 세션은 너무 당연하게 사용된다.
로그인을 유지하고, 사용자 상태를 기억하는 데 필수적인 요소다.
하지만 실제로 세션이 어떻게 동작하는지,
특히 멀티 WAS 환경에서 어떤 문제가 발생하는지 이해하고 있는 경우는 많지 않다.
이 글에서는 JSESSIONID를 중심으로
세션의 내부 동작과 구조를 조금 더 깊게 정리한다.
세션은 단순히 말하면 다음과 같다.
HTTP는 stateless(무상태)이기 때문에
요청마다 사용자를 식별할 방법이 필요하다.
이때 사용하는 것이 세션이다.
세션은 서버에 저장되지만,
클라이언트는 자신의 세션을 어떻게 식별할까?
그 역할을 하는 것이 JSESSIONID다.
Set-Cookie: JSESSIONID=ABC123
Cookie: JSESSIONID=ABC123
세션은 일반적으로 다음 위치에 저장된다.
멀티 서버 환경에서 사용
많이 하는 착각이 있다.
JSESSIONID에 사용자 정보가 들어있다?
아니다.
즉, 클라이언트는 아무 정보도 가지고 있지 않다.
[Client] → [WAS1]
문제 없음
[Client] → [LB] → [WAS1 / WAS2]
결과:
장점:
단점:
단점:
구조:
Client → LB → WAS → Redis
장점:
클러스터 환경에서는 이런 형태도 사용한다.
JSESSIONID=ABC123.node1
여기서
LB가 이 값을 보고 특정 서버로 라우팅
JSESSIONID는 쿠키이기 때문에
보안 설정이 중요하다.
설정에 따라
가능
HTTP는 stateless이기 때문에
그래서
이 구조가 만들어졌다.
세션 방식 외에도 다른 방식이 있다.
세션은 상태 기반(stateful),
JWT는 무상태(stateless) 방식이다.
세션은 서버에 있고,
JSESSIONID는 그 세션을 찾기 위한 식별자다.