개발/Java & Kotlin

[Spring] AbstractAuthenticationProcessingFilter, OncePerRequestFilter 차이

devhooney 2024. 6. 6. 14:55
728x90

 

 

 

AbstractAuthenticationProcessingFilter, OncePerRequestFilter 차이를 알아보자!!

 

 

 

Spring Security에서 AbstractAuthenticationProcessingFilterOncePerRequestFilter는 두 가지 주요한 필터 유형이다.

이들은 인증 및 요청 처리에 사용된다.

 

각 필터의 역할과 차이를 살펴보면,

 

 

1. AbstractAuthenticationProcessingFilter

역할

AbstractAuthenticationProcessingFilter는 인증 요청을 처리하는 데 사용

주로 폼 기반 로그인, JWT 토큰 인증, OAuth 인증 등 다양한 인증 메커니즘을 구현하는 데 사용.

특징

  • 인증 요청 전용: 특정 URL 패턴(예: /login, /api/authenticate)에 매핑되어 인증 요청을 처리.
  • 인증 매니저: AuthenticationManager를 사용하여 인증 논리를 처리.
  • 인증 성공/실패 처리: 인증이 성공하면 successHandler를, 실패하면 failureHandler를 호출.

예제

폼 기반 로그인 필터 예제:

public class CustomAuthenticationFilter extends AbstractAuthenticationProcessingFilter {

    public CustomAuthenticationFilter() {
        super("/login");
    }

    @Override
    public Authentication attemptAuthentication(
    	HttpServletRequest request
        , HttpServletResponse response
    ) throws AuthenticationException, IOException, ServletException {
        
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        UsernamePasswordAuthenticationToken authRequest =
        	new UsernamePasswordAuthenticationToken(username, password);
        return getAuthenticationManager().authenticate(authRequest);
        
    }
}

 

 

 

 

728x90

 

 

 

 

2. OncePerRequestFilter

역할

OncePerRequestFilter는 요청이 필터 체인에 의해 여러 번 처리되지 않도록 보장.

주로 요청에 대해 단 한 번만 특정 작업을 수행하고자 할 때 사용.

특징

  • 한 번만 실행: 요청 당 한 번만 실행되도록 보장.
  • 다양한 작업 가능: 인증, 로깅, 헤더 설정 등 다양한 작업을 수행할 수 있다.
  • 범용적 사용: 인증뿐만 아니라 다른 많은 목적에도 사용될 수 있다.

예제

JWT 토큰을 검증하는 필터 예제:

public class JwtAuthenticationFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(
    	HttpServletRequest request, HttpServletResponse response
        , FilterChain filterChain
    ) throws ServletException, IOException {
        String token = getTokenFromRequest(request);
        if (token != null && validateToken(token)) {
            Authentication auth = getAuthentication(token);
            SecurityContextHolder.getContext().setAuthentication(auth);
        }
        filterChain.doFilter(request, response);
    }

    private String getTokenFromRequest(HttpServletRequest request) {
        String bearerToken = request.getHeader("Authorization");
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
            return bearerToken.substring(7);
        }
        return null;
    }

    private boolean validateToken(String token) {
        // 토큰 검증 로직
        return true;
    }

    private Authentication getAuthentication(String token) {
        // 토큰에서 사용자 정보 추출 및 Authentication 객체 생성
        return new UsernamePasswordAuthenticationToken(user, null, authorities);
    }
}

 

차이점 요약

  • 용도:
    • AbstractAuthenticationProcessingFilter: 특정 URL 패턴에 매핑된 인증 요청을 처리하는 데 사용.
    • OncePerRequestFilter: 요청 당 한 번만 특정 작업을 수행하고자 할 때 사용.
  • 구현 방식:
    • AbstractAuthenticationProcessingFilter: AuthenticationManager를 사용하여 인증을 처리.
    • OncePerRequestFilter: 인증, 로깅, 헤더 설정 등 다양한 작업을 수행할 수 있으며, 요청 당 한 번만 실행.

이 두 필터는 서로 다른 목적으로 사용되지만, 둘 다 Spring Security 필터 체인에서 중요한 역할을 한다. AbstractAuthenticationProcessingFilter는 주로 인증 요청을 처리하는 데 사용되며, OncePerRequestFilter는 보다 광범위한 용도로 사용될 수 있다.

 

 

 

728x90