[Undertow] BadRequestException: Invalid Character Error

DyungE_100·2024년 3월 26일
0
post-thumbnail

🧨 새로운 에러를 발견했다

제가 다니고 있는 회사는 기본적으로 B2B 제품을 많이 만듭니다. 그에 따라 Spring 프레임워크를 쓰고, 고성능 웹 서버에 대한 요구가 높아 Jetty보다는 undertow를 많이 씁니다. (물론 저도 안정적인 고성능 웹서버라고만 알고 자세히 알지는 못합니다. 후에 조사하고 정리해봐야 할 것 같아요...)

이번 문제는 고객사가 기존에 제공하는 UI 대신 고객사 전용 포털로 사용하면서 발생했습니다.
고객사에서는 왜인지 모르지만 프로젝트 ID를 한글로(왜.. 왜 한글로 하시는 거에요ㅠ) 만들었고, 프로젝트 ID 검증을 UI쪽에서만 진행했던 게 문제였습니다.


😨 이게 무슨 에러람...

고객사에서 프로젝트를 삭제하려고 하는데 에러 알림창이 뜨면서 삭제가 진행되지 않는다고 했습니다. 그래서 "오잉? 아무리 한글이라도 ID가 유니크하기 때문에 괜찮은 게 아닌가? 혹시 ID가 중복이 되었나?"하는 생각도 했지만, 만약 정말 그랬다면 테스트를 전부 다 끝내기도 전에 연락이 왔을 겁니다. 그래서 저도 고객사와 똑같은 환경을 만들기 위해 임의로 한글 ID로 된 프로젝트를 생성하고 삭제하려고 보니...

무슨 에러일까 이게...?무슨 에러일까 이게...?

처음 보는 에러였습니다.
이게 무슨 에러일까 싶었지만 undertow에서 난 에러는 확실해보였습니다.
그렇다면 남은 건 검색뿐...! 한 번 검색을 해보았습니다.

다행히도 스택오버플로우WildFly Documentation에 해결 방법이 있더라구요. 내용을 쉽게 말씀드리자면 보안상의 이유로 기본적으로는 URL에 비 ASCII 문자를 처리하지 않고 있는데, 설정을 바꿔주면 가능하다는 내용이었습니다!!

저는 이 내용을 발견하고 바로 설정을 바꾸어주었더니 해결되었습니다.


🔨 해결 방법

설정은 application.properties 또는 application.yaml에서 바꿔주시면 됩니다.
Spring Common Application Properties깃헙에 있는 Undertow 소스 코드(UndertowOptions 클래스)를 참고하였습니다.
Maven 기준 설정은 아래와 같이 설정해주시면 됩니다.

server.undertow.options.server.allow-unescaped-characters-in-url=true

Gradle은 아래와 같이 설정해주시면 됩니다.

server:
  undertow:
    options:
      server:
        allow-unescaped-characters-in-url: true

🚀 이번 에러를 통해 느낀 점

역시 검증은 UI에서 한다고 해서 맘 놓을 것이 아니라 서버에서도 해줘야 한다는 게 맞는 것 같습니다. 평소에도 갖고 있는 생각이었지만 더욱 확고해졌습니다.
하지만 덕분에 새로운 것에 대해 알게 되어 기쁩니다.
이 글을 읽는 다른 분들한테도 도움이 되었으면 합니다 :)

0개의 댓글