[Spring Security] 인증 영속성
🔐 스프링 시큐리티
🌞 SecurityContextRepository

SecurityContextRepository 는 스프링 시큐리티에서 사용자가 인증을 한 이후 요청에 대해 계속 사용자의 인증을 유지하기 위해 사용되는 클래스다.
🚝 HttpSessionSecurityContextRepository
HttpSession 에 SecruityContext 를 저장한다.
💌 RequestAttributeSecurityContextRepository
ServletRequest 에 SecurityContext 를 저장한다. 단일 요청 내에서는 SecurityContext 가 유효하다. (새로운 요청시 X)
🏠 NullSecurityContextRepository
세션을 사용하지 않는 인증(JWT, OAuth2) 일 경우 사용하며 컨텍스트 관련 아무런 처리를 하지 않는다.
🐠 DelegatingSecurityContextRepository
DelegatingSecurityContextRepository 는 SecurityContext 를 여러 개의 SecurityContextRepository 위임 객체에 저장하고, 지정된 순서대로 임의의 위임 객체에서 보안 컨텍스트를 가져올 수 있도록 한다.
이러한 방식으로 RequestAttributeSecurityContextRepository 와 HttpSessionSecurityContextRepository 를 동시에 사용할 수 있도록 설정할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
// ...
.securityContext((securityContext) -> securityContext
.securityContextRepository(new DelegatingSecurityContextRepository(
new RequestAttributeSecurityContextRepository(),
new HttpSessionSecurityContextRepository()
))
);
return http.build();
}
스프링 시큐리티 6에서 위 예시는 기본 설정이다. (별도의 설정을 하지 않아도 DelegatingSecurityContextRepository 가 자동으로 구성되어 사용되고, RequestAttributeSecurityContextRepository 와 HttpSessionSecurityContextRepository 에 위임한다.)
👜 SecurityContextHolderFilter
SecurityContextHolderFilter 는 SecurityContextRepository 에서 SecurityContext 를 가져와 SecurityContextHolder 에 설정하는 필터다.

SecurityContextPersistenceFilter 와 달리, SecurityContextHolderFilter 는 SecurityContext 를 불러오기만 하고 저장하지 않는다. 즉, SecurityContextHolderFilter 를 사용할 때는 SecurityContext 를 명시적으로 저장해야 한다.
1
2
/* SecurityContextPersistenceFilter 를 사용해 SecurityContextHolder 설정 */
SecurityContextHolder.setContext(securityContext);
위 코드는 아래와 같이 바뀌어야 한다.
1
2
3
/* SecurityContextHolderFilter 를 사용해 SecurityContextHolder 설정 */
SecurityContextHolder.setContext(securityContext);
securityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse); // 명시적으로 SecurityContext 저장
SecurityContextPersistenceFilter 는 Deprecated 되었다.
참고
Leave a comment