-
[Spring Security 3.x + JWT] PermitAll() 이 정상적으로 인식이 되지 않을 경우스터디 노트 2024. 9. 22. 12:36
JWT Filter를 활용한 로그인 기능을 구현하던 중, 회원가입 API를 호출하니 권한이 없다는 황당한 오류를 맞이하게 되었습니다.
분명히 httpSecurity에 authorizeHttpRequests부분에 PermitAll로 회원가입과 로그인을 처리하는 auth 하위 URI는 모두 허용하도록 처리를 하였음에도 불구하고 JWT Filter를 타면서 token검증을 하더군요..
실제로 인증을 하지 않으며 무조건 허용하도록 설정을 했음에도 정상 동작하지 않아 파악을 해보니, permitAll()을 설정해도 무조건 Spring Security의 필터 체인을 거친다는 것을 알게 되었습니다.
이유는 알았고 이제 해결 방법을 찾아야지요.
해결 방법은 매우 간단했습니다.
기본적인 Security Config를 사용한다면 WebSecurityCustomizer를 Bean으로 선언하여 경로를 제외시켜주면 됩니다.
Web Security의 경우 Http Security 보다 우선순위가 높기 때문에 Web Security의 ignoring 경로에 따라 endpoint가 permit되도록 설정할 수 있습니다.
@Bean public WebSecurityCustomizer webSecurityCustomizer() { return (web) -> { web.ignoring().requestMatchers("/api/v1/auth/"); // 필터를 타면 안되는 경로 }; }
다만 Filter를 커스텀하여 적용시켜주었을 경우에는 위처럼 WebSecurityCustomizer가 아닌 shouldNotFilter로 직접적으로 커스텀 개발한 Filter에 제외시켜주는 로직을 추가하여야 합니다.
@Component @RequiredArgsConstructor public class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtProvider jwtProvider; @Override protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException { return request.getRequestURI().startsWith("/api/v1/auth/"); } ...
OncePerRequestFilter에 있는 shouldNotFilter 메소드를 직접 override하여 지정 경로를 제외시켜주어야 합니다.
이렇게 하면 정상적으로 접근이 permit되는 것을 확인할 수 있었습니다.
'스터디 노트' 카테고리의 다른 글
[Mac] 실행중인 포트 확인 및 종료 방법 (0) 2024.08.19 Ubuntu docker 설치 명령어 모음 (0) 2024.07.25 [Docker] Container에서 사용중인 포트 확인하기 (0) 2024.06.04 Nginx 설치 및 Reverse Proxy 설정 (0) 2024.05.14 Host <-> Docker 간 파일 전송 명령어 (docker cp) (0) 2024.05.14