Spring Session
Spring Session 공식 문서
Spring Sesison은 유저 세션 정보 관리를 위한 API와 구현체를 제공한다.
Spring session 은 세션 클러스터링을 유지하도록 한다.
세션 클러스터링이란?
클러스터는 군집이나 무리를 뜻함
두 대 이상의 WAS가 동시에 한가지 업무를 수행하도록 만드는 기술
세션 클러스터링은 WAS가 두 대 이상 설치되어 있을 경우 동일한 세션으로 세션 관리하는 것을 의미
동일한 세션으로 여러 WAS 서버에서 사용할 수 있다는 말
예를 들어서 설명하자면,
요청이 오면 L4 스위치가 해당 사용자가 접속했던 WAS로 유도해서 사용하던 세션을 그대로 사용할 수 있도록하지만 스레드 풀이 고갈되어서 다른 WAS를 사용하게 된다면 이때 세션 불일치 문제가 발생할 수 있다.
클러스터링
클러스터링은 데이터 포인트를 비슷한 특성이나 속성을 가진 그룹 또는 클러스터로 그룹화하는 기술이다.
여러대의 서버를 한가지 업무를 수행하도록 만드는 행위
서버 클러스터링이란 말을 들어본적 있을 것이다. 이것은 서버의 가용성을 높이기 위해 수행하는 것으로 서버 한대가 죽어도 다른 서버를 사용하여 죽은 서버의 역할을 대신할 수 있다는 말
Spring Session의 세션 클러스터링은 다음과 같은 기능?과 함께 사용될 수 있다.
- HttpSession: 헤더에 세션 ID를 제공하여 RESTful API와 작동할 수 있도록 지원
- WebSocket: WebSocket 통신시 HttpSession을 유지
- WebSession: Spring WebFux의 WebSession을 대체
분산 환경에서 발생하는 세션 문제
세션은 일반적으로 서버의 메모리에 저장되므로 분산 환경에서 문제가 된다.
Spring App #1은 session #1,2,3,4 정보를 인메모리에 가지고 있고, Spring App #2는 session #5,6,7,8에 대한 정보를 인메모리에 가지고 있다고 가정해보자
Spring App #2가 Session #3에 대한 요청을 수신한다면 Spring App #2 Session #3의 정보를 가지고 있지 않으므로 세션 데이터를 읽을 수 없다.
위 문제를 해결하려면 아래 그림처럼 세션 정보를 모두 공유하는 저장소가 필요하다. (레디스, JDBC, ...)
위 그림처럼 세션을 위한 공유 스토리지를 구현하면 Spring App #2에 Session #3에 대한 요청이 오더라고 이를 처리할 수 있다.
Spring Session이 제공하는 편리 기능
- 애플리케이션과 세션 저상소 분리
- Spring Session은 애플리케이션과 세션 관리 사이에 추상화 계층을 제공한다. 세션 데이터를 RDB, NoSQL 등과 같은 다양한 영구 저장소에 저장할 수 있다.
- Spring Session을 사용하면 영구 저장소에 관계없이 동일한 API를 사용하여 세션을 관리할 수 있다.
- 이를 통해 애플리케이션 코드를 변경하지 않고도 저장소 간에 전환이 더 쉬워진다.
- 세션 만료 확인 기능 제공
- 다른 엡 애플리케이션 간의 크로스 컨텍스트 통신(크로스사이트?) 제공
Spring Session의 일반적인 사용 사례
분산 웹 애플리키에션
- 여러 서버에 분산된 웹 애플리케이션이 있는 경우 사용자 세션을 관리하기 어려움
- Spring Session은 세션 데이터를 공유 데이터베이스나 Redis에 저장하여 모든 서버가 세션 데이터에 액세스하고 업데이트할 수 있음
세션 확장성
- 동시 사용자가 많은 대규모 웹 애플리케이션에서 서버의 메모리에 세션을 저장하면 확장성 문제가 발생
- Spring Session 을 사용하면 세션 데이터를 영구 저장소에 저장하여 확장성을 개선하고 메모리 부족 오류 위험을 줄일 수 있다.
세션 백업 및 복구
- 세션 데이터를 영구 저장소에 저장하면 서버 장애 또는 가동 중지 시 세션 데이터를 백업하고 복구할 수 있는 메커니즘을 제공할 수도 있다.
'Spring > Spring MVC' 카테고리의 다른 글
[Spring] HttpSession이 세션을 만들고, 가져오는 과정 (0) | 2024.10.26 |
---|---|
[Spring MVC] HandlerAdapter 가 필요한 이유 - 유연한 컨트롤러 (0) | 2024.10.08 |
[웹 애플리케이션 이해] 동시 요청 - 멀티 쓰레드 (2) | 2024.10.07 |
[웹 애플리케이셔 이해] 서블릿, 서블릿 컨테이너 (0) | 2024.10.07 |
[Spring Boot] WAS를 사용하면 WS는 필요없다? (0) | 2024.10.06 |