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는 수동 저장 필요.