[Spring Security] 인증 영속성

🔐 스프링 시큐리티

  1. 기본 용어
  2. 아키텍처
  3. 인증 아키텍처
  4. 인증 영속성
  5. 예외 처리
  6. 폼 기반 인증
  7. 기억하기 인증
  8. 인증 간 요청 저장
  9. 인가 아키텍처
  10. 요청 수준 인가 & 메소드 수준 인가

🌞 SecurityContextRepository

SecurityContextRepository

SecurityContextRepository 는 스프링 시큐리티에서 사용자가 인증을 한 이후 요청에 대해 계속 사용자의 인증을 유지하기 위해 사용되는 클래스다.

🚝 HttpSessionSecurityContextRepository

HttpSessionSecruityContext 를 저장한다.

💌 RequestAttributeSecurityContextRepository

ServletRequestSecurityContext 를 저장한다. 단일 요청 내에서는 SecurityContext 가 유효하다. (새로운 요청시 X)

🏠 NullSecurityContextRepository

세션을 사용하지 않는 인증(JWT, OAuth2) 일 경우 사용하며 컨텍스트 관련 아무런 처리를 하지 않는다.

🐠 DelegatingSecurityContextRepository

DelegatingSecurityContextRepositorySecurityContext 를 여러 개의 SecurityContextRepository 위임 객체에 저장하고, 지정된 순서대로 임의의 위임 객체에서 보안 컨텍스트를 가져올 수 있도록 한다.

이러한 방식으로 RequestAttributeSecurityContextRepositoryHttpSessionSecurityContextRepository 를 동시에 사용할 수 있도록 설정할 수 있다.

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 가 자동으로 구성되어 사용되고, RequestAttributeSecurityContextRepositoryHttpSessionSecurityContextRepository 에 위임한다.)

👜 SecurityContextHolderFilter

SecurityContextHolderFilterSecurityContextRepository 에서 SecurityContext 를 가져와 SecurityContextHolder 에 설정하는 필터다.

SecurityContextHolderFilter

SecurityContextPersistenceFilter 와 달리, SecurityContextHolderFilterSecurityContext 를 불러오기만 하고 저장하지 않는다. 즉, 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