- [트러블 슈팅] JwtFilter와 Security Config의 동작 순서2024년 10월 16일 15시 08분 46초에 업로드 된 글입니다.작성자: do_hyuk728x90반응형
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로 전달하도록 수정하였다.
728x90반응형'포트폴리오 > Eighteen' 카테고리의 다른 글
[트러블 슈팅] redis 관련 문제 발생(2025.01.03) (0) 2025.01.03 [트러블 슈팅] 요청 값 Dto에 어떻게 매핑되는가 (0) 2024.11.15 [트러블 슈팅] S3 HTTPS(443) 접근 문제 (1) 2024.10.13 [트러블 슈팅] ios랑 서버 연동 과정에서 401에러 발생 (3) 2024.10.11 Spring Security + JWT 토큰을 통한 로그인 구현 (1) 2024.05.16 댓글