새소식

반응형
Java/Spring

Spring Security ConcurrentSessionFilter, SessionManagementFilter

  • -
728x90
반응형

ConcurrentSessionFilter 와 SessionManagementFilter 는 세션 기반 보안과 관련 있지만, 역할과 책임이 명확히 다르다.

 

1️⃣ SessionManagementFilter

"이 요청의 세션 상태가 정상적인가?" 를 관리하는 필터이다.

SessionManagementFilter 는 사용자 로그인 인증 시점과 인증된 요청 진입 시에 동작한다.

SessionManagementFilter 는 사용자가 인증되었을 시점에 SessionAuthenticationStrategy 들을

실행시켜준다.

 

Spring Security 6 부터는 기본 설정에서 SessionManagementFilter 가 아닌 각 인증 필터(예: UsernamePasswordAuthenticationFilter) 가 직접 SessionAuthenticationStrategy 를 호출하는 방식으로 이동해서,

매 요청마다 세션을 강제로 읽지 않도록 개선되었다.

 

수행하는 주요 기능

✅ 1. 세션 고정 공격(Session Fixation) 방어

  • 로그인 성공 시
    • 기존 세션을 새 세션으로 교체 또는 세션 ID 변경
sessionManagement()
    .sessionFixation().changeSessionId();

 

✅ 2. 인증 이후 세션 정책 적용

  • 인증된 사용자가 새 요청을 보낼 때
  • 세션이 존재해야 하는지 / 생성 가능한지 판단
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)

 

✅ 3. 세션 무효 상태 감지

  • 이미 만료되었거나 invalid 된 세션으로 접근 시
  • 설정된 전략(SessionAuthenticationStrategy) 실행

 

✅ 4. Concurrent Session 제어와 연결점

  • Spring Security 에 maximumSessions() 설정이 있을 경우
    👉 내부적으로 ConcurrentSessionControlAuthenticationStrategy 호출

 

즉, SessionManagementFilter 는 "로그인 시점의 세션 정책 총괄 관리자" 이다.

 

🔁 동작 시점

시점 설명
로그인 성공 직후 세션 고정 방지, 신규 세션 발급
인증된 요청 진입 세션 상태 검증

 

2️⃣ ConcurrentSessionFilter

이미 존재하는 모든 세션에 대해, 요청이 들어올 때마다 해당 세션이 만료(expire) 되었는지 SessionRegistry 를 통해 조회한다.
ConcurrentSessionFilter 는 로그인 시점이 아니라 모든 요청마다 검사한다.

 

📌 핵심 역할

동시 로그인 제한(maximumSession)이 걸린 상태에서

👉 이미 만료 처리된 세션으로 요청이 들어왔는지 검사

 

수행하는 주요 기능

✅ 1. SessionRegistry 기반 세션 검증

  • 현재 요청의 세션 ID 기준으로 SessionRegistry 에서 세션 상태 검사

 

✅ 2. 만료된 세션이면 즉시 차단

  • 다른 로그인으로 인해 expire 처리된 세션이라면
    • 로그아웃 처리 (SecurityContextHolder 비움)
    • SessionInformationExpiredStrategy 실행

SessionManagementFilter 가 "특정 세션을 만료 상태로 표시" 했다면, ConcurrentSessionFilter 는 그 이후 들어오는 요청마다

세션 만료 상태를 보고 만료된 세션은 로그아웃 처리를 한다.

http
  .sessionManagement()
  .maximumSessions(1)
  .expiredUrl("/session-expired");

 

✅ 3. 요청 단위 필터

  • 로그인 시점 ❌
  • 모든 요청마다 검사 ⭕

 

🔁 동작 시점

시점 설명
매 요청마다 현재 세션이 유효한지 확인
동시 로그인 발생 후 이전 세션 차단

 

 

3️⃣ 둘의 차이 요약 (아주 중요)

구분 SessionManagementFilter ConcurrentSessionFilter
주 목적 세션 정책 적용 동시 로그인 세션 차단
실행 시점 인증 성공 시 + 요청 진입 시 모든 요청
세션 생성/교체
세션 만료 여부 검사 간접 직접
SessionRegistry 사용 간접 직접
maximumSessions 연관 정책 설정 실제 차단

 

4️⃣ Spring Security 6 기준 필터 체인 위치

SecurityContextHolderFilter
  ↓
LogoutFilter
  ↓
ConcurrentSessionFilter   ← 여기!
  ↓
SessionManagementFilter
  ↓
AuthenticationFilter

 

5️⃣ 한 문장으로 정리

  • SessionManagementFilter
    • 👉 “로그인 후 세션을 어떻게 만들고 유지할지 결정하는 관리자”
  • ConcurrentSessionFilter
    • 👉 “이미 만료된 세션으로 접근하는 사용자를 현관에서 차단하는 경비”
728x90
반응형
Contents