RemeberMeAuthenticationFilter와 SessionManagementFilter의 관계에 대한 질문입니다.

해결됨
Henu 프로필

안녕하세요.

Spring Security RememberMeAuthenticationFilter 강의를 들으며 예제 코드를 따라하다가 궁금한 사항이 생겨 글을 남깁니다.

로그인 페이지를 통해 Remember Me 기능을 사용할 때

처음 로그인 후 JSESSIONID와 remeber-me 쿠기가 발급된 것을 확인하고 JSESSIONID를 소멸시킨 뒤 "/dashboard(인증된 사용자만 접근 가능)" URL을 요청하면

remember-me 쿠키가 있으므로RememberMeAuthenticationFilter을 통해 새로운 토큰(RememberMeAuthenticationToken)을 발급 받고 정상적으로 접근이 가능할 것 같았지만 그렇지 않았습니다.

=> 로그인 후 "/dashboard" 접근 --> JSESSIONID 제거 --> 새로고침 시 인가 실패 ERROR 페이지 전환 --> 다시 새로고침시 "/dashboard" 접근

이유를 살펴보니 아래 첨부된 이미지와 같이 SessionManagementFilter에서 제공하는 동시성 제어 기능(maxSessionsPreventsLogin(true))을 사용하면 위와 같은 문제가 발생하는 것 같아 보였습니다.

[이미지에서는 maxSessionsPreventsLogin(false)로 나와 있지만 테스트 중에는 "true" 인자를 넘겨줬습니다.]

동시성 제어란 세션 수를 설정하거나, 기존 세션을 만료하지 않고, 새로운 세션에 대해 접근하지 못하도록 설정하는 기능으로 알고 있는데요. 이 기능이 Remember Me 기능과 어떤 연관이 있는지 궁금합니다.

또한 Remember Me 기능과 별개의 문제로 SessionManagementFilter에서 maxSessionsPreventsLogin(true)를 설정하고

"로그인 -> 로그아웃 -> 로그인 재시도"시 인증이 실패됩니다.

추측을 해보자면 Remember Me 기능을 사용해서 JSESSIONID를 한번 제거하고,  remember-me 쿠키를 통해 새로운 SESSION를 생성하는 것과

로그아웃 후 다시 로그인하여 새로운 SESSION을 생성하는 것이 SessionManagementFilter의 "동시성 제어" 규칙에 어긋나기 때문에 인증이 실패한다라고 생각하면 될까요?

[GitHub code link]

https://github.com/wdEffort/std-spring-security/blob/master/src/main/java/me/henu/stdspringsecurity/config/SecurityConfig.java

백기선 프로필
백기선 4달 전

설정만 보고 상황을 보면 그런 동작이 자연스러워 보이네요.

브라우저에서 기존 세션 id를 임의로 삭제하시면, 서버에선 최대 세션 개수를 1개로 정해놨고 (아직 그 세션이 서버 입장에선 유효한 상태겠죠.), 이후 넘치는 세션은 막도록 설정을 하셨으니, remember-me를 통해 세션을 새로 만들려고 할 때 에러가 나겠네요. 자세한건 필터들에 디버거 걸어놓고 통해 살펴보시면 좋을거 같습니다.

Henu 프로필
Henu 4달 전

답변 감사드립니다. 

그렇다면 이러한 경우를 해결하기 위해서는 SessionManagementFilter의 "동시성 제어" 기능을 사용하지 않고 Remeber Me를 구현하는 방법이 있겠네요.  

하지만 동시성 제어를 사용하지 않으므로 발생할 수 있는 이슈들에 대해 고민을 하며 개발을 해야되겠네요.

지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스