인프런/스프링 시큐리티 완전 정복 [6.x 개정판]

14) 세션관리 - SessionManagementFilter / ConcurrentSessionFilter

backend dev 2024. 10. 23.

SessionManagementFilter 

 

• 요청이 시작된 이후 사용자가 인증되었는지 감지하고, 인증된 경우에는 세션 고정 보호 메커니즘을 활성화하거나

동시 다중 로그인을 확인하는 등 세션 관련 활동을 수행하기 위해 설정 된

세션 인증 전략(SessionAuthenticationStrategy)을 호출하는 필터 클래스이다

 

• 스프링 시큐리티 6 이상에서는 SessionManagementFilter 가 기본적으로 설정 되지 않으며

세션관리 API 를 설정을 통해 생성할 수 있다

 

 

 

세션 구성 요소

 

ConcurrentSessionFilter

[동시 세션 제어]

 

• 각 요청에 대해 SessionRegistry에서 SessionInformation 을 검색하고 세션이 만료로 표시되었는지 확인하고 만료로 표시된 경우 로그아웃 처리를 수행한다(세션 무효화)

 

• 각 요청에 대해 SessionRegistry.refreshLastRequest(String)를 호출하여 등록된 세션들이 항상 '마지막 업데이트' 날짜/시간을 가지도록 한다

 

 

흐름도

사용자가 인증요청을 해서 세션이 증가함 [ 기본값인 사용자 세션 강제 만료를 기준으로 그린 흐름도 ]

 

세션 허용 개수 초과가 되어서 SessionManagementFilter가 가장 오래된 세션을 만료 설정한다. 

[만료를 한것은 아니고, 만료되어야하는 세션이라고 설정한것이라고 보면 된다. ]

 

해당 세션을 가진 클라이언트[해당 세션의 ID를 가지고 request를 한 클라이언트]가 request하려고할때 ConcurrentSessionFilter는 다음과 같은 동작을 한다.

 

• 각 요청에 대해 SessionRegistry에서 SessionInformation 을 검색하고 세션이 만료로 표시되었는지 확인하고 만료로 표시된 경우 로그아웃 처리를 수행한다(세션 무효화)

 

• 각 요청에 대해 SessionRegistry.refreshLastRequest(String)를 호출하여 등록된 세션들이 항상 '마지막 업데이트' 날짜/시간을 가지도록 한다

 

 

 

시퀀스 다이어그램

 

[두명의 user는 같은 아이디로 로그인을 시도한다고 가정, max 세션갯수는 1로 가정 ]

user1 request를 하면 UsernamePasswordAuthenticationFilter가 인증을 수행한다. 

 

ConcurrentSessionControlAuthenticationStrategy 가 동시세션제어를 하는데

그 클래스를 이용하여 현재 session count를 확인한다.

 

ChangeSessionIdAuthenticationStrategy를 이용하여 세션고정보호를 위해 세션아이디를 바꿔준다.

 

RegisterSessionAuthenticationStrategy를 이용하여 세션 정보를 등록한다.

 

 

user2가 로그인 시도를 하게된다. 

현재 세션의 갯수가 max 세션갯수와 같을때

 

인증시도 차단 전략인 경우 SessionAuthenticationException을 반환해주고 인증실패가 된다.

 

세션 만료전략인 경우 이전 사용자의 세션 [ 오래된 세션 ] 을 만료 설정해준다.

그리고 user2의 세션을 등록하는 로직으로 이어진다.

 

그렇게했을때 

user1은 다시 로그인하려고했을때 세션이 만료되면서 로그아웃된다. 

 

댓글