SecurityContextHolder, SecurityContext

SecurityContext

  • Authentication 객체가 저장되는 보관소를 말한다. 
  • 필요 시 언제든지 Authentication 객체를 꺼내서 쓸 수 있도록 제공되는 클래스 이다.
  • ThreadLocal에 저장되어 아무 곳에서나 참조가 가능하도록 설계함.
    • Thread 마다 고유하게 할당된 구역이 있는데 그것을 ThreadLocal 이라고 말함. 
  • 인증이 완료괴면 HttpSession에 저장되어 어플리케이션 전반에 걸쳐 전역적인 참조가 가능함.

SecurityContextHolder

 

  • SecurityContext 객체를 저장 하고 있는 공간을 말한다. 
  • 저장하는 방식에는 여러가지가 있다
    • MODE_THREADLOCAL : 각 각의 쓰레드 마다 SecurityContext 객체를 할당 하고 있는 것 (기본값으로 설정됨)
    • MODE_INHERITABLETHREADLOCAL : 메인 쓰레드와 자식 쓰레드는 하나의 SecurityContext를 유지하는 것을 말함.  
    • MODE_GLOBAL : 응용 프로그램에서 단 하나의 SecurityContext를 저장함. (Static 상태)
// SecurityConfig 클래스 내에 설정을 아래와 같이 잡으면 설정을 변경 할 수 있음. 

protected void configure(HttpSecurity http) throws Exception {
	SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}

 

  • SecurityContext 정보를 초기화 방법
SecurityContextHoler.clearContext(); // SecurityContext 기존 정보를 초기화함.

 

  • Authentication 객체를 꺼내는 방법 
//아래와 같은 방식으로 하면 Authentication 객체를 꺼낼 수 있음
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

// session에 저장된 값을 가져올 수 있음.
SecurityContext context = (SecurityContext)session.getAttribute(
									HttpSessionSecurityContextRepositoy.SPING_SECURITY_CONTEXT_KEY);
Authenticaion authentication1 = context.getAuthentication();

 


인증 및 보관되는 전체적인 흐름

 

 

  1. Login 폼에 유저정보를 입력하고 submit을 누름
  2. 해당 유저의 정보를 ThreadLocal에 저장을 함. 
  3. 서버에서는 해당 유저의 정보를 가지고 인증 과정을 거침.
  4. 인증 과정에서 인증을 실패한다면 쓰레드에 있는 정보를 초기화 시킴. 
  5. 성공시 ThreadLocal에 있는 유저정보를 SecurityContextHolder에 저장시킴.
  6. 이후 HttpSession에 "SPRING_SECURITY_CONTEXT" 라는 이름으로 저장함. 

'Backend > Security' 카테고리의 다른 글

AuthenticationManager, AuthenticationProvider  (0) 2023.01.22
SecurityContextPersistenceFilter  (0) 2023.01.21
Authentication  (0) 2023.01.18
필터 초기화와 다중 보안 설정  (0) 2023.01.18
DelegatingFilterProxy, FilterChainProxy  (0) 2023.01.18