MSA 에서 각각의 member-service 가 scale-out 된 상황에서 세션을 동기화 하는 방법에 대해 다뤄보려 한다.
이 게시물에서는 Redis 를 세션 서버로 이용할 것이다. Redis 를 설치하는 방법은 이전 게시물에서 찾아볼 수 있다.
프로젝트에 의존성을 추가해준다. redis 관련 의존성과 spring-session 을 추가해주면 된다.
여기서 spring-session 의 경우, 서블릿의 HttpSession 과 통합하여 좀 더 편리하게 redis 를 통해 세션을 관리하게 해준다.
설정 파일에 위와 같이 세션에 대한 설정 정보를 추가해준다.
spring-session 을 사용하기 때문에 기존에 있던 HttpSession 에서는 In-Memory 에서 세션을 저장하거나 조회하지 않고 설정된 Redis 서버로부터 세션을 저장하거나 조회해온다.
(위 사진에서는 redis 서버에 대한 설정 정보가 없지만 반드시 추가해주어야 한다.)
필자는 Spring Security에서 제공하는 폼 로그인 방식을 확장해서 사용하기 때문에 이 이상 건드리지 않아도 된다.
Spring Security 내부에서도 세션을 관리할 때 HttpSession 을 사용하기 때문이다.
간단한 테스트를 위해 member-service 의 홈 화면 접속 시 유저의 이름과 서버의 포트 번호가 출력되도록 해놓았다.
이렇게 두 개의 서버를 띄우고
첫 번째 서버에 로그인하지 않은 상태로 요청을 보낸다. 서버 포트와 함께 anonymousUser 라는 값이 출력된다.
이후 첫 번째 서버에서 로그인을 하고
다시 요청을 보내면 로그인한 유저의 닉네임이 잘 나온다.
두 번째 서버에 같은 요청을 보내면 똑같은 내용을 반환시켜주는 것을 확인할 수 있다.
redis 서버를 확인해보면 세션 값이 잘 저장되어 있다.
참고 자료
'기타 > 문제 해결' 카테고리의 다른 글
Spring @WebMvcTest 사용 시 Security 설정 제거하기 (0) | 2024.12.10 |
---|---|
Resilience4J의 CircuitBreak 호출 시 FeignClient 쿠키 값 전달 되지 않는 문제 해결 (0) | 2024.06.29 |
fegin client GET 메서드 요청 시 오류 해결 (0) | 2024.06.17 |
Feign Client 를 통해 요청 시 쿠키 값 유지하기 (0) | 2024.06.13 |
QueryDSL 과 Spring Cloud 의존성 충돌 문제 (0) | 2024.06.13 |