TIL_0213 - JWT필터 구현에서 생긴 의문

johaS2·2025년 2월 13일

오늘은 프로젝트 2일차..
프로젝트 시작하고 모르는게 많아서 의문이 생기면 찾아보느라 시간 가는 줄 모르겠다 ㅋㅋ
오늘은 그 중 하나인 JWT 필터를 구현하는 과정에서 생긴 의문을 정리해보려한다.

이전에 배운 코드에서 JwtAuthenticationFilter는 UsernamePasswordAuthenticationFilter를 상속받고, JwtAuthorizationFilter는 OncePerRequestFilter를 상속받은 걸 봤다. 그럼 왜 이렇게 차이를 두었을까?


OncePerRequestFilter

  • Spring Security에서 제공하는 기본 필터 클래스 중 하나
  • 매 요청마다 한 번만 실행되는 특징이 있다. (이름 그대로!)

UsernamePasswordAuthenticationFilter

  • 사용자 인증을 처리하는 필터로, 로그인 폼에서 제공되는 사용자명과 비밀번호를 처리할 때 사용된다.

왜 OncePerRequestFilter를 사용하는가?

JWT는 상태가 없는 (stateless) 인증 방식으로 매 요청마다 토큰을 확인해야 한다. 즉, 사용자가 요청할 때마다 헤더에서 JWT 토큰을 추출하고 검증해야 하며, 이를 통해 인증 정보를 설정해야 한다. OncePerRequestFilter는 매 요청마다 한 번만 실행되기 때문에, JWT 인증 필터 구현에 적합하다.


예시 코드

public class JwtAuthenticationFilter extends OncePerRequestFilter {
    private final JwtUtil jwtUtil;

    public JwtAuthenticationFilter(JwtUtil jwtUtil) {
        this.jwtUtil = jwtUtil;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        String token = jwtUtil.resolveToken(request); 
        if (token != null && jwtUtil.validateToken(token)) { // 토큰 유효성 검사
            Authentication authentication = jwtUtil.getAuthentication(token);
            SecurityContextHolder.getContext().setAuthentication(authentication); 
        }
        filterChain.doFilter(request, response); 
    }
}

추가로 알면 좋은 것들

예외 처리

  • 토큰이 없거나 유효하지 않다면 401 Unauthorized 응답을 보내는 방식으로 처리할 수 있다.
  • 이를 위해 JwtAuthenticationFilter에서 토큰을 검증할 때 validateToken이 false를 반환하면, Unauthorized 상태 코드를 반환하도록 추가할 수 있다.

JwtAuthorizationFilter 역할

  • 인증된 사용자에게 권한을 부여하거나 권한을 확인하는 작업을 한다.
  • 주로 권한 검사를 위한 필터로, 인증된 사용자가 요청하는 리소스에 적합한 권한을 가졌는지 확인하는 역할을 한다.
  • JwtAuthenticationFilter은 인증을 처리! JwtAuthorizationFilter는 권한을 처리!

성능 고려

  • OncePerRequestFilter는 매 요청마다 실행되므로, 불필요한 작업을 최소화하는 것이 중요하다. JWT를 확인하는 작업이 반복되므로 성능에 영향을 미치지 않도록, 토큰의 유효성 검사 부분을 효율적으로 처리하는 방법을 고려해야 한다.
  • 예를 들어, 토큰을 캐시하여 검증 작업을 최소화하거나, 토큰 검증이 빠르게 이루어질 수 있도록 최적화하는 방법도 고려할 수 있다.

결론

  • OncePerRequestFilter는 매 요청마다 한 번만 필터가 실행되도록 보장하며, 중복 실행을 방지한다
  • 내가 배운 자료에서는 login.html을 사용해서 구현했기 때문에 UsernamePasswordAuthenticationFilter를 상속받은 것이었지만, 지금처럼 프론트가 없는 백엔드 개발에서는 헤더에 포함된 JWT 토큰으로 인증을 처리해야 하므로 OncePerRequestFilter를 상속받아 구현하면 된다!
profile
passionate !!

0개의 댓글