세션 제어 필터 : SessionManagementFilter, ConcurrentSessionFilter
1. SessionManagementFilter의 핵심적인 4가지 기능
1-1. 세션 관리 : 인증 시 사용자의 세션정보를 등록, 조회, 삭제 등의 세션 이력을 관리
1-2. 동시적 세션 제어 : 동일 계정으로 접속이 허용되는 최대 세션수를 제한
1-3. 세션 고정 보호 : 인증할 때 마다 세션쿠키를 새로 발급하여 공격자의 쿠키 조작을 방지
1-4. 세션 생성 정책 : Always, If_Required, Never, Stateless
2. ConcurrentSessionFilter의 기능
- 매 요청 마다 현재 사용자의 세션 만료 여부 체크
- 세션이 만료되었을 경우 즉시 만료 처리
- session.isExpired() == true ( : 세션 만료되었습니까? == 참)
- 로그아웃 처리
- 즉시 오류 페이지 응답, "This session has been expired"
* 위의 두개의 필터가 연계하여 처리하는 경우
예) 최대 세션 허용개수가 초과 -> SessionManagementFilter에서 이전 사용자 세션 만료 처리
-> ConcurrentSessionFilter가 매 요청마다 세션 만료 여부 체크
정리하면
SessionManagementFilter와 ConcurrentSessionFilter는 서로 연계하여 1-2.동시적 세션 제어 처리를 합니다.
아래의 그림에서 user1과 user2를 예시로 세션 처리 과정의 전반적인 흐름을 그림으로 살펴보겠습니다.
왼쪽의 상단에서 아래로 user1 -> user2 -> user1 순서대로 로그인 및 Get호출을 할 경우 세션이 처리되는 과정을 간략하게 글로 설명해보면 아래와 같습니다.
- user1 로그인
- -> ConcurrentSessionControlAuthenticationStrategy에서 세션 허용 개수 확인
- -> ChangeSessionIdAuthenticationStrategy에서 세션 고정 보호 기능 처리
- -> RegisterSessionAuthenticationStrategy에서 세션 정보 등록
- -> 인증 성공
- user2 로그인
- -> ConcurrentSessionControlAuthenticationStrategy에서 세션 허용 개수 확인 -> 허용 개수 초과 발생!
- 1번 전략
- 인증 실패 전략 -> SessionAuthenticationException 예외 발생
- -> 인증 실패
- 2번 전략 : 이떄 SessionManagementFilter와 ConcurrentSessionFilter가 연계해서 처리하게 됩니다.
- 세션 만료 전략 -> session.expireNow()로 기존 사용자 세션 만료
- -> 위에 동일 하게 user2의 세션 고정 보호 기능 처리 및 세션 정보 등록
- -> 인증 성공
- user1 Get호출 (세션 만료 전략으로 인해 user1 사용자의 세션은 만료 상태)
- -> session. isExpired() == true -> 세션 만료
- -> 로그인 실패 (This session has been expired)
'Spring Security' 카테고리의 다른 글
[Security] Success/Failure Handler Custom (인증성공, 인증실패 핸들러 커스텀) (2) | 2021.12.28 |
---|---|
[Security] 동시세션제어, 세션고정보호, 세션정책 (0) | 2021.12.08 |
[Security] Remember Me 인증 필터 (RememberMeAuthenticationFilter) (0) | 2021.10.05 |
[Security] Logout 처리 필터 (LogoutFilter) (0) | 2021.10.04 |
[Security] Form Login 인증 필터 (UsernamePasswordAuthenticationFilter) (0) | 2021.10.04 |