스프링 시큐리티의 예외처리를 진행하기 위해 필터를 만들었다.
그런데 에러가 났다.
Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Unsatisfied dependency expressed through method 'setFilterChains' parameter 0: Error creating bean with name 'securityFilterChain' defined in class path resource [com/sparta/nbcamptodo/config/WebSecurityConfig.class]: Failed to instantiate [org.springframework.security.web.SecurityFilterChain]: Factory method 'securityFilterChain' threw exception with message: The Filter class com.sparta.nbcamptodo.security.JwtAuthorizationFilter does not have a registered order
Caused by: java.lang.IllegalArgumentException: The Filter class com.sparta.nbcamptodo.security.JwtAuthorizationFilter does not have a registered order
이다. 예외처리를 위해 만든 필터가 JwtAuthorizationFilter 이전에 사용되는 필터인데 AuthorizationFilter가 등록이 되지 않아서 사용할 수 없다는 것 같다.
http.addFilterBefore(exceptionHandlerFilter(), JwtAuthorizationFilter.class); // 순서가 첫번째라 제일 위에 놔야 좋을 것 같은데 에러가 남
http.addFilterBefore(jwtAuthorizationFilter(), JwtAuthenticationFilter.class);
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);```
이런식으로 설정 했었다.
http.addFilterBefore(jwtAuthorizationFilter(), JwtAuthenticationFilter.class);
http.addFilterBefore(exceptionHandlerFilter(), JwtAuthorizationFilter.class); // 순서가 첫번째라 제일 위에 놔야 좋을 것 같은데 에러가 남
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
그래서 순서를 바꿨더니 잘 동작한다.
순서가 어떻든 ExceptionHandlerFilter가 JwtAuthorizationFilter 보다 아래 있으면
되는 모양이다.
이유는 모르겠다. 어차피 빈으로 등록해서 이미 생성해놓고 각각의 필터의 순서를 정해주는 것 같은데 왜 에러가 나는지 의문이다.
코드가 순서대로 진행이 되고,
AuthorizationFilter 기준으로 앞에 두어야 하기 때문에 AuthorizationFilter가 먼저 생성이 돼야 위치를 알기 때문이라면
왜 JwtAuthorizationFilter가 JwtAuthenticationFilter보다 앞에 넣어야 하는 필터인데 왜 코드 순서상 위에 두어도 실행이 되는가?
이유를 전혀 모르겠다.