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
- 👉 “이미 만료된 세션으로 접근하는 사용자를 현관에서 차단하는 경비”