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 를 설정한다.
url 에 ? 가 포함되면 정상적인 데이터가 출력된다.
@가 포함되면 필터에 걸려 에러메세지를 출력한다.
Share article