- Spring Session Redis2021년 10월 09일 17시 14분 43초에 업로드 된 글입니다.작성자: jCurve728x90반응형
오늘은 프로젝트를 진행하면서 Spring Session으로 Redis를 적용한 내용을 간단히 정리하겠습니다.
우선 현재 사용자의 서버 인증 방식이 Session Cookie를 사용하고 있는데 추후 배포는 로드밸런싱으로 서버 다중화를 구성할 계회이었습니다.
세션의 경우 별다른 설정을 하지 않으면 서버의 메모리를 차지하여 사용자의 정보를 저장하게되는데 이렇게되면 서버를 여러대를 사용하는 환경에서 한 대의 서버에서 인증 받은 사용자의 세션은 해당 서버에만 세션이 존재하기 때문에 추후 로드밸런서의 요청이 다른 서버를 가리키게되면 세션이 풀리는 상황이 발생합니다.
그래서 저는 Redis를 사용해서 여러대의 서버가 Redis를 가리키는 방식으로 구성을 해보겠습니다.
실제 프로젝트 배포는 AWS ElasticCache를 사용할 예정인데 개발단계에서는 Docker로 Redis를 사용했습니다.
우선 spring session data redis 의존성을 추가 해줍니다.
그리고 세션을 저장할 redis에 관한 propery 설정을 해주기 전에 우선 docker에서 Redis image를 pull 받아서 실행 시켜줍니다.
이후 redis 설정을 해주는데 redis의 default port번호로 지정해주겠습니다.
이제 Spring에게 기존 tomcat의 httpsession을 Redis로 바꾸겠다고 알려주어야 합니다.
Redis 설정 파일을 만들고 @EnableRedisHttpSession을 사용해서 Redis에 세션을 저장하겠다고 알려주게됩니다.
@Bean으로 등록할 RedisConnectionFactory로는 유명하게 Jedis랑 Lettuce가 있는데 저는 Lettuce를 사용했습니다.
이 두 개의 성능 비교에 관련한 좋은 블로그가 많으니 여기서는 언급하지 않겠습니다.
(https://jojoldu.tistory.com/418)
@EnableRedisHttpSession을 들여다 보면
@Configuration의 proxyBeanMethods를 false를 설정해서 litemode로 동작하게 설정한 것을 볼 수 있네요
lite mode는 bean 등록시 cglib을 사용하지 않는 것인데 이는 의존관계가 있는 bean 메서드 동작시 동일 메서드를 한 번만 실행시키는 것이 아니라 선언 개수 만큼 실행되게 되고 이에 관련해 속도가 조금 더 빠르다는 글을 보았습니다.
그리고 기본 30분을 default timeout으로 잡고 있다는 것도 확인할 수 있습니다.
이제 Spring은 session을 Redis에 저장해주게 되는데요 저는 Spring Security를 사용하고 있기 때문에
Spring Security의 SecurityContextPersistenceFilter가 SecurityContext를 HttpSession에 저장하는 시점에
Session을 Redis에 등록해줍니다.
이후 확인을 해보면 JSESSIONID가 아니라 SESSION이라는 값으로 session cookie가 넘어오는 것을 브라우저에서 확인할 수 있습니다.
이제 Docker로 Redis Cli로 접속해서 세션이 등록되었는지 확인해 보겠습니다.
저는 구글 계정으로 로그인 했기 때문에 세션을 보면 구글 이메일이 등록되는 것을 확인할 수 있습니다.
그럼
반응형'Spring' 카테고리의 다른 글
Spring Swagger - API 문서화 (0) 2021.10.11 JPA 반복문 쿼리 vs Batch Insert (0) 2021.10.10 Spring HandleMethodArgumentResolver로 반복적인 Session 연산 처리 (0) 2021.10.08 Spring 로깅 log4j2 (0) 2021.10.07 JWT Spring-Security-Test로 테스트시 인증정보 주입 (4) 2021.07.22 댓글