주니어 개발자 성장기

2. Spring Session 본문

예제/Session

2. Spring Session

Junpyo Lee 2023. 5. 18. 06:33

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

Set-Cookie &nbsp;헤더로&nbsp; JSESSIONID 를 받았다.

문제는 메모리(내장 톰캣)에 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.

문제는 이 프로퍼티가 corejdbc 둘 다에서 인식이 안된다는 것이다. 그래서 찾아 봤더니 아마도 더 이상 해당 프로퍼티를 지원하지 않는 것 같다. (왜 공식문서를 방치해 놓는 지는 모르겠다.)

 

자세한 사항은 아래를 참고

Remove spring.session.store-type in favor of a defined order for which implementation will win when multiple are available · Issue #27756 · spring-projects/spring-boot · GitHub

 

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에 저장된다. 성공!

H2 DB에 저장된 세션 테이블 2가지

 

 

다음 포스팅에서는 Spring Security를 사용한 일반 로그인을 다뤄 보려고 한다. See you next time!

'예제 > Session' 카테고리의 다른 글

4. Spring Security - 인증 과정 이해하기 (2)  (0) 2023.06.15
3. Spring Security - 인증 과정 이해하기 (1)  (0) 2023.05.27
1. 설정  (0) 2023.05.16
0. 프로젝트 목적  (0) 2023.05.16