Filter

전현진·2025년 4월 1일

Spring

목록 보기
8/14

필터 Filter

Filter는 Java EE (Jakarta EE)의 Servlet API에서 제공하는 기능 중 하나로, 웹 애플리케이션에서 요청과 응답을 조작할 수 있는 강력한 도구입니다.

Filter의 주요 역할

  • 인증 및 권한 검사 - 사용자가 적절한 권한을 가지고 있는지 확인

  • 로깅 및 감사(Audit Logging) - 요청 정보를 기록

  • 입출력 데이터 변환 및 압축 - 요청 또는 응답 데이터를 수정

  • 캐싱(Cache) 관리 - 특정 요청에 대한 캐시 처리

  • CORS(Cross-Origin Resource Sharing) 처리 - 보안 관련 설정

  • XSS/SQL Injection 방어 - 보안 필터링

Filter의 장점과 단점

  • 장점

    • 재사용성: 여러 서블릿에서 공통 로직을 적용 가능
    • 유연성: 요청 및 응답을 조작 가능
    • 보안 강화: 인증, 권한 검사, 보안 필터링에 유용
  • 단점

    • 설정이 다소 복잡: 여러 개의 필터를 등록해야 하는 경우 관리가 번거로움
    • Spring 기반 프로젝트에서는 Interceptor가 더 적합

주요 메서드

  • init()
    - Filter를 초기화하는 메서드이다.
    - Servlet Container가 생성될 때 호출된다.
    - default ****method이기 때문에 implements 후 구현하지 않아도 된다.

  • doFilter()
    - Client에서 요청이 올 때 마다 doFilter() 메서드가 호출된다.
    - doFilter() 내부에 필터 로직(공통 관심사 로직)을 구현하면 된다.
    - WAS에서 doFilter() 를 호출해주고 하나의 필터의 doFilter()가 통과된다면
    - Filter Chain에 따라서 순서대로 doFilter() 를 호출한다.
    - 더이상 doFilter() 를 호출할 Filter가 없으면 Servlet이 호출된다.

  • destroy()
    - 필터를 종료하는 메서드이다.
    - Servlet Container가 종료될 때 호출된다.
    - default method이기 때문에 implements 후 구현하지 않아도 된다.

  • setFilter()
    - 등록할 필터를 파라미터로 전달하면 된다.

  • setOrder()
    - Filter는 Chain 형태로 동작한다.
    - 즉, 실행될 Filter들의 순서가 필요하다.
    - 파라미터로 전달될 숫자에 따라 우선순위가 정해진다.
    - 숫자가 낮을수록 우선순위가 높다.

  • addUrlPatterns()
    - 필터를 적용할 URL 패턴을 지정한다.
    - 여러개 URL 패턴을 한번에 지정할 수 있다.
    - 규칙은 Servlet URL Pattern과 같다.

  • filterRegistrationBean.addUrlPatterns("/*")
    - 모든 Request는 Custom Filter를 항상 지나간다.

(Servlet) Filter 정리

  1. Filter를 사용하려면 Filter Interface를 Implements 하여 구현한다.

  2. 구현한 Filter를 Bean으로 등록 한다.

  3. HTTP 요청이 오면 doFilter() 메서드가 호출된다.

    • ServletRequest는 기능이 별로 없어서 HttpServletRequest로 다운 캐스팅 해야한다.
  4. chain.doFilter(request, response)

    • (순서를 설정해둔)다음 필터가 있으면 Filter를 호출한다.
    • 다음 실행할 필터가 없으면 Servlet을 호출한다.
    • 해당 메서드를 호출하지 않으면 다음 단계로 진행되지 않는다.
      • 다음 필터나 Servlet을 호출하지 않는다.
  5. Filter를 등록하는 방법은 여러가지가 있다.

    • SpringBoot의 경우 FilterRegistrationBean 을 사용한다.
profile
안녕하세요

0개의 댓글