반응형
이 문제를 어떻게 겪게 되었나면....
UT를 진행 중, SQL 인젝션을 테스트 해 본다고 구구가 닉네임 입력 자리에 `where id = `를 그대로 입력했는데 바로 에러가 터지고 말았다.
닉네임을 입력하면 바로 입력한 닉네임이 중복디 되지는 않았는지 검증하는 API에게 요청을 보내는데, 여기서 예외가 발생한 것이다.
우리는 '여기서 SQL 인젝션 공격이 먹혀서 에러가 터졌나?' 의문을 품고 있었지만,
구구는 스프링 부트에서는 이미 SQL 인젝션 공격을 막고 있다고 하셨는데 여기서만 터지는게 이상하다고 하셨다.
UT를 마치고 우리는 이 에러가 왜 터졌을까 고민하다가 고민하다 에러 로그를 하나씩 살펴보기 시작했다.
일단 먼저 네트워크 탭에서 해당 API의 응답이 우리가 정의해준 예외가 아닌 애초에 OPTION 요청에 대한 CORS 에러가 나는 것을 확인했다. 그렇다면 애플리케이션 내에서 발생시키는 에러가 아닌가?하며 로컬 서버에서 다시 테스트를 진행해보았다.
The valid characters are defined in RFC 7230 and RFC 3986
이 예외 메시지를 구글링 해보니 다음과 같은 원인을 발견할 수 있었다.
문제 해결
SpringBoot는 내장 Tomcat(톰캣)을 사용하고 있으며, 이 Tomcat 의 특정 버전 이상에서 RFC 3986 규격이 적용되었다고 한다.
RFC 3986에는 영어 문자(a-zA-Z), 숫자(0-9), -. ~4 특수 문자 및 모든 예약 문자만 허용된다.
해당 에러를 발생시키지 않으려면, relaxQueryChars 옵션에 허용할 문자를 추가하거나 톰캣 버전을 다운그레이드해야한다.
톰캣 문제 때문에 발생한 에러임을 확인하고 다음과 같이 스프링부트의 Tomcat을 커스텀 하는 Config를 정의하였다.
@Configuration
public class TomcatWebCustomConfig implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.addConnectorCustomizers(connector -> connector.setProperty("relaxedQueryChars", "<>[\\]^`{|}"));
}
}
반응형
'스프링 부트' 카테고리의 다른 글
@PostConstruct와 @PreDestroy (0) | 2021.08.17 |
---|---|
Logback과 로깅 전략 (0) | 2021.08.16 |
ApplicationEventPublisher 적용과 그 안에서의 삽질 (1) | 2021.08.14 |
스프링 부트 Profile별로 다른 환경 구성 (0) | 2021.08.06 |
📋 4. 의존 자동 주입 (0) | 2021.08.06 |