작성
·
186
·
수정됨
1
강의 교안의 동시 세션제어필터 로직의 흐름도 그림에서
SessionManagementFilter가 세션 만료 설정 플래그를 설정하는 그림에서 혼동이 있어서 질문드립니다.
현재 스프링시큐리티 6 이후 기본동작에서는 SessionManagementFilter가 기본 동작하지 않는 것으로 알고 있습니다. 실제로 세션 관련 설정을 이것저것 바꿔봐도 SessionManagementFilter가 필터체인에 추가되지 않더군요.
(실제로 강의에서도 이 부분을 언급하신 것을 확인했고, 공식문서에서도 확인했습니다.)
대신 UsernamePasswordAuthenticationFilter(정확히는 이것의 상위 클래스인 AbstractAuthenticationProcessingFilter)와 같은 곳에서 명시적으로 sessionAuthenticationStrategy를 호출하여 세션 관련 처리를 위임시키는 식으로 처리하는데요.
현시점 기본 동작 관점에서 보면 강의 교안에 나와있는 흐름도를 보면 SessionManagementFilter로 그림이 나와잇는 부분은 UsernamePasswordAuthenticationFilter와 같은 최초 로그인을 담당하는 필터에서 인증후 strategy를 통해 만료플래그가 설정되는 것으로 나타나게 하는 것이 좀 더 정확하지 않을까 싶어서 질문을 드립니다.
답변 1
1
네 맞습니다.
실제 세션 관련 처리는 인증을 시도하는 과정속에서 진행되고 있습니다.
이부분은 강의에서도 소개하고 있는 내용입니다.
다만 위의 흐름도에서 표현된 내용은 세션 관리 필터와 동시세션 필터 자체를 설명하기 위해 구성되었다고 이해하시면 됩니다.
SessionManagementFilter 가 동작하는 기준이 현재 세션에 SecurityContext 객체가 없는 상태에서 스레드로컬에는 인증객체 즉 Authentication 이 존재하는 경우에 실행되므로 현재 사용자가 요청 진행중에 인증을 했다고 가정하고 세션처리를 하고 있습니다.
if (!this.securityContextRepository.containsContext(request)) {
Authentication authentication = this.securityContextHolderStrategy.getContext().getAuthentication();
if (authentication != null && !this.trustResolver.isAnonymous(authentication)) {
// The user has been authenticated during the current request, so call the
// session strategy
try {
this.sessionAuthenticationStrategy.onAuthentication(authentication, request, response);
}
그렇기 때문에 반드시 UsernamePasswordAuthenticationFilter 에 의한 인증과정에서만 세션 처리를 하는 것이 아닌 세션에는 인증객체가 존재하지 않지만 인증은 진행중인 경우에 SessionManagementFilter 가 작동할 수 있으므로 그 가정하에 흐름들을 설명하고 있습니다.
물론 이런 경우는 그렇게 흔하지는 않을 것입니다.
그리고 세션 처리 관련 기능 및 클래스들이 기본적으로 SessionManagementFilter 에 의해 참조되는 것이기 때문에 전반적인 구조관점에서 위 흐름도를 보시면 될 것 같습니다.