Spring-Security
SecurityContext & SecurityContextHolder
neal89
2025. 5. 23. 23:22
1. SecurityContext란?
- SecurityContext는 현재 인증된 사용자의 Authentication 객체를 저장하는 보안 컨테이너입니다.
- 여기에는 인증된 사용자의 신원(Principal), 인증 증명(Credentials), 그리고 권한 목록(Authorities) 같은 중요한 보안 정보가 담겨 있습니다.
- 애플리케이션의 요청 처리 동안 현재 사용자의 보안 상태를 유지하는 역할을 합니다.
2. SecurityContextHolder란?
- SecurityContextHolder는 애플리케이션 어디서나 SecurityContext에 접근할 수 있도록 관리하는 핵심 클래스입니다.
- 쉽게 말해, SecurityContext를 저장하는 저장소 또는 관리자 역할을 합니다.
- SecurityContextHolder는 다양한 저장 전략(Storage Strategy)을 지원하는데, 대표적으로 다음 세 가지가 있습니다:저장 모드 설명
MODE_THREADLOCAL 기본값, 각 스레드별로 독립된 보안 컨텍스트를 저장합니다. (웹 환경 적합) MODE_INHERITABLETHREADLOCAL 부모 스레드에서 자식 스레드로 보안 컨텍스트를 상속합니다. (멀티스레드 환경 유용) MODE_GLOBAL 애플리케이션 전역에서 단일 컨텍스트를 사용합니다. (단순한 환경에 적합) - 저장 전략은 SecurityContextHolder.setStrategyName() 메서드로 변경 가능합니다.
3. SecurityContext와 SecurityContextHolder 관계
- SecurityContext는 인증 정보를 담는 그릇이고,
- SecurityContextHolder는 그 그릇을 보관하고 관리하는 창고라고 볼 수 있습니다.
4. 필터를 통한 관리: SecurityContextPersistenceFilter vs SecurityContextHolderFilter
- SecurityContextPersistenceFilter (이전 기본 필터)
- 요청 시작 시 SecurityContextRepository(주로 세션)에서 SecurityContext를 불러와 SecurityContextHolder에 설정.
- 요청 완료 후 변경된 SecurityContext를 자동으로 세션에 저장함.
- SecurityContextHolderFilter (Spring Security 6 기본 필터)
- 요청 시점에 SecurityContextRepository에서 SecurityContext를 불러와 SecurityContextHolder에 설정.
- 하지만 요청 종료 시 자동으로 저장하지 않음.
- 개발자가 직접 saveContext()를 호출하거나, 설정에서 자동 저장을 활성화해야 함.
- 내부적으로 DelegatingSecurityContextRepository를 사용해 여러 저장소 전략(세션, 요청 속성 등)을 유연하게 지원.
5. 요약
구분 | 역할 및 특징 |
SecurityContext | 현재 인증된 사용자 정보를 담는 컨테이너. |
SecurityContextHolder | SecurityContext를 저장하고 전역 접근을 제공하는 관리자. 다양한 저장 전략 지원. |
저장 전략 | MODE_THREADLOCAL (기본), MODE_INHERITABLETHREADLOCAL, MODE_GLOBAL 등 |
관리 필터 | SecurityContextPersistenceFilter는 자동 저장, SecurityContextHolderFilter는 수동 저장 필요. |