작성
·
69
·
수정됨
0
안녕하세요. 스프링 시큐리티 완전 정복 6.x 버전 잘 들었습니다.
궁금한 점 이 있는데요.
세션 클러스터링을 통해서 redis를 적용하면 세션이 tomcat -> rediss로 변경되는 부분 확인하였고, 잘 동작되는 것도 확인하였습니다.
궁금한 점은 단일 서버일 때 중복 로그인 설정을 하면 session 체크를 ConcurrentSessionFilter에서 하는 것으로 알고 있는데, 세션 클러스터링을 적용하면 동시 세션을 어떻게 체크하는지 궁금하고, 이것을 제어하기 위해 설정이 추가로 필요한지 궁금합니다.
단일 서버일 경우 sessionManagement를 통해서 maximumSessions(1) 인 것을 체크를 하게 되는데, 세션 클러스터링을 적용할 경우 이 값을 어떻게 공유하면서 처리하는지 궁금합니다.
감사합니다.
답변 2
0
아래 답변을 참고하시면 됩니다.
한가지 부연 설명을 드리자면 세션에서 키는 세션 아이디입니다.
세션 아이디가 각 서버가 아닌 세션서버에 저장된다는 것이 핵심입니다.
그런데 만약 시큐리티 코드 중 세션 아이디 자체를 세션 서버가 아닌 별도의 메모리에 저장하고 관리하는 식으로 되어 있을 경우에는 세션 클러스터링이 되어 있어도 각 서버마다 세션아이디가 참조되는 상황이 발생 할 수 있습니다.
그렇지 않고 세션 아이디를 무조건 세션서버로 부터 가지고 와서 어떤 동작을 하도록 되어 있다면 문제가 되지 않습니다.
그 부분은 코드를 디버깅 하시면서 어디에서 세션아이디를 참조하고 있는지를 확인해 보시면 됩니다
0
안녕하세요, 인프런 AI 인턴입니다.
박태영님, 스프링 시큐리티와 관련하여 질문 주신 세션 클러스터링 환경에서의 중복 로그인 체크에 대해 답변 드리겠습니다.
Spring Session을 이용하여 Redis와 같은 외부 저장소를 사용하게 되면, 세션 데이터를 어플리케이션 서버가 아닌 Redis에 저장하게 됩니다. 이렇게 하면 여러 서버가 세션 데이터를 공유할 수 있어 세션 클러스터링이 가능해지죠.
단일 서버 환경에서 ConcurrentSessionFilter를 이용해 세션을 체크하던 것과 유사하게, 여러 서버가 세션 상태를 공유하게 되면서도 동일한 방식으로 maximumSessions를 통해 최대 세션 수를 제한할 수 있습니다. 이를 위해 추가적인 설정을 할 필요 없이 Spring Session이 Redis와 같은 세션 저장소에 대한 관리를 자동으로 수행하므로 같은 환경에서 최대 세션 수를 확인하고 관리하게 됩니다.
따라서, 단일 서버에서 사용했던 sessionManagement 설정이 클러스터링 환경에서도 유효하게 작동합니다. Redis에 저장된 사용자의 세션 데이터를 기반으로 동시 세션 수를 제한할 수 있습니다.
궁금한 점이 해결되었기를 바랍니다. 다른 궁금한 사항이 있다면 언제든지 질문해 주세요.
Spring Session 공식 문서도 참고해 보시면 도움이 될 것입니다.
감사합니다.