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

SecurityContextHolderFilter
- SecurityContextRepository 를 사용하여 SecurityContext를 얻고 이를 SecurityContextHolder 에 설정하는 필터 클래스
- 이 필터 클래스는 SecurityContextRepository.saveContext()를 강제로 실행시키지 않음
- 사용자가 명시적으로 호출되어야 SecurityContext를 저장할 수 있음(이는
SecurityContextPersistenceFilter와 다른점)
- 인증이 지속되어야 하는지를 각 인증 메커니즘이 독립적으로 선택할 수 있게 하여 더 나은 유연성을 제공하고 HttpSession 에 필요할 때만 저장함으로써 성능을 향상시킨다
SecurityContext 생성, 저장, 삭제
- 익명 사용자
- SecurityContextRepository 를 사용하여 새로운 SecurityContext 객체를 생성하여 SecurityContextHolder 에 저장 후 다음 필터로 전달
- AnonymousAuthenticationFilter 에서 AnonymousAuthenticationToken 객체를 SecurityContext 에 저장
- 인증 요청
- SecurityContextRepository 를 사용하여 새로운 SecurityContext 객체를 생성하여 SecurityContextHolder 에 저장 후 다음 필터로 전달
- UsernamePasswordAuthenticationFilter 에서 인증 성공 후 SecurityContext 에 UsernamePasswordAuthentication 객체를 SecurityContext 에 저장
- SecurityContextRepository 를 사용하여 HttpSession 에 SecurityContext 를 저장
- 인증 후 요청
- SecurityContextRepository 를 사용하여 HttpSession 에서 SecurityContext 꺼내어 SecurityContextHolder 에서 저장 후 다음 필터로 전달
- SecurityContext 안에 Authentication 객체가 존재하면 계속 인증을 유지
- 클라이언트 응답 시 공통
- SecurityContextHolder.clearContext() 로 컨텍스트를 삭제 한다 (스레드 풀의 스레드일 경우 반드시 필요)
SecurityContextHolderFilter 흐름도

SecurityContextHolderFilter & SecurityContextPersistanceFilter

securityContext() API
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.securityContext(securityContext -> securityContext.requireExplicitSave(true));
return http.build();
}
CustomAuthenticationFilter & SecurityContextRepository
- 커스텀 한 인증 필터를 구현할 경우 인증이 완료된 후 SecurityContext 를 SecurityContextHolder 에 설정한 후 securityContextRepository 에
저장하기 위한 코드를 명시적으로 작성해 주어야 한다
- securityContextRepository 는 HttpSessionSecurityContextRepository 혹은 DelegatingSecurityContextRepository 를 사용하면 된다