포트폴리오/Eighteen

[트러블 슈팅] JwtFilter와 Security Config의 동작 순서

do_hyuk 2024. 10. 16. 15:08

1. 문제 상황

첫 번째 문제:
현재 JwtFilter에서 헤더에 토큰 유무와 유효성 검사를 통해 예외 처리를 하는 코드를 작성하였는데

Security Config에서 설정한 화이트 리스트 api 들도 JwtFilter를 거치면서 토큰이 없는데 유효성 검사가 동작하게 되면서

헤더에 토큰이 없는 회원 가입 상태에서도 에러가 던져졌다.

해결 시도

.addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider,objectMapper), UsernamePasswordAuthenticationFilter.class)

인증필터 전에 JwtFilter를 실행시키도록 설정해서 그런가 하고 .addFilterAfter()로 실행해 보아도 결과는 같았다.

 

1. addFilterAfter()가 내가 생각한 것과 다르게 동작하나?

2. 화이트리스트.permitAll()이 security config에 과정을 패스하는게 맞는지 재확인

결론

해결 시도 1번은 바보같은 행동이였다. 애초에 인증과정을 jwt로 하기 위해 인증 필터인 UsernamePasswordAuthenticationFilter 앞에 배치시켜야 하는데 그 부분에 문제가 있다 판단한게 실수였다.

 

그럼 뭐가 문제였냐 하면은 permitAll()에 대해서 잘못 생각하였다. permitAll()은 해당 요청에 대한 접근을 모든 사용자에게 허용하지만, 요청 처리 과정에서 필터들을 그대로 타게 된다. 따라서, 요청에 대한 인증정보가 없더라도(Security Context에 인증정보가 없더라도), 접근이 허용되는 것이고 필터를 타기 때문에 Exception을 던진다면, 에러가 잡히게 되는 것이다.

 


 

2. 문제 상황

두 번째 문제:
JwtFilter가 두 번 호출하는걸 log를 통해 발견하게 됨

해결 시도

디버깅을 해보았지만 이렇다할 정보를 찾지 못하였다. 결국 인터넷에서 비슷한 사례를 찾아보았다.

 

문제의 원인이였던 코드들이다....

JwtAuthenticationFilter
@Component <- 삭제...
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends OncePerRequestFilter {
	...
}
security config
.addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider,objectMapper), UsernamePasswordAuthenticationFilter.class)

 

결론

JwtFilter를 생성할 때 아무 생각 없이 @Component 를 추가하였는데, Security Config에서 new로 다시 생성하였기 때문에 꼬여버린 것이다. @Component를 삭제하여 해결하였다.


 

3. 문제 상황

세 번째 문제:
jwt 예외처리 과정에서 validate(token) 과 filter 사이에서 Exception 처리를 잘못하여 로그가 2번 호출되는 문제를 발견

 

해결

validate에서 커스텀 에러를 던지면 filter에서 해당 커스텀 에러를 catch해서 response로 전달하도록 수정하였다.