세션 제어 필터인 SessionManagementFilter 와 ConcurrentSessionFilter 의 자세한 동작구조를 알아본다.
SessionManagementFilter .
-
세션관리 : 인증 시에 사용자의 세션정보를 등록, 조회, 삭제 등의 세션 이력 관리
-
동시적 세션 제어 : 동일 계정으로 접속이 허용되는 최대 세션 수 제한
-
세션 고정 보호 : 인증할 때 마다 세션 쿠키를 새로 발급하여 공격자의 쿠키 조작 방지
-
세션 생성 정책
ConcurrentSessionFilter .
-
매 요청 마다 사용자의 세션 만료 여부 체크
-
만료되었을 경우 즉시 만료 처리시킴
session.isExpired() == true 일 경우
-
로그아웃 처리
-
즉시 오류 페이지 응답해 줌, "This session has bean expired"
즉, ConcurrentSessionFilter 는 SessionManagementFilter 와 함께 동시적 세션 제어를 한다.
큰 틀에서 보자 .
예는 동시적 세션제어 전략 중, 이전 사용자 세션 만료 전략.
-
사용자의 인증시도 시 SessionManagementFilter 가 작동
-
최대 세션 허용 개수 초과 시 이전 사용자 세션 만료 , session.expiredNow()
-
이전 사용자가 같은 계정으로 자원 접근시도
-
ConcurrentSessionFilter가 SessionManagementFilter의 세션 만료 여부 확인, session.isExpired()
-
만료시 Logout 처리 후 오류 페이지 응답 "This session has bean expired"
조금 더 자세히 .
ConcurrentSessionFilter 와 SessionManagementFilter와 연계된 클래스들의 전반적 처리과정
http.sessionManagement().maximumSessions(1) 이라고 가정.
-
user1이 인증시도
-
UsernamePasswordAuthenticationFilter가 SessionManagementFilter호출
-
ConcurrentSessionControlAuthenticationStrategy 클래스가 session count를 확인 > 0
-
ChangeSessionIdAuthenticationStrategy 클래스가 session.changeSessionId() 를 실행
-
RegisterSessionAutheticationStarategy 클래스가 세션정보를 등록 > 1 하고 인증에 성공
-
user2 가 인증시도
-
SessionManagementFilter 작동
-
ConcurrentSessionControlAuthenticationStartegy 클래스가 session count 를 확인 > 1 , 즉 sessionCount == maxSessions
-
현재 로그인 차단 전략일 경우 SessionAuthenticationException 발생
-
인증실패(아마 UsernamePasswordAuthenticationFilter에서 AuthenticationFailureHandler를 작동하는 듯)
-
이전 사용자 세션 만료 전략일 경우 이전 세션에 대해 session.expireNow() 시키고 인증 성공(아마 UsernamePasswordAuthenticationFilter에서 AuthenticationManager > AuthenticationProvider > AuthenticationSuccessHandler 로 넘어가는 듯함)
-
ChangeSessionIdAuthenticationStrategy 가 session.changeSessionId()
-
RegisterSessionAuthenticationStrategy 가 session 정보 등록 > 2
-
user1 이 다시 자원접근
-
ConcurrentSessionFilter가 SessionManagementFilter 의 session 만료여부 확인 session.isExpired()
-
만료확인 후 Logout처리 (LogoutFilter > LogoutHandler 중 SecurityContextLogoutHandler > LogoutSuccessHandler 중 SimpleUrlLogoutSuccessHandler 작동인듯)
-
응답으로 This session has bean expired
'springframework > 시작하자SpringSecurity' 카테고리의 다른 글
12.ExceptionTranslationFilter, RequestCacheAwareFilter (0) | 2020.09.21 |
---|---|
11. 권한 설정과 표현식 (0) | 2020.09.21 |
9.세션 동시 제어 / 세션 고정 보호 / 세션 정책 (0) | 2020.09.21 |
8.AnonymousAuthenticationFilter (0) | 2020.09.21 |
7.RememberMeAuthenticationFilter (0) | 2020.09.19 |