최근, Spring Boot 기반의 웹 애플리케이션 개발 중 java.lang.IllegalArgumentException: Invalid character found in the request target 오류에 직면했습니다. 이는 클라이언트의 요청 URL에 특수 문자가 포함되어 있을 때 발생하는 문제로, RFC 7230 및 RFC 3986 규정에 어긋나는 문자들 때문입니다. 이번 글에서는 이 문제의 해결 과정을 공유하고자 합니다.
문제 발생 상황
Spring Boot 애플리케이션에서 클라이언트로부터 특정 특수 문자를 포함한 요청을 받았을 때, `java.lang.IllegalArgumentException` 오류가 발생했습니다. 처음에는 `application.yml` 설정을 통해 요청 인코딩을 UTF-8로 강제하는 방식으로 해결하려 시도했습니다:
server:
servlet:
encoding:
charset: UTF-8
enabled: true
force: true
하지만, 이 방법은 문제를 해결하지 못했습니다. 오류 메시지를 자세히 분석한 결과, 문제의 원인은 URL에 포함된 특수 문자가 웹 서버(Tomcat)의 기본 설정과 충돌하는 것으로 밝혀졌습니다.
해결 방안
문제를 해결하기 위해, Tomcat의 `relaxedQueryChars` 옵션을 커스터마이징하는 방법을 선택했습니다. 이 옵션을 사용하면 특정 특수 문자를 쿼리 파라미터로 허용할 수 있습니다. 아래는 `TomcatServletWebServerFactory`를 커스터마이징하여 `relaxedQueryChars`를 설정하는 Java 구성 클래스의 예시입니다:
@Configuration
public class TomcatWebCustomConfig implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.addConnectorCustomizers(connector -> connector.setProperty("relaxedQueryChars", "<>[\\]^`{|}"));
}
}
이 설정을 통해, `<`, `>`, `[`, `]`, `^`, `` ` ``, `{`, `|`, `}` 문자들을 URL 쿼리 파라미터에서 안전하게 사용할 수 있게 되었습니다.
마치며
Spring Boot와 같은 프레임워크를 사용할 때, 특수 문자 처리와 관련된 오류는 예상치 못한 곳에서 발생할 수 있습니다. 문제의 정확한 원인을 파악하고, 해당 프레임워크나 내부 웹 서버의 깊은 설정을 이해하고 조정함으로써, 이러한 문제를 효과적으로 해결할 수 있습니다. 이번 경험을 통해, 애플리케이션을 더욱 견고하게 만들고 사용자 경험을 개선할 수 있는 방법을 배웠습니다. 다른 개발자 분들도 비슷한 문제에 직면했을 때, 이 글이 도움이 되기를 바랍니다.
'Framework > Spring' 카테고리의 다른 글
JPA에서 트랜잭션 처리 및 데이터베이스 격리 수준 (0) | 2024.07.19 |
---|---|
Spring Data JPA 이해하기: 주요 구성 요소와 어노테이션 (0) | 2024.07.19 |
JPA 이해하기: 동작 원리와 핵심 구성 요소 (0) | 2024.07.19 |
[MacOS] Spring Boot 애플리케이션에서 SSL 인증서 설정하기: keystore.p12 파일 생성 및 구성 (0) | 2024.04.22 |
Spring의 WebConfig로 해결한 문자 인코딩의 미스터리 (2) | 2024.04.18 |