[글쓰는 의도]
미니프로젝트 과정에서 스프링 시큐리티를 담당했다. JWT AccessToken을 인증하는 과정에서 분명 AuthenticationException 에러가 발생하면 AuthenticationEntryPoint가 동작해서 예외를 처리하기 마련인데 아무리 찾아봐도 내가 커스텀한 AuthenticationEntryPoint 는 동작하지 않았다.
[여러가지 해결방안]
AI와 열띤 토론을 한 결과 해결책은 다음과 같았다.
1. 커스텀한 예외가 AuthenticationException을 상속받지 못한 경우
public class BadTokenException extends AuthenticationException
2. Spring Bean으로 커스텀한 AuthenticationEntryPoint를 등록하지 않은 경우
@Bean
JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint(){
return new JwtAuthenticationEntryPoint();
}
3. filter chain 설정에 AuthenticationEntryPoint를 등록하지 않은 경우
@Configuration
public class SecurityFilterConfig {
private final JwtAuthenticationEntryPoint entryPoint;
@Bean
SecurityFilterChain http(HttpSecurity http) throws Exception {
http.exceptionHandling(handler -> handler.authenticationEntryPoint(entryPoint));
return http.build();
}
위 3가지 모두 만족을 시켰지만 포기하던 순간
[어찌저찌 해결]
문제는 커스텀한 필터체인을 등록하는 순서에 있었다. 나의 경우에는 jwtAuthenticationFilter을 통해 JWT 인증을 진행하고있었다. Spring Security에서 AuthenticationException이 발생한 경우 ExceptionTranslationFilter 에서 예외를 확인하고 AuthenticationEntryPoint 를 동작시킨다. 결국 ExceptionTranslationFilter 보다 jwtAuthenticationFilter가 먼저 동작을 했었기에 문제였던 것 같다.
http.addFilterAfter(jwtAuthenticationFilter, ExceptionTranslationFilter.class);
커스텀한 Filter을 ExceptionTranslationFilter 뒤에 추가하니 잘 동작하긴 한다. 프로젝트가 바쁘다는 핑계로 시큐리티를 겉핧기로만 공부를 하고있다. filter의 동작 과정과 Security의 인증 인가 방식을 제대로 공부해야할 것 같다.