Spring/Spring Security

[Spring Security][KoLiving] 4-1. JwtAuthenticationFilter

noahkim_ 2023. 10. 3. 17:34

* 이전 포스팅에서 다루었던 JWT 토큰 기반 인증의 구현에 대한 포스팅입니다

 

0. Dispatch Type

  • 서블릿 기반의 웹 애플리케이션에서 사용되는 개념으로 서블릿이나 필터로 전달될 때 요청이 어떤상황에서 처리되는 지를 나타냅니다.

 

REQUEST
  • 클라이언트로부터 웹 애플리케이션에 직접 요청이 들어올 때 처리되는 타입입니다.
  • 브라우저에서 URL이나 링크를 클릭할 떄 발생하는 요청

 

FORWARD
  • RequestDispatcher의 forward() 메서드를 사용하여 특정 리소스로 요청을 전달할 때 사용되는 타입입니다.
  • 다른 서블릿이나 JSP로 넘겨 처리할 수 있습니다.

 

INCLUDE
  • RequestDispatcher의 include() 메서드를 사용하여 현재 처리 중인 요청에 다른 리소스의 내용을 포함할 때 사용되는 타입입니다.
  • 다른 서블릿이나 JSP의 내용을 현재 페이지에 포함시키기 위해 사용됩니다.

 

ASYNC
  • 비동기적으로 처리되는 요청에 대한 타입입니다.

 

ERROR
  • 요청 처리 중에 발생한 오류에 대한 페이지를 보여주기 위한 타입입니다.

 

1. OncePerRequestFilter

  • OncePerRequestFilter는 Dispatch Type이 REQUEST, ASYNC인 타입에 대해서만 단 한번만 처리하는 필터입니다.
  • JwtAuthenticationFilter는 토큰 기반 인증 검증 필터이므로 REQUEST 타입에서 한번만 동작하도록 구현하는데 적절합니다.

 

2. JwtAuthenticationFilter

@Slf4j
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private final JwtProvider jwtProvider;
    private final IJwtService jwtService;
    private final HttpUtils httpUtils;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException, AuthenticationException, JwtException {
        String accessToken = httpUtils.resolveToken(request);
        jwtProvider.validateToken(accessToken);
        if (jwtService.isBlackList(accessToken)) {
            throw new BlackListTokenException("black_list_token");
        }

        this.setAuthentication(accessToken);

        filterChain.doFilter(request, response);
    }

    private void setAuthentication(String accessToken) {
        Authentication authentication = jwtService.createAuthentication(accessToken);
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }
}
  • JwtAuthenticationFilter는 토큰 기반 인증을 담당하는 필터입니다.
    • JWT Token를 보안 헤더를 통해 서버에 요청합니다.
    • JwtProvider가 JWT Token이 유효한지 검증합니다.
    • JwtProvider가 JWT Token이 블랙리스트인지 확인합니다.
  • 검증에 성공할 경우
    • 인증된 Authentication 객체를 생성합니다.
    • SecurityContextHolder의 SecurityContext에 생성된 Authentication 객체를 셋팅합니다.
  • 검증에 실패할 경우
    • AuthenticationException (AuthenticationEntryPoint에 의해 처리됩니다)
      • 로그인 창으로 리다이렉트 됩니다.
    •  BlackListTokenException (AuthenticationEntryPoint에 의해 처리됩니다)
      • RefreshToken이 무효화 됩니다.
      • 로그인 창으로 리다이렉트 됩니다.