스프링부트 - 필터(FilterRegistrationBean)

2025. 5. 10. 19:35·Spring
728x90
반응형
SMALL

Filter란?

필터(Filter)는 스프링의 기능이 아닌 자바 서블릿진영에서 제공하는 기능이다.

 

  • HTTp요청과 응답을 가로챈다.
  • 자바진영에서 제공하는 필터이므로 스프링의 DispatcherServlet보다 먼저 실행이 된다.
  • AOP보다 Request와 response 객체에 쉽게 접근이 가능하다.
  • FilterRegistrationBean을 통해 특정 URL에만 적용하거나 실행 순서를 제어할 수 있다.

위 그림에서 스프링 영역의 Dispatcher Servlet에 들어가기전에 Filter가 실행이 되는 것을 확인 할 수 있다.

필터(Filter)는 필터 체인을 통해 연쇄적으로 동작하게도 가능하다.

 

Filter는 어디에 쓰일까?

  • XSS(Cross Site Scripting) 방지(사용자로부터 들어오는 입력 데이터를 검증하고 필터링하여,
    스크립트 삽입과 같은 악성 공격을 사전에 차단한다.
  • Logging(모든 HTTP 요청에 대한 정보를 기록하여 모니터링, 디버깅, 감사 추적 등에 사용가능하다.)
  • Encoding(들어온 요청 및 응답의 문자 인코딩을 설정하여 한글깨짐과 같은 문자 인코딩 방지해줌
  • IP 검사(특정 IP주소로 들어오는 요청을 허용 또는 차단하여 비정상적 접근을 제어)

자 우리는 AOP |  Filter |  Interceptor까지 모두 살펴보았다. 

그럼 위 3개를 한번 비교를 해보면서 복습을 해보겠다.

 

  • AOP()
    1. 특정 기능을 작성한 후 여러 부분에 쉽게 적용하는 기술
    2. Advice(특정 기능), Pointcut(여러 부분), Aspect(Advice + Pointcut)
    3. Pointcut으로 메서드를 지정한다.
    4. 스프링의 제어 범위 내에서 모든 메서드를 제어가능하다.
    5. @Aspect ||  @Component 어노테이션을 적용한 1개 이상의 클래스만 있으면 적용이 가능하다.
  • Filter()
    1. 자바 서블릿 기반의 기술로 HTTP 요청과 응답을 가로챈다.(필터처럼 걸러준다.)
    2. 스프링의 DispatcherServlet보다 먼저 실행 된다.
    3. AOP보다 Request와 Response객체에 쉽게 접근이 가능하다.
    4. FilterRegistrationBean을 통해 특정 URL에만 적용하거나 실행 순서를 제어할 수 있다.
  • Interceptor()
    1. 스프링 서브릿 바로 다음에 실행되는 기술로 Controller에 들어오는 요청과 응답을 제어할 수 있다.
    2. Filter와 달리 스프링의 DispatcherServlet으로 진입 후 동작된다.
    3. Request와 Response 객체를 기본 제공하므로 웹과 관련된 기능을 쉽게 작성가능하다.
    4. Filter와 달리 적용할 URL과 제외할 URL을 따로 지정할 수 있다.

말로만 해서는 잘 이해가 안될 수도 있으니 실습을 통해서 다시 한번 이해를 해보겠다.

 

FIlter로 IP확인하기

IPCheckFilter.java

package com.example.basic.filter;

import java.io.IOException;

import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class IPCheckFilter
implements Filter {

    @Override
    public void doFilter(
        ServletRequest request, ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException
    {
        HttpServletRequest req = (HttpServletRequest) request;
        String ip = req.getRemoteAddr();
        log.info(ip);
        chain.doFilter(request,response);
    }
}

지금 doFilter의 메서드는 Filter인터페이스를 상속받아서 doFilter메서드를 구현해줘야한다.

 void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException;

필터의 인터페이스에 들어가보면 다음과 같이 나와있는 것을 볼 수 있다.

현재 request에 HttpServletRequest로 명시적 TypeCasting을 해서 HttpServletRequest로 형 변환을 해줬다.

그럼 req객체는 HTTP요청에 특화된 정보와 기능을 다루는데 사용이 된다.

 

Filter는 FilterRegistrationBean을 통해서 특정 URL에만 적용하거나 실행순서를 제어한다고 나와있다.

그럼 FilterRegistrationBean을 빈으로 등록해줘야된다.

FilterConfig.java

package com.example.basic.config;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.example.basic.filter.IPCheckFilter;

import jakarta.servlet.Filter;

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<Filter> getFilterRegistrationBean() {
        FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>(new IPCheckFilter());
        bean.addUrlPatterns("/visitor");
        return bean;
    }
}

우리는 Configuration으로 해당 FilterConfig클래스가 Bean을 등록하는 클래스라고 스프링에게 알려주고

getFilterRegistrationBean()메서드가 반환하는 bean객체를 빈으로 등록해준다.

 

VisitorController.java

package com.example.basic.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class VisitorController {
    @GetMapping("/visitor")
    public String visitor(
        // RequestHeader(클라이언트가 보내온 헤더값을 검사하는 것임)
            @RequestHeader("user-agent") String userAgent) {
        return userAgent;
    }

}

 

그럼 visitorController에 visitor경로로 들어가보자 

해당경로로 로그가 뜨는 것을 볼 수 있다.

728x90
반응형
LIST

'Spring' 카테고리의 다른 글

스프링부트 - JWT(Json Web Token)이란?  (0) 2025.05.11
스프링부트 - 파일 업로드  (0) 2025.05.10
[스프링부트] - 인터셉터(interceptor)  (1) 2025.05.09
[스프링부트] - Controller Advice  (1) 2025.05.07
[스프링부트] - AOP에 대해서 알아보자  (0) 2025.05.07
'Spring' 카테고리의 다른 글
  • 스프링부트 - JWT(Json Web Token)이란?
  • 스프링부트 - 파일 업로드
  • [스프링부트] - 인터셉터(interceptor)
  • [스프링부트] - Controller Advice
코린이 파닥거리기
코린이 파닥거리기
    반응형
    250x250
  • 코린이 파닥거리기
    코린이 파닥거리기의 블로그
    코린이 파닥거리기
  • 전체
    오늘
    어제
    • 분류 전체보기 (117) N
      • 백준[파이썬] (48) N
      • Spring (31)
      • CS (1)
      • 자바 (4)
      • 백준[자바] (20)
      • 프로그래머스 (5)
      • 토이프로젝트 (1)
      • SWEA (2)
      • MSA (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    JWT
    컨테이너
    JPA
    spring
    재귀
    프로그래머스
    스프링 부트와 AWS로 혼자 구현하는 웹 서비스
    Java
    백준
    테스트코드
    코딩테스트
    SWEA
    SpringBoot
    누적합
    파이썬
    스프링
    db
    스프링부트
    자바
    MSA
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코린이 파닥거리기
스프링부트 - 필터(FilterRegistrationBean)
상단으로

티스토리툴바