어플리케이션을 재실행하면 로그인이 풀리는 이유는 세션이 내장 톰캣의 메모리에 저장되기 때문입니다.
메모리에 저장되다보니 내장 톰캣처럼 어플리케이션 실행 시 실행되는 구조에서는 배포할 때마다 톰캣이 재시작 될 수밖에 없습니다.
또한 만약 두대 이상의 서버에서 서비스하는 경우엔 톰캣마다 세션을 동기화 해주어야합니다.
세션 저장소를 사용하는 방법
1) 톰캣 세션사용- 일반적으로 선택되는 방식 - 두대 이상의 WAS가 구동되면 톰캣들간의 세션 공유를 위한 추가 설정이 필요함.
2) MySQL 데이터베이스를 세션 저장소로 사용
- 여러 WAS간의 공용 세션을 사용할 수 있는 방법 - 많은 설정이 필요하진 않지만 로그인 요청마다 DB IO가 발생할 수 있음
3) Redis,Memcached와 같은 메모리 DB를 세션 저장소로 사용
- B2C 서비스에서 가장 많이 사용함 - 외부 메모리 서버가 필요함
위 세가지 방법중에서 데이터 베이스를 세션 저장소르 사용하여 진행하겠습니다.
build.gradel에 다음과 같이 spring-session-jdbc를 추가하겠습니다.
implementation('org.springframework.session:spring-session-jdbc')
application.properties에 세션 저장소를 jdbc로 선택하도록 아래의 코드를 추가합니다.
spring.session.store-type=jdbc
h2-console에 접속하면 세션을 위한 테이블이 두개 생성된 것을 볼 수 있습니다.
JPA로 인해 자동으로 생성되었기 때문에 별도의 추가 설정은 필요가 없습니다.
이후 AWS로 배포하면 AWS의 RDS를 사용하게 되므로 세션이 풀리지 않습니다.