-
[IIS] IIS는 URL인코딩에서 "+" 와 공란을 구분하지 못한다.서버 관리/Windows 2021. 1. 16. 00:06반응형
웹 개발을 하는사람들은 한번쯤 고생해보는 통과의례가 있다. URL인코딩. 문자열을 %코드로 바꾸기 때문에 퍼센트인코딩이라고도 불린다.
https://ko.wikipedia.org/wiki/%ED%8D%BC%EC%84%BC%ED%8A%B8_%EC%9D%B8%EC%BD%94%EB%94%A9
웹 통신은 크게 GET, POST 2가지가 존재한다. PUT, DELETE, PATCH도 있긴하지만 데이터를 URL을 통해 통신하는가(GET), Form 이나 별도 방식을 통해 HTTP 통신의 Body구조에 데이터를 담아 통신하는가(POST) 로 나눈다면 2가지이다.
그 중 GET 방식으로 통신하는 기능을 구현하고나서 ?, =, & 등 특수문자가 포함된 데이터를 통신 할때 한번쯤 "왜 안되지?"를 외치고 원인을 찾아보았을 것이다.
?나 = 등 일부 특수문자는 URL에 파라메터를 구분하는 일종의 '예약어'이다. 그렇기 때문에 예약어로 사용하는 특수문자 그 자체를 아무런 변환없이 데이터로 보내면, 원하는 데이터가 제대로 전달되지 않게 된다.
이것을 해결하기위해 처리하는것이 URL인코딩이다. 전달할 데이터를 %코드로 변경해서 전달하는것이다.
Javascript에는 encodeURI, encodeURIComponent 함수로 처리하며, axios나 기타 라이브러리를 통해 처리할 경우 라이브러리 자체에서 알아서 처리해주기 때문에 모르고 쓰는 경우도 있다.
서두가 길었다. 최근 개발한 웹서비스에서 URL인코딩이 적용되었음에도 불구하고 파일명이 제대로 인식되지 않는 이슈가 생겼다. 원인은 예상대로 특수문자 때문이다. 파일명에 "+"가 포함되어 있었는데 서버에선 +가 없어지고, 공란이 그 자리를 대신하고 있었다.
+ 는 인코딩하면 %2B, 공란은 %20 이다. 그런데 서버에선 둘다 공란으로 인식했다. 왜 그런지 원인을 검색해봤지만 찾기 어려웠다. 그나마 힌트는 얻을 수 있었다.
https://www.w3schools.com/tags/ref_urlencode.ASP
해당 사이트에서 "URLs cannot contain spaces. URL encoding normally replaces a space with a plus (+) sign or with %20." 라고 쓰인 문장이 있는데, 직역하면 "URL은 공백을 포함할 수 없습니다. + 나 %20 으로 대체합니다." 라고 한다.
그래서 "서버 원인은 아니구나. 골만 아프게 되었다." 라고 생각했었다.
그런데 아니었다.
원인은 IIS 였다.
모든 개같은 원인은 IIS에서 나오는 것 같다.https://stackoverflow.com/questions/4604392/symbol-problem-in-url-in-iis-7-x
스택오버플로우에서 검색한 결과 IIS 7.5 이상에선 보안사유로 URL 필터링 설정이 되어있다고 한다. "+" 기호를 사용하려면 아래와 같이 web.config 파일에 allowDoubleEscaping 값을 추가해줘야 한다.
<system.webServer> <security> <requestFiltering allowDoubleEscaping="true"> </requestFiltering> </security>
반응형'서버 관리 > Windows' 카테고리의 다른 글
[SSH] Windows OS에서 SSH 연결시 bad owner or permissions 오류 해결 (0) 2021.11.06 [Docker] Windows 10 환경에서 Docker 개발환경 구축 (0) 2021.02.21 [Windows] CMD로 계정 추가/삭제 (0) 2017.11.18 [VM] 무료 Windows VM 제공 사이트 (developer.microsoft.com) (0) 2017.05.21 [IIS] IIS 설치 및 외부게시 (2) 2015.01.01