[ODOP] 77일차 - SessionManagementFilter, ConcurrentSessionFilter
![[ODOP] 77일차 - SessionManagementFilter, ConcurrentSessionFilter](/content/images/size/w1200/2023/08/-----2023-08-01----10.29.26-10.png)
💡
최신 버전에서는 아래의 방식과는 조금 다르게 권한설정을 진행한다.
아래의 설명들은 모두 구버전(2.6.7)을 기준으로 설명하고 있다
아래의 설명들은 모두 구버전(2.6.7)을 기준으로 설명하고 있다
SessionManagementFilter
세션 관리
- 인증 시 사용자의 세션 정보를 등록, 조회, 삭제 등의 세션 이력을 관리
동시적 세션 제어
- 동일 계정으로 접속이 허용되는 최대 세션수를 제한
세션 고정 보호
- 인증 할 때마다 세션 쿠키를 새로 발급하여 공격자의 쿠키 조작을 방지
ConcurrentSessionFilter
sessionManagementFilter 와 연결되어 동시적 세션 제어를 하고있다
- 매 요청마다 사용자의 세션 만료 여부를 확인
- 세션이 만료되었을 경우 즉시 만료처리
SessionManagementFilter 와 ConcurrentSessionFilter 의 동시적 세션 제어 흐름
![](https://blog.pollra.com/content/images/2023/08/-----2023-08-13----9.29.55.png)
/login
현재 로그인 중인 사용자 외에 누군가가 로그인 시도- 세션이 생성 되었다
이전 사용자와 현재 로그인 한 사용자. 두개의 세션을 사용하고 있다 - SessionManagementFilter
이 때 SessionManagementFilter 가 동작하며 최대 세션 허용 개수가 초과되었을 경우 이전 사용자의 세션을 만료시킨다 - 이전 사용자가 새로운 요청을 날린다
- ConcurrentSessionFilter
ConcurrentSessionFilter 가 세션이 만료 되었는지 확인하고 로그아웃 처리를 진행한다 - 이전 사용자는 로그아웃 처리된 상태로 오류 메시지를 수신하게 된다
This session has been expired
세션들의 협업
SessionManagementFilter 와 ConcurrentSessionFilter 가 기존의 UsernamePasswordAuthenticationFilter 와 어떤 흐름으로 동작하게 되는지 알아보자
💡
상황 가정
현재 세션의 제한 설정을 부여하였다
현재 세션의 제한 설정을 부여하였다
![](https://blog.pollra.com/content/images/2023/08/-----2023-08-13----9.31.49.png)
user 1 의 최초 접근
1. 최초 유저가 로그인을 할 경우 동시적 세션 제어를 담당하는 클래스로 요청이 들어간다
ConcurrentSessionControlAuthenticationStrategy
- 동시적 세션 제어를 담당하는 클래스
- 현재 로그인 시도한 유저에게 세션이 몇 개 할당 되었는지 확인할 수 있다
현재는 최초 로그인이기 때문에 session count 는 0 이다
2. 세션 고정 보호를 진행하는 클래스로 요청이 들어간다
ChangeSessionIdAuthenticationStrategy
- 세션 고정 보호를 담당하는 클래스
- 새로운 세션ID 를 생성하며 새로운 세션 쿠키를 발급합니다
3. 사용자의 세션을 등록하고 저장합니다
RegisterSessionAuthenticationStrategy
- 사용자의 세션을 등록하고 저장하는 역할을 담당하는 클래스
- 이 클래스가 세션 정보를 저장 해 주었기 때문에 session count 는 1이 되었다
user 2 의 최초 접근
ConcurrentSessionControlAuthenticationStrategy 가 해당 유저가 접근한 세션의 갯수를 확인한다
- 하지만 유저는 허용된 세션의 제한을 넘어서 접근을 시도하고 있다
이 때, 개발자가 지정한 전략에 따라 다르게 처리 된다
a. 인증 실패 전략인 경우
session count 가 초과될 경우 인증 자체를 실패 처리 하는 전략
- SessionAuthenticationException 발생
- 인증 실패
b. 세션 만료 전략인 경우
이전 유저의 세션을 만료시키고 새로운 요청 시 인증 오류를 리턴하게 만드는 전략
세션 제한이 1인 경우?
- 새로운 유저가 서버에 로그인 시도
- 기존 유저가 있는 경우 기존 유저의 세션을 만료시킨다
- 새로운 유저의 세션은 인증을 성공시킨다
- 기존 유저가 새로운 요청을 했을 때 만료된 세션이기 때문에 요청에 실패하고 인증 페이지로 넘어가게 된다
세션 제한이 2인 경우?
- 위에서 정리한 user 1 의 최초 접근 과 똑같이 동작