Spring Security 필터 등록 시 주의사항(ignore)

jonghyukLee·2022년 10월 30일
1

이전에 일부 url 패턴에 대해 Spring Security의 필터를 거치지 않도록 제외시키는 목적으로 아래 방법을 적용했었다.

https://velog.io/@jh5253/Spring-Security-Configuration-수정

당연히 정상 동작할줄 알았으나, 세팅만 해놓고 아직 사용되지 않고 있어서 모르고 있었다.

이번에 JWT 검증을 생략해야 하는 API 요청이 생겨서, 해당 url을 ignore 목록에 추가했더니, 아이러니하게도 JWT필터에 계속 걸리는 이상한 문제를 마주했다.

ignore 세팅은 이전과 동일하고, 문제 필터는 아래와 같이 선언되어 있다.

JwtAuthenticationFilter.class

@RequiredArgsConstructor
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private final Logger log = LoggerFactory.getLogger(JwtAuthenticationFilter.class);
    private final TokenProvider tokenProvider;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String token = getTokenFromHeader(request);

        if (StringUtils.hasText(token) && token.startsWith("Bearer")) {
            //Access Token 검사
            String parsedToken = tokenProvider.parseBearerToken(token);

            //생략
    }

}

SecurityConfig에 아래와 같이 해당 필터의 위치를 정의했다.

SecurityConfig.class

private final JwtAuthenticationFilter jwtAuthenticationFilter;
// 나머지 생략
http.addFilterBefore(jwtAuthenticationFilter, OAuth2LoginAuthenticationFilter.class);

원인

이유를 찾아보니, 위의 JwtAuthenticationFilter처럼 Bean 객체로 등록하여 필터를 적용하게 되면, Spring Security의 filterChain이 아닌 default filterChain에 등록되어 버리기 때문에, Security filterChain을 거치지 않도록 허용해도 의미가 없게 되어버린 것이었다.

지금 생각해보니, 프로젝트 초반에 다른 로직을 검증하기 위해 디버깅을 시도했을 때, JwtAuthenticationFilter가 계속 두번 씩 걸리는 것에 대해 의문이 있었는데, 이것 때문이 아니었을까 싶다.

해결

  1. JwtAuthenticationFilter를 Bean으로 등록하지 않고 (@Component 제거)
  2. SecurityConfig에서 필터를 new 키워드로 생성
profile
머무르지 않기!

0개의 댓글