[글쓰는 의도]

 

 미니프로젝트 과정에서 스프링 시큐리티를 담당했다. 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의 인증 인가 방식을 제대로 공부해야할 것 같다.