Spring Security - SecurityContextHolder 와 SecurityContext

목차

참고

Spring Security - SecurityContextHolder 와 SecurityContext

인증을 진행하면서 생성된 Authentication 객체는 SecurityContext 객체 내에 저장된다.

저장된 Authentication 객체를 저장하고 가져오기 위해서 SecurityContext는 getAuthentication 메소드와 setAuthentication 메소드를 제공한다.

SecurityContext.java

public interface SecurityContext extends Serializable {
Authentication getAuthentication();
void setAuthentication(Authentication authentication);
}

SecurityContext 인터페이스의 대표적인 구현체로는 SecurityContextImpl 클래스가 있다.

SecurityContextImpl.java

SecutiryContextHolder

SecurityContext를 ThreadLocal에 저장하기 위한 객체

SecurityContextHolder 내에는 ThreadLocal 객체를 가지고 있고, 이 ThreadLocal 객체에 SecurityContext 객체를 저장한다. SecurityContextHolder 가 ThreadLocal 에 SecurityContext 를 저장하는 전략은 3가지가 있다.

| |

  • MODE_THREADLOCAL

    • 한 스레드당 securityContext를 저장하고 접근이 가능하다
  • MODE_INHERITABLETHREADLOCAL

    • 메인 스레드와 자식 스레드에서 동일한 SecurityContext를 갖고 접근이 가능하다
  • MODE_GLOBAL

    • 응용 프로그램내에서 단 하나의 SecurityContext를 저장하고 모두 접근이 가능하다.

SecurityContextHolder.java

SecurityContextHolder는 ThreadLocal에 SecurityContext 객체를 저장하거나 가져오기 위해 setContext 메소드와 getContext 메소드를 제공한다.

// SecurityContext 객체를 ThreadLocal에 저장한다.
SecurityContextHolder.setContext(securityContext);
// ThreadLocal에 저장된 SecurityContext 객체를 가져온다.
SecurityContext securityContext = SecurityContextHolder.getContext();

SecurityContextHolder 내에는 SecurityContextHolderStrategy 객체를 가진다. 바로 이 SecurityContextHolderStrategy 기본 구현체로 ThreadLocalSecurityContextHolderStrategy 가 있고 해당 객체내에 ThreadLocal 객체가 존재한다.

ThreadLocalSecurityContextHolderStrategy.java

Share