Spring Security - Filter

TopOfTheHead·2025년 11월 19일

Spring Security

목록 보기
17/27

Filter :
WAS에서 Dispatcher Servlet으로 전달되는 모든 요청을 전달하기 전 및 내부에서 forward되는 요청인터셉팅하여 `검증하는 역할을 수행하는 서블릿

인증 / 검증 용도로 사용

필터는 여러 필터로 구성되며, 각자의 필터는 독립적인 역할이 존재
▶ 주로 접근 & 제어에 대해 여러가지 보안을 제공

요청 전달 시 Spring Security에 포함된 필터가 자동으로 적용되어 접근 적합성을 평가하여 인증정보를 평가
인증정보 불일치의 경우 요청의 접근을 차단.

  • Filter의 문제점

    。이미 Dispatcher Servlet에서 수신되면서 Filter에 의해 이미 검증Request를 내부 다른 요소forward되면서 중복으로 Filter를 매번 거치면서 검증을 수행하는 것은 비효율적.

필터 종류
Servlet FilterSpring Filter가 존재

Servlet Filter
요청어플리케이션Servlet 간 이동 시 filter가 각각 새로운 요청으로 간주하여 항상 검증을 수행하는 서블릿

Dispatcher Servlet에서 요청을 수신 시 각 다른 Servlet으로 요청을 전달하면서 필터에서 각 전달되는 이미 검증요청검증을 반복하는 비효율이 존재

。기본적으로 Spring Bean과는 다름을 유념
Spring FrameworkSpring Bean으로 등록된 서블릿디스패처 서블릿 외에는 없으먀 Spring Filter에서는 Delegating Filter Proxy를 사용하여 Spring Bean을 사용하도록 설정.

Spring Filter

Servlet Filter 사이에 Delegating Filter Proxy를 통해 구현된 Spring Bean의존성 주입 받아서 Filter로서 사용가능하도록하는 Filter

。기존 Servlet Filter요청어플리케이션 내에서 forward되면서 매번 검증하는 기능을 개선하기위해 OncePerRequestFilter상속필터구현체SecurityFilterChain에 포함하여 의존성주입 받아 Filter로 사용하여 한번만 검증하도록 개선
기술면접에서 자주 등장

  • Delegating Filter Proxy :
    Filter Chain 사이에 Spring Bean으로 구현된 Spring Bean Filter의존성 주입하여 사용할 수 있도록 만드는 프록시객체

    。외부에서 Web Security Configuration으로서 @Configuration Class로 정의한 SecurityFilterChainSpring Bean으로서 등록 시 Delegating Filter Proxy를 통해 Servlet Filter Chain에 포함되어 필터로서 기능
    ▶ 해당 기능을 사용하여 Dispatcher Servlet요청이 전달 될 때 검증만 수행하고 내부에서 forward되는 요청검증하지 않는 filter를 설정하는 OncePerRequestFilterSecurityFilterChain에 추가하여 FilterChain에 포함하도록 설정

Filter : jakarta.servlet
Servlet Filter 인터페이스
▶ 모든 필터서블릿에 해당

。모든 Filter는 해당 인터페이스를 구현 및 구현메소드 ( doFilter() )를 상속
▶ 해당 Filter를 구현 시 Filter Chain에 포함됨

  • OncePerRequestFilter
    Servlet Filter에서 요청에 대해 여러번 중복해서 검증하는 로직을 개선하는 Filter 구현체
    Dispatcher Servlet요청의 수신하는 시점에서만 검증하고 나머지 forward 시는 검증skip하도록 설정

    검증기능이 설정된 커스텀 Filter 구현체 생성 시 해당 OncePerRequestFilter상속하도록 설정
    ▶ 해당 OncePerRequestFilter를 상속한 Filter 구현체SpringFilterChainHttpStatus.addFilterBefore(new Filter구현체())로 설정
    ▶ 이후 해당 SpringFilterChainDelegating Filter Proxy에 의해 의존성주입 받아서 Servlet Filter 사이에서 Filter로서 기능

    Filter에 의한 필터링이 완료된 경우 필터명 뒤에 .FILTERED 라는 키워드가 작성
    ▶ 이후 요청이 내부에서 forward할때마다 검증이 수행되는 경우 해당 .FILTERED의 유무에 따라서 검증의 수행을 Skip

  • doFilterInternal() : 필터Filter Chain 내 포함되므로, FilterChain매개변수로 받는 특징이 존재
    요청이 도달하기 전 WAS 밖에서 필터를 통해 요청을 처리

    。또한, 디스패처 서블릿 도달 전 필터일 수 있으므로, HttpServletRequest, HttpServletResponse매개변수로 전달받은 후 다음 필터로 전달 가능
    ▶ 이는 Dispatcher Servlet에 도달할 때까지 반복

    filterChain.doFilter(request, response);
    필터체인 내 다음 필터로 전달하는 메서드
public class JwtAuthenticationFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain filterChain
    ) throws ServletException, IOException {
//		필터체인 내 다음 필터로 전송
		filterChain.doFilter(request, response);
    }
}

SecurityFilterChain : Security Filter Chain
Spring Security에서 제공하는 보안 filter 모음 역할의 Interface.
( Authentication Filter , Authorization Filter , CORS Filter , CSRF Filter , ExceptionTranslation Filter 등)

Web Security Configuration를 정의하는 @Configuration Class를 통해 Spring Bean으로 등록 시 Delegating Filter Proxy를 통해 Servlet Filter Chain 사이에서 Filter로서 의존성 주입되어 기능

profile
공부기록 블로그

0개의 댓글