[ODOP] 77일차 - SessionManagementFilter, ConcurrentSessionFilter

[ODOP] 77일차 - SessionManagementFilter, ConcurrentSessionFilter
💡
최신 버전에서는 아래의 방식과는 조금 다르게 권한설정을 진행한다.
아래의 설명들은 모두 구버전(2.6.7)을 기준으로 설명하고 있다

SessionManagementFilter

세션 관리

  • 인증 시 사용자의 세션 정보를 등록, 조회, 삭제 등의 세션 이력을 관리

동시적 세션 제어

  • 동일 계정으로 접속이 허용되는 최대 세션수를 제한

세션 고정 보호

  • 인증 할 때마다 세션 쿠키를 새로 발급하여 공격자의 쿠키 조작을 방지

ConcurrentSessionFilter

sessionManagementFilter 와 연결되어 동시적 세션 제어를 하고있다

  • 매 요청마다 사용자의 세션 만료 여부를 확인
  • 세션이 만료되었을 경우 즉시 만료처리

SessionManagementFilter 와 ConcurrentSessionFilter 의 동시적 세션 제어 흐름

  1. /login 현재 로그인 중인 사용자 외에 누군가가 로그인 시도
  2. 세션이 생성 되었다
    이전 사용자와 현재 로그인 한 사용자. 두개의 세션을 사용하고 있다
  3. SessionManagementFilter
    이 때 SessionManagementFilter 가 동작하며 최대 세션 허용 개수가 초과되었을 경우 이전 사용자의 세션을 만료시킨다
  4. 이전 사용자가 새로운 요청을 날린다
  5. ConcurrentSessionFilter
    ConcurrentSessionFilter 가 세션이 만료 되었는지 확인하고 로그아웃 처리를 진행한다
  6. 이전 사용자는 로그아웃 처리된 상태로 오류 메시지를 수신하게 된다
This session has been expired

세션들의 협업

SessionManagementFilter 와 ConcurrentSessionFilter 가 기존의 UsernamePasswordAuthenticationFilter 와 어떤 흐름으로 동작하게 되는지 알아보자

💡
상황 가정

현재 세션의 제한 설정을 부여하였다

user 1 의 최초 접근

1. 최초 유저가 로그인을 할 경우 동시적 세션 제어를 담당하는 클래스로 요청이 들어간다

ConcurrentSessionControlAuthenticationStrategy

  • 동시적 세션 제어를 담당하는 클래스
  • 현재 로그인 시도한 유저에게 세션이 몇 개 할당 되었는지 확인할 수 있다

현재는 최초 로그인이기 때문에 session count 는 0 이다

2. 세션 고정 보호를 진행하는 클래스로 요청이 들어간다

ChangeSessionIdAuthenticationStrategy

  • 세션 고정 보호를 담당하는 클래스
  • 새로운 세션ID 를 생성하며 새로운 세션 쿠키를 발급합니다

3. 사용자의 세션을 등록하고 저장합니다

RegisterSessionAuthenticationStrategy

  • 사용자의 세션을 등록하고 저장하는 역할을 담당하는 클래스
  • 이 클래스가 세션 정보를 저장 해 주었기 때문에 session count 는 1이 되었다

user 2 의 최초 접근

ConcurrentSessionControlAuthenticationStrategy 가 해당 유저가 접근한 세션의 갯수를 확인한다

  • 하지만 유저는 허용된 세션의 제한을 넘어서 접근을 시도하고 있다

이 때, 개발자가 지정한 전략에 따라 다르게 처리 된다

a. 인증 실패 전략인 경우

session count 가 초과될 경우 인증 자체를 실패 처리 하는 전략

  • SessionAuthenticationException 발생
  • 인증 실패
b. 세션 만료 전략인 경우

이전 유저의 세션을 만료시키고 새로운 요청 시 인증 오류를 리턴하게 만드는 전략

세션 제한이 1인 경우?

  1. 새로운 유저가 서버에 로그인 시도
  2. 기존 유저가 있는 경우 기존 유저의 세션을 만료시킨다
  3. 새로운 유저의 세션은 인증을 성공시킨다
  4. 기존 유저가 새로운 요청을 했을 때 만료된 세션이기 때문에 요청에 실패하고 인증 페이지로 넘어가게 된다

세션 제한이 2인 경우?

  • 위에서 정리한 user 1 의 최초 접근 과 똑같이 동작