Spring Security와 기존 Filter 비교

SIHA·2025년 3월 17일

1. Filter란?

Filter는 Servlet의 핵심 구성 요소 중 하나로, 클라이언트의 요청(Request)과 응답(Response)을 가로채서 특정 작업을 수행할 수 있도록 해주는 기능이다.

Filter의 주요 역할

  • 요청(Request) 및 응답(Response) 변형 가능
  • 인증(Authentication) 및 권한(Authorization) 검증 가능
  • 로깅(Logging) 및 성능 모니터링 가능
  • CORS, CSRF 방어와 같은 보안 기능 적용 가능

Filter의 실행 흐름

[클라이언트] → [Filter] → [Servlet] → [Controller] → [응답 처리]

기존 Servlet Filter 예제

@WebFilter("/*")
public class CustomFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println(" Custom Filter 실행");
        chain.doFilter(request, response); // 다음 필터 또는 컨트롤러로 전달
    }
}

이렇게 Filter를 직접 구현하면 모든 요청을 가로채서 원하는 작업을 수행할 수 있다.


2. Spring Security의 Filter

Spring Security는 보안 처리를 위한 자체적인 FilterChain을 제공하며, 기존의 Filter를 대체하여 인증 & 권한 관리를 자동화한다.

Spring Security Filter의 역할

  • 모든 요청을 가로채 인증(Authentication)과 권한(Authorization)을 수행
  • JWT, OAuth2, 세션 기반 인증 등 다양한 인증 방식을 지원
  • 기본적으로 여러 개의 Security Filter가 체인 형태로 실행됨

Spring Security FilterChain의 실행 흐름

[클라이언트] → [Spring Security FilterChain] → [DispatcherServlet] → [Controller]

즉, Spring Security는 요청이 컨트롤러에 도달하기 전에, 보안 관련 필터를 통해 인증을 수행하고 요청의 유효성을 검사한다.

Spring Security Filter 예제 (JWT 인증 필터)

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
    private final JwtUtil jwtUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        String authorizationHeader = request.getHeader("Authorization");
        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            String jwt = authorizationHeader.substring(7);
            Claims claims = jwtUtil.extractClaims(jwt);
            setAuthentication(claims);
        }
        chain.doFilter(request, response);
    }

    private void setAuthentication(Claims claims) {
        AuthUser authUser = new AuthUser(
                Long.valueOf(claims.getSubject()),
                claims.get("email", String.class),
                UserRole.of(claims.get("role", String.class))
        );
        SecurityContextHolder.getContext().setAuthentication(new JwtAuthenticationToken(authUser));
    }
}

Spring Security를 사용하면 기존의 Custom Filter 없이 보안 처리를 자동화할 수 있다.


3. 기존 Filter vs Spring Security Filter 비교

Filter with Security vs Filter without Security

구분Spring Security 없이 직접 구현Spring Security 사용
필터 실행 위치DispatcherServlet 이전DispatcherServlet 이전 (Security FilterChain)
인증(Authentication) 방식개발자가 직접 구현해야 함SecurityContextHolder를 통해 자동 관리
JWT 검증직접 필터에서 처리해야 함JwtAuthenticationFilter에서 자동 처리
CORS / CSRF 보호개발자가 직접 설정Spring Security가 자동 제공
필터 개수필요할 때마다 직접 추가기본적으로 여러 개의 필터 제공
유지보수직접 관리해야 함Spring Security 설정만 조정하면 됨

즉, Spring Security는 기존의 Filter를 대체하여 인증 & 보안 처리를 자동화하며, 개발자가 직접 관리해야 하는 부담을 줄여준다.


결론

  1. 기존 Filter는 보안뿐만 아니라 다양한 기능을 수행하지만, 인증/권한 처리를 직접 구현해야 하는 번거로움이 있음.
  2. Spring Security는 자체적인 FilterChain을 제공하여 인증 & 권한 관리를 자동화하며, 기존의 Custom Filter를 대체할 수 있음.
  3. JWT 기반 인증을 적용할 때도 JwtAuthenticationFilter를 Spring Security FilterChain에 추가하면 간단하게 처리 가능.
  4. 결과적으로 Spring Security를 사용하면 개발자가 직접 보안 필터를 관리할 필요 없이, 설정만으로 강력한 보안이 적용됨.
profile
뭐라도 해보자

0개의 댓글