Application Servers & Java

[오류 해결] Invalid URL encoding 에러 원인과 해결 방법 (Spring + Tomcat 환경)

midworker 2025. 5. 14. 21:35
반응형

[오류 해결] Invalid URL encoding 에러 원인과 해결 방법 (Spring + Tomcat 환경)

웹 애플리케이션을 운영하다 보면 종종 아래와 같은 에러 로그를 마주치게 됩니다.

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: Invalid URL encoding.
Caused by: java.lang.IllegalArgumentException: Invalid URL encoding.

이 오류는 클라이언트가 보낸 URL 또는 쿼리 파라미터에 유효하지 않은 인코딩 문자열이 포함되어 있을 때 발생합니다.


✅ 원인 정리

원인 설명
잘못된 % 인코딩 % 다음에 2자리 16진수가 아닌 문자열 포함 (예: %2, %GZ)
브라우저 자동 인코딩 오류 한글 등 비 ASCII 문자가 제대로 인코딩되지 않은 상태로 전송
크롤러/봇 요청 유효하지 않은 URL을 포함한 비정상 요청
프록시/게이트웨이 오류 중간에서 이중 인코딩 또는 디코딩 발생 가능
Tomcat 기본 동작 기본적으로 strict한 URL decoding을 수행함 (org.apache.catalina.connector.Connector)

✅ 재현 예시

아래와 같은 요청 URL이 있을 경우:

http://example.com/search?q=%GG
  • %GG는 유효하지 않은 16진수이기 때문에 decoding 시 IllegalArgumentException이 발생합니다.

✅ 해결 방법

1. Tomcat 설정 변경 (유효하지 않은 인코딩 허용)

server.xml 또는 Spring Boot 환경의 application.properties에서 relaxedQueryChars 설정을 통해 일부 문자를 허용할 수 있습니다.

[Tomcat standalone]

<Connector port="8080" ... relaxedQueryChars="[]|{}^`" />

[Spring Boot application.properties]

server.tomcat.relaxed-query-chars=|{}[]\

단, 이 설정은 특정 문자에만 적용되며 잘못된 % 인코딩(예: %Z) 자체는 허용되지 않음


2. WebFilter 또는 Interceptor에서 사전 필터링

URL의 raw query string을 분석해 유효하지 않은 인코딩 요청을 차단할 수 있습니다.

@WebFilter("/*")
public class EncodingValidationFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        String query = ((HttpServletRequest) request).getQueryString();
        if (query != null && !isValidEncoding(query)) {
            ((HttpServletResponse) response).sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid URL encoding");
            return;
        }
        chain.doFilter(request, response);
    }

    private boolean isValidEncoding(String query) {
        try {
            URLDecoder.decode(query, StandardCharsets.UTF_8.name());
            return true;
        } catch (IllegalArgumentException e) {
            return false;
        }
    }
}

3. 로그 필터링 및 패턴 차단 (예: Web Application Firewall)

  • % 문자가 포함된 쿼리 스트링 중 비정상적인 요청을 분석
  • 크롤러/공격 도구에서 오는 요청은 접근 차단

✅ 보안 고려사항

이 오류를 무조건 무시하거나 모두 허용하면 URL Injection, XSS, Path Traversal 공격에 노출될 수 있습니다.
정상적인 범위 내에서만 허용하거나, 사전 필터로 선별 처리하는 것이 가장 안전한 방식입니다.


✅ 마무리

"Invalid URL encoding"은 단순한 문자 오류로 보이지만, 실제 운영 환경에서는 보안/프록시/게이트웨이/브라우저 등 다양한 계층의 영향을 받을 수 있습니다.
디코딩 예외가 발생할 경우 요청 전체를 분석하고, 필요하다면 방어 필터나 설정 변경을 통해 유연하게 대응하세요.


반응형