제가 다니고 있는 회사는 기본적으로 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에서 한다고 해서 맘 놓을 것이 아니라 서버에서도 해줘야 한다는 게 맞는 것 같습니다. 평소에도 갖고 있는 생각이었지만 더욱 확고해졌습니다.
하지만 덕분에 새로운 것에 대해 알게 되어 기쁩니다.
이 글을 읽는 다른 분들한테도 도움이 되었으면 합니다 :)