inblog logo
|
{CODE-RYU};
    SPIRNG

    [Spring] 필터를 활용한 URL 유효성 검사하기

    류재성's avatar
    류재성
    Jul 19, 2024
    [Spring] 필터를 활용한 URL 유효성 검사하기
    Contents
    1. 필터 구현하기2. Config 파일 만들기
     
    💡
    url 요청시 키워드로 사용하는 특수문자 (? & = : //) 를 제외한 다른 문자는 필터로 처리해서 입력받지 못하게 한다.
     

    1. 필터 구현하기

    💡
    스프링에서 필터는 클라이언트의 요청, 서버의 응답을 가로채어 추가 작업을 진행할 수 있다. 요청 유효성 검사, CORS 처리, 데이터 압축, 인증 및 인가, 요청 및 응답 로깅 등의 작업을 수행한다.
     
     
    _core/filter/URLFilter
    package ko.co.polycube.backendtest._core.filter; 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 jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.regex.Pattern; public class URLFilter implements Filter { private static final Pattern INVALID_URL_PATTERN = Pattern.compile("[^\\w?&=:/]|(?<!:)/{2,}"); public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; String requestURI = httpRequest.getRequestURI(); // 정규 표현식에 유효하지 않는 문자인 경우 필터링 if (INVALID_URL_PATTERN.matcher(requestURI).find()) { // 유효하지 않은 URL인 경우 400 Bad Request 응답 httpResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST); httpResponse.setContentType("application/json"); httpResponse.setCharacterEncoding("UTF-8"); httpResponse.getWriter().write("{\"reason\": \"유효하지 않은 문자가 주소에 포함되어 있습니다.\"}"); return; } chain.doFilter(request, response); } }
     
    💡
    Filter 를 구현한 후 doFilter 메서드를 오버라이드한다. ServletRequest : 클라이언트로부터 들어오는 HTTP 요청의 정보를 얻을 수 있다.
    • 주요 메서드
      • getParameter(String name): 요청 파라미터를 반환
      • getParameterValues(String name): 같은 이름을 가진 여러 요청 파라미터 값을 배열로 반환
      • getParameterNames(): 요청 파라미터 이름의 Enumeration을 반환
      • getAttribute(String name): 요청 속성을 반환
      • setAttribute(String name, Object o): 요청 속성을 설정
      • getRemoteAddr(): 클라이언트의 IP 주소를 반환
      • getRemoteHost(): 클라이언트의 호스트 이름을 반환
      • getRequestDispatcher(String path): 요청을 다른 리소스(서블릿, JSP 등)로 전달하는 RequestDispatcher 객체를 반환
     
    ServletResponse : 서버에서 클라이언트에게 보내는 HTTP 응답의 세부 사항을 설정할 수 있다.
    • 주요 메서드
      • setContentType(String type): 응답의 MIME 타입을 설정
      • setCharacterEncoding(String charset): 응답의 문자 인코딩을 설정
      • getWriter(): 클라이언트로 텍스트 데이터를 전송하는 PrintWriter 객체를 반환
      • getOutputStream(): 클라이언트로 바이너리 데이터를 전송하는 ServletOutputStream 객체를 반환
      • setContentLength(int len): 응답의 콘텐츠 길이를 설정
     
     
     

    2. Config 파일 만들기

    💡
    스프링에서 Config 는 애플리케이션의 동작을 설정하고 조정하는 역할을 한다.
     
    _core/config/FilterConfig
    package ko.co.polycube.backendtest._core.config; import ko.co.polycube.backendtest._core.filter.URLFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<URLFilter> urlValidationFilter() { FilterRegistrationBean<URLFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new URLFilter()); registrationBean.addUrlPatterns("/*"); return registrationBean; } }
     
    💡
    FilterConfig 를 통해 모든 주소에 대해 URLFilter 를 설정한다.
     
    notion image
     
    url 에 ? 가 포함되면 정상적인 데이터가 출력된다.
     
    notion image
     
    @가 포함되면 필터에 걸려 에러메세지를 출력한다.
     
    Share article

    {CODE-RYU};

    RSS·Powered by Inblog