인증 상태 영속성(4/13)

dev.hyjang·2024년 6월 15일

스프링 시큐리티

목록 보기
5/6

SecurityContextRepository

  • 스프링 시큐리티에서 사용자가 인증을 한 이후 요청에 대해 계속 사용자의 인증을 유지하기 위해 사용되는 클래스
  • 사용자 인증 -> 해당 사용자의 인증 정보와 권한이 저장 -> HttpSession을 통해 요청 간 영속이 이루어짐


SecurityContextHolderFilter

  • SecurityContextRepository 를 사용하여 SecurityContext를 얻고 이를 SecurityContextHolder 에 설정하는 필터 클래스
  • 이 필터 클래스는 SecurityContextRepository.saveContext()를 강제로 실행시키지 않음
  • 사용자가 명시적으로 호출되어야 SecurityContext를 저장할 수 있음(이는
    SecurityContextPersistenceFilter와 다른점)
  • 인증이 지속되어야 하는지를 각 인증 메커니즘이 독립적으로 선택할 수 있게 하여 더 나은 유연성을 제공하고 HttpSession 에 필요할 때만 저장함으로써 성능을 향상시킨다

SecurityContext 생성, 저장, 삭제

  1. 익명 사용자
  • SecurityContextRepository 를 사용하여 새로운 SecurityContext 객체를 생성하여 SecurityContextHolder 에 저장 후 다음 필터로 전달
  • AnonymousAuthenticationFilter 에서 AnonymousAuthenticationToken 객체를 SecurityContext 에 저장
  1. 인증 요청
  • SecurityContextRepository 를 사용하여 새로운 SecurityContext 객체를 생성하여 SecurityContextHolder 에 저장 후 다음 필터로 전달
  • UsernamePasswordAuthenticationFilter 에서 인증 성공 후 SecurityContext 에 UsernamePasswordAuthentication 객체를 SecurityContext 에 저장
  • SecurityContextRepository 를 사용하여 HttpSession 에 SecurityContext 를 저장
  1. 인증 후 요청
  • SecurityContextRepository 를 사용하여 HttpSession 에서 SecurityContext 꺼내어 SecurityContextHolder 에서 저장 후 다음 필터로 전달
  • SecurityContext 안에 Authentication 객체가 존재하면 계속 인증을 유지
  1. 클라이언트 응답 시 공통
  • SecurityContextHolder.clearContext() 로 컨텍스트를 삭제 한다 (스레드 풀의 스레드일 경우 반드시 필요)

SecurityContextHolderFilter 흐름도

SecurityContextHolderFilter & SecurityContextPersistanceFilter

securityContext() API

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
	http.securityContext(securityContext -> securityContext.requireExplicitSave(true)); 
    // SecurityContext 를 명시적으로 저장할 것이지 아닌지의 여부 설정, 기본값은 true 이다
// true 이면 SecurityContextHolderFilter, false 이면 SecurityContextPersistanceFilter 가 실행된다
	return http.build();
}

CustomAuthenticationFilter & SecurityContextRepository

  • 커스텀 한 인증 필터를 구현할 경우 인증이 완료된 후 SecurityContext 를 SecurityContextHolder 에 설정한 후 securityContextRepository 에
    저장하기 위한 코드를 명시적으로 작성해 주어야 한다
  • securityContextRepository 는 HttpSessionSecurityContextRepository 혹은 DelegatingSecurityContextRepository 를 사용하면 된다
profile
낭만감자

0개의 댓글