// 1번 방법 : 새로운 SecurityContext 생성
SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
securityContext.setAuthentication(authToken);
SecurityContextHolder.setContext(securityContext);
// 2번 방법 : 기존 SecurityContext 사용
SecurityContextHolder.getContext().setAuthentication(authToken);
대부분의 JWT 검증 필터 구현 코드를 찾아보면, 2번 방법을 사용하는 것으로 보여진다. 또한, 우리 프로젝트에서는 1번 방법으로 구현을 했었지만, 2번 방법으로 변경해도 아무런 문제가 없이 동작한다.
여기서 드는 의문은,
어느 시점에 SecurityContextHolder 에 SecurityContext 를 생성하고 넣어준 것인가?
1번 방법이 아닌 2번 방법을 사용하는 이유는 뭘까?
결론
2번 방식을 통해 SecurityContextHolder.getContext() 를 호출하여 기존 SecurityContext를 사용하는 방식으로 진행하게 되었다.
왜 2번을 선택했고 근거에 대해서 하나씩 찾아보자.
필터 체인의 동작
필터 체인이 어떻게 동작하는지 파악하고, 어디서 SecurityContext가 생성되는지 파악을 하는 것이 우선이라고 판단했다. 필터 체인이 어떻게 구성이 되어있는지 파악하기 위해 @EnableWebSecurity(debug = true) 을 SecurityConfig 클래스에 설정해준 후 확인해보자.
@Configuration
@RequiredArgsConstructor
@EnableWebSecurity(debug = true)
public class SecurityConfig {
// ...
}