기타/문제 해결

Redis 를 통한 세션 동기화

펭귄힝 2024. 6. 28. 01:38

 

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 서버를 확인해보면 세션 값이 잘 저장되어 있다.

 

 

 

 

 

 

 

 

 

 

참고 자료