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

류재성's avatar
Jul 19, 2024
[Spring] 필터를 활용한 URL 유효성 검사하기
 
💡
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};