인프런 커뮤니티 질문&답변

이상민님의 프로필 이미지

작성한 질문수

스프링 시큐리티 완전 정복 [6.x 개정판]

Redis 를 활용한 이중화 설정 - @EnableRedisHttpSession

RestAPI를 제공하는 서버에서 Redis + Session을 통해 인증을 시도하고 있는데 직렬화가 되지 않습니다.

작성

·

280

0

안녕하세요 강의 잘 보고 있습니다.

저는 지금 Rest API서버를 생성하고 인증을 하는 방식은 session으로 하고 session 저장소를 Redis로 옮겨 구현하고자 합니다.

 

그러나 강의와는 다르게 @EnableRedisHttpSession 어노테이션을 추가해도 Redis에 저장이 되지 않는 오류가 있는데 이를 어떻게 해결해야할지 모르겠어 질문을 드립니다.

 

Redis가 아닌 Memory에 저장을 하였을때는 정상 동작하였으며 디버깅을 통해 문제의 원인을 파악해본 결과 SecurityContextImpl 객체에 대한 직렬화를 수행해주는 클래스가 존재하지 않아 오류가 발생하는 듯 합니다.

 

혹시 이 문제에 대해 도움을 받을 수 있을까요?

 

문제상황을 작성해놓은 포스팅과 프로젝트의 압축파일을 첨부해드리도록 하겠습니다.

추가로 프로젝트 환경은 로컬에서 진행하였으며 H2 DB와 Redis를 사용하였습니다.

https://goto-pangyo.tistory.com/286
https://drive.google.com/file/d/1DccNwJWmUPBpe3KwsqxPp_VpYIAQRRaR/view?usp=sharing

 

 

답변 2

0

이상민님의 프로필 이미지
이상민
질문자

혹시 저와 같은 문제를 겪고 계신 분들이 계실까 글을 남깁니다.

 

결론부터 말씀드리면 직렬화를 하고자하는 클래스(세션에 저장하고자 하는 클래스)에서 Serializable인터페이스를구현하면 됩니다. 또한 제가 공식문서에서 찾아본 결과@EnableRedisHttpSession 어노테이션을 추가할 경우 sessionRepositoryFilter 가 추가됩니다. 그리고 해당 클래스는 Session 클래스를 한번 감싼것으로 기존의 http session 관련 메소드를 오버라이딩하여 기능을 커스터마이징이 가능합니다.(저 같은 경우에는 redis를 세션 저장소로 사용)

 

0

이상민님의 프로필 이미지
이상민
질문자

추가로 @EnableRedisHttpSession에 대해 궁금한 점이 있습니다.

 

해당 어노테이션을 사용하였을 경우 스프링이 RedisIndexedSessionRepository를 통해 Redis에 세션 저장을 자동으로 구현하는 듯한데

이는 UserNamePasswordAuthenticationFilter에서만 그런것인가요?

아니면 다음과 같이 사용자 정의 필터를 구현하고 인메모리에 세션 영속화를 하였을때도 Redis에 저장이 되는건가요?