두가지의 순서는 생각보다 많은 차이가 있다. 하지만 서로 굉장히 밀접한 관계가 있기 때문에 동시에 설명하려고 한다.
CuncurrentSessionFilter
- 매 요청마다 현재 사용자의 세션 만료 여부 체크
- 세션이 만료되었을 경우 즉시 만료 처리
이러한 행위를 담당하는것이 CuncurrentSessionFilter 이다. 해당 세션이 만료가 되었는지 확인하고 만료가 되었다면 오류페이지를 응답시킴으로써 필터를 통과하지 못한다.
간단한 필터이기 때문에 이해는 어렵지 않지만 중요한것은 SessionManagementFilter와 연관이 되어있다는것이다.
어떻게 연관이 되어있는걸까 SessionManagementFilter 가 하는 과정에서 중요한 작업이 있다.
이글을 그냥 보고있는 독자는 SessionManagementFilter 가 갑자기 나타났다. 해당글을 보고 오는것을 추천한다.
https://latewalk.tistory.com/104
SessionManagementFilter(동시 세션 제어 / 세션 고정 보호 / 세션 정책)
latewalk.tistory.com
보고 왔다는 전제하로 이야기 해보겠다.
- 동일 접속자에 대해 빗대어 이야기를 해보려 한다. 일단 먼저 사용하던 사용자와 형재 접속하려는 사용자와 같다면 현재 사용자가 로그인을 하려 할때 필터를 거치다가 SessionManagermentFilter 에서 최대 세션 허용 갯수가 초과되었을 경우 이전의 사용자 세션을 만료 시키게 된다.
- 그렇다면 기존의 사용자의 세션이 만료상태로 변하게 되는데 이때 이전의 사용자는 계속해서 서비스를 이용하다가 인증 혹은 인가가 필요한 어딘가로 넘어가게 될것이다. 그럼 그때 서버에서는 또다시 세션을 관리하게 되는데 이때 만나는 필터가 바로 ConcurrentSessionfilter 이다. 해당 필터는 사용자의 세션 만료 상태를 확인하는데 SessionManagementFilter 가 만료를 시켰기 때문에 해당 사용자의 세션이 확인이 안된다.
- 그래서 해당 사용자를 로그아웃시키고 오류페이지를 응답하도록 만들게 되는것이다.
자 그럼 좀 더 정확하게 살펴보자
- 우리가 정말 자주 보았던 UsernamePasswordAuthenticationFilter 는 가장 먼저 ConcurrentSessionControlAuthenticationStrategy 라는 클래스를 호출한다. 해당 클래스는 동시적 세션 제어를 처리하는 클래스이다. 이 클래스는 해당 사용자로 인해 생성된 세션이 몇 개 인지 확인한다.
- 그 다음 ChangeSessionIdAuthenticationStrategy 클래스를 불러온다 이는 세션 고정 보호 처리하는 클래스이다.
기본값인 changeSessionID() 를 통해 새롭게 세션아이디를 저장한다 - 그 다음 RegisterSessionAuthenticationStrategy 클래스를 불러온다. 이 클래스는 새롭게 나온 세션을 등록하고 저장한다. 이때 세션 카운트를 올린다.
- 이제 부터 효과가 나타나기 시작한다. 동시 접속 제어를 하는 가장 대표적인 방법은 두가지 이다.
- 로그인을 불가능하게 하는 방법
- ConcurrentSessionControlAuthenticationStrategy 는 인증 실패 예외처리를 통해 아예 인증을 실패로 만든다.
- 기존 사용자를 로그아웃 시키는 방법
- 기존의 사용자를 session.expirNow() 함수를 통해 세션을 만료시킨다.
- 그 후 이전의 사용자와 같은 작업을 거치고 로그인이 완료된다.
- 로그인을 불가능하게 하는 방법
- 그럼 기존의 사용자는 인증이 필요한 어떠한 행위를 했을 경우 CuncurrentSessionFilter 는 해당 세션이 만료되었는지 확인하고 만료가 되었다면 로그아웃을 시키는 과정을 거친다.
정리
CuncurrentSessionFilter는 필터 자체의 기능만 본다면 간단한 기능을 가지고 있는 필터이다. 하지만 이 필터가 SessionManagementFilter 와 합쳐지면서 연관관계를 파악해야한다. 이런식으로 각자의 필터는 완전하게 떨어진것이 아닌 서로에게 영향이 있을수 있고 이를 파악하는것이 중요하다.
'Spring > 👨💻 SpringSecurity' 카테고리의 다른 글
AnonymousAuthenticationFilter (0) | 2023.06.26 |
---|---|
RememberMeAuthenticationFilter (0) | 2023.06.26 |
SessionManagementFilter(동시 세션 제어 / 세션 고정 보호 / 세션 정책) (0) | 2023.06.26 |
Logout (0) | 2023.06.26 |
CSRF (0) | 2023.06.26 |