2. Spring Session
Overview
이번에는 Spring Session을 쓰는 이유와 도입 과정에 대해 다룬다.
Session in Spring Security
기본적으로 Spring Security
에서는 세션 저장소로 Tomcat
서버가 사용된다. 즉, 메모리에 Session
이 저장된다.
이 때, JSESSION 이라는 이름으로 활용되며, 브라우저는 Set-Cookie
헤더로 JSESSIONID
를 받게 된다.
구체적인 세션 생성 내용은 아래를 통해 학습할 수 있다. 정리가 잘 되어 있다.
Session Management in Tomcat - Junhyunny’s Devlogs
Session Management in Tomcat
<br /><br />
junhyunny.github.io
문제는 메모리(내장 톰캣)에 Session 정보를 저장하다보니 분산 환경에서 각 WAS가 갖는 Session
정보가 다르기 때문에 분산 환경의 이점을 활용할 수가 없게 된다.(서버 과부하 또는 세션 불일치 문제가 발생)
그래서 분산 환경에서는 Session Clustering
을 사용하게 된다. 문제는 톰캣으로 세션 클러스터링 하는 방법이 꽤 만만치 않아 보인다. 굳이 알고 싶다면 아래 링크에서 확인 해볼 수 있다. (나는 별로 안알고 싶다.)
‘톰캣 세션 클러스터링’ 사용 방법 알아보기 - 디딤365
Spring Session
이런 상황에서 최선의 대안으로 Spring Session을 접했다.
Spring Session :: Spring Session (공식 문서)
Spring Session :: Spring Session
When a user interacts with a web application, the server creates a session to keep track of their activity. This session may store information such as user preferences, login status, and shopping cart contents. However, sessions can be problematic in a dis
docs.spring.io
Spring Session은 유저의 세션 정보를 관리하기 위한 API와 구현체를 제공한다.
Spring Session provides an API and implementations for managing a user’s session information.
공식 문서를 요약하면 HttpSession
의 구현체를 제공하면서 Session Clustering
, Session Management
을 더욱 쉽게 만들어 준다고 한다. 또한, RDB, NoSQL, Redis 등 다양한 저장소를 지원한다.
의존성 추가
저번 포스팅에 build.gradle
에 Spring Session 을 추가하지 않아서 의존성 추가가 필요하다.
우선 DB를 Session Storage
로 구축하려고 하기 때문에 Spring Session의 jdbc 의존성을 추가해 준다.
//Spring Session
implementation 'org.springframework.session:spring-session-jdbc'
주의할 점은 start.spring.io 에서 Spring Session 의존성을 추가하면 의존성에 다음과 같이 추가된다.
//Spring Session
implementation 'org.springframework.session:spring-session-core'
문제는 이걸 의존성으로 추가하면 이것만으로는 jdbc 설정이 안된다. 한 4시간 동안 삽질한 끝에 알아냈다.
RDB를 Session Storage
로 사용하고자 한다면 뒤에 core가 아닌 jdbc 가 붙은 의존성을 추가해야 편리하다. (core만 쓰면 나머지는 수동으로 구현해야하는 듯 하다.)
그리고 /src/main/resources/application.properties/
에 다음과 같은 설정을 추가하라고 되어 있다.
spring.session.store-type=jdbc # Session store type.
문제는 이 프로퍼티가 core
와 jdbc
둘 다에서 인식이 안된다는 것이다. 그래서 찾아 봤더니 아마도 더 이상 해당 프로퍼티를 지원하지 않는 것 같다. (왜 공식문서를 방치해 놓는 지는 모르겠다.)
자세한 사항은 아래를 참고
Remove spring.session.store-type in favor of a defined order for which implementation will win when multiple are available · Is
Looking at #27738 caused us to realize that the auto-configuration for Spring Session is more complex than it needs to be. To simplify it, we'd like to remove spring.session.store-type. In the unli...
github.com
결과
이렇게 까지 한 후에 H2 콘솔을 확인해보면 H2 DB에 SPRING_SESSION
, SPRING_SESSION_ATTRIBUTES
2가지 테이블이 생성되어 있으며 Session이 생성될 때마다 H2 DB에 저장된다. 성공!
다음 포스팅에서는 Spring Security를 사용한 일반 로그인을 다뤄 보려고 한다. See you next time!