-
카테고리
-
세부 분야
백엔드
-
해결 여부
해결됨
RemeberMeAuthenticationFilter와 SessionManagementFilter의 관계에 대한 질문입니다.
20.05.14 23:59 작성 조회수 247
0
안녕하세요.
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]
답변을 작성해보세요.
1
Henu
질문자2020.05.15
답변 감사드립니다.
그렇다면 이러한 경우를 해결하기 위해서는 SessionManagementFilter의 "동시성 제어" 기능을 사용하지 않고 Remeber Me를 구현하는 방법이 있겠네요.
하지만 동시성 제어를 사용하지 않으므로 발생할 수 있는 이슈들에 대해 고민을 하며 개발을 해야되겠네요.
1
백기선
지식공유자2020.05.15
설정만 보고 상황을 보면 그런 동작이 자연스러워 보이네요.
브라우저에서 기존 세션 id를 임의로 삭제하시면, 서버에선 최대 세션 개수를 1개로 정해놨고 (아직 그 세션이 서버 입장에선 유효한 상태겠죠.), 이후 넘치는 세션은 막도록 설정을 하셨으니, remember-me를 통해 세션을 새로 만들려고 할 때 에러가 나겠네요. 자세한건 필터들에 디버거 걸어놓고 통해 살펴보시면 좋을거 같습니다.
답변 2