본문 바로가기
Spring Security

[Spring Security 6.x] SecurityContext / SecurityContextHolder

by person456 2024. 6. 22.

 

목차

  1. Authentication
  2. SecurityContextHolder

 


1. Authentication

Authentication은 가장 기본적인 방식인 Form 인증을 예로 들었을 때, 사용자의 아이디와 패스워드를 기반으로

인증을 수행하고, 그에 따른 인가를 허용할 때 사용하는 객체이다.

해당 흐름도를 살펴보면 총 2번의 Authentication이 등장하는 데, 사용하는 클래스 및 자료의 구성 자체는 같으나

내부적으로 들어가는 속성에는 변화가 존재한다.

 

Principal과 Authentication은 각각 인터페이스로, Authentication은 Principal을 상속받은 인터페이스이다.

메서드의 세부적인 내용은 아래의 표와 같다.

   
getPrincipal() 인증 주체를 의미함.
인증 전에는 Username(아이디), 인증 후에는 UserDetails 객체가 될 수 있음.
getCredentials() 인증을 위한 자격 증명으로 주로 Password가 들어감.
getAuthorities() Principal에게 부여된 권한을 나타냄.
getDetails() 인증 요청에 대한 IP, 인증서 일련번호 등 세부적인 사항을 저장함
isAuthenticated() 인증 상태를 반환
setAuthenticated(boolean) 인증 상태를 설정

 

 

즉, 인증 전과 인증 후를 비교했을때 간략하게 Authentication은 다음과같은 상태를 유지한다고 볼 수 있다.

인증 전에는 username과 password가 각각 principal과 credentails에 저장되고 Authentication Manager에게 전달된 이후 Provider에 의해 인증이 수행된다.

성공적으로 인증이 마무리되면 개인정보와 같은 Credentails은 유출 위험을 막기 위해 빈 공간으로 초기화하고

UserDetails타입의 객체를 Principal에설정하여 반환하면 해당 객체가 SecurityContextHolder에 저장되는 것이다.

 

 

 


2. SecurityContextHolder

 

SecurityContextHolder는 사용자가 인증을 성공했을 때의 객체 ( Authentication 타입 )를 저장하는 저장 공간이라고 볼 수 있다.

하지만 모든 인증 성공 객체에 대해 SecurityContextHolder에 일괄 저장하는 것이 아닌, 내부적으로 SecurityContext에 Authentication 객체를 저장한 이후 SecurityContext 자체를 Holder에 저장하는 것이다.

 

해당 내용에 대한 정리는 아래의 표와 같다.

SecurityContext 기능
Authentication 저장 현재 인증된 사용자의 Authentication 객체를 저장함.
ThreadLocal 저장소 사용 SecurityContextHolder를 통해 접근되며 ThreadLocal 저장소를 사용해
각 스레드가 자신만의 보안 영역을 사용함.
어플리케이션 접근성 어플리케이션 어느 곳에서도 접근 가능하고 현재 사용자의 인증상태 확인이 가능함

 

SecurityContextHolder 기능
SecurityContext 저장 Authentication을 담은 SecurityContext 객체를 저장함.
전략 패턴 사용 다양한 저장 전략을 지원하기 위해 SecurityContextHolderStrategy 인터페이스를 사용함.
기본 전략 MODE_THREADLOCAL
전략 모드 직접 지정 SecurityContextHolder.setStrategyName("name")

 

Strategy 기능
MODE_THREADLOCAL 기본 모드이며, 각 스레드가 독립적인 보안 영역을 지님.
MODE_
INHERITABLETHREADLOCAL
부모 스레드로부터 자식 스레드로 보안 컨텍스트가 상속되며
스레드간 작업 분산 실행을 할 때 적합함.
MODE_GLOBAL 전역적인 단일 보안 컨텍스트를 사용하는 방법.

 

기본적으로는 THREADLOCAL을 통해 기본 전략을 내세우고 있다.

각각의 전략에 대해서 SecurityContextHolder 클래스 내부에 멤버로 정의되어 있는 모습을 확인할 수 있다.