RequestRejectedException

request url에 세미콜론(;) 또는 슬래쉬(/)가 붙으면 security firewall에서 요청을 거부합니다.

20210608 13:30:19.656 [http-nio-8080-exec-4] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 
org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL contained a potentially malicious String ";"
	at org.springframework.security.web.firewall.StrictHttpFirewall.rejectedBlocklistedUrls(StrictHttpFirewall.java:456)

org.springframework.security.web.firewall.StrictHttpFirewall 클래스에 블랙리스트로 관리하고 있으며, 이를 허용하고 싶다면 다음과 같이 처리할 수도 있습니다.

@Bean
public StrictHttpFirewall httpFirewall() {
    StrictHttpFirewall firewall = new StrictHttpFirewall();
    firewall.setAllowBackSlash(true);
    firewall.setAllowSemicolon(true);
    return firewall;
}

블랙리스트를 유지하면서 모니터링 등이 이유로 로그만 제외하고 싶다면 아래와 같은 클래스를 추가합니다.

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class RequestRejectedExceptionFilter extends GenericFilterBean {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        try {
            chain.doFilter(request, response);
        } catch (RequestRejectedException e) {
            // firewall에서 요청이 거부되면 인덱스 페이지로 리다이렉트함.
            ((HttpServletResponse)response).sendRedirect("/");
        }
    }
}

댓글남기기