경주장

[스프링 시큐리티 주요 아키텍처 이해] SecurityContext 본문

스프링/스프링 시큐리티

[스프링 시큐리티 주요 아키텍처 이해] SecurityContext

달리는치타 2022. 2. 8. 15:52

SecurityContext

  • Authentication 객체가 저장되는 보관소
  • ThredLocal에 저장되어 아무 곳에서나 참조가 가능하도록 설계함
    • Authentication authentication = SecurityContextHolder.getContext().getAuthentication()

SecurityContextHolder

  • SecurityContext 객체 저장소
  • SecurityContext 객체 저장하는 방식
    • MODE_THREADLOCAL : 스레드당 SecurityContext 객체를 할당, Default
    • MODE_INhERITABLETHREADLOCAL : 메인 스레드와 자식 스레드에 관하여 동일한 SecurityContext를 유지
    • MODE_GLOBAL : 응용 프로그램에서 단 하나의 SecurityContext를 저장
  • SecurityContextHolder.clearContext() : SecurityContext 기존 정보 초기화

이런 SecurityContextHolder와 SecurityContext를 관리하는 SecurityContextPersistenceFilter 를 살펴보겠습니다.

SecurityContextPersistenceFilter 는 익명사용자의 요청, 인증 요청, 인증 이후 즉, 모든 요청에 대해 SecurityContext를 관리하는 역할을 합니다.

  • 익명 사용자
    • 새로운 SecurityContext 객체를 생성하여 SecurityContextHolder에 저장
    • AnoymousAuthenticationFiler에서 AnoymousAuthenticationToken 객체를 SecurityContext 에 저장
  • 인증 시
    • 새로운 SecurityContext 객체를 생성하여 SecurityContextHolder에 저장
    • UsernamePasswordAuthenticationFilter에서 인증 성공 후 SecurityContext에 UsernameAuthentication 객체를 SecurityContext에 저장 인증이 완료되면 Session에 SecurityContext를 저장
  • 인증 후
    • Session에서 SecurityContext를 꺼내어 SecurityContextHolder 에서 저장
    • SecurityContext안에 Authentication 객체가 존재하면 계속 인증을 유지
  • 최종 응답 시 공동
    • SecurityContextHolder.clearContext() - SecurityContext 정보 초기화

SecurityContextPersistenceFilter 는 SecurityContextHolder의 SecurityContext를 관리하고 SecurityContext안의 Authentication 객체의 생성과 SecurityContext의 세션 저장은 AuthenticationFilter에서 담당합니다.