티스토리 뷰

learning

URL/URI Encoding 에 관한 메모.

눈침침 2009. 11. 18. 01:00
  오늘 회사에서 URL(-보다 정확하게 말하자면 URI)에 한글이 포함되어 있는 경우,  서버에서 인코딩이 잘못되어 오류가 발생하는 문제가 있었다. 당시에는 언발에 오줌 누듯 인터넷에서 해결책을 찾아보기 급급했지만, 집에와서 원인이 무엇인지 하나하나씩 따져보았다.(-예전부터 한글, 인코딩, 이런거에 관심이 많았다. 나에게 너무 부족한 부분이기도 하고,)


증상

  좀더 구체적으로 표현하자면, 다음과 같다.
http://localhost:8080/JavaWebPlayground/encodinggame/한글.data
브라우져에서 위와 같은 주소로 접근하였고, 서버에서는 다음과 같이 값을 읽어오고 있었다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  logger.trace("RequestPath is:" + request.getPathInfo());
}
그 값이 다음과 같이 표시되는 것이였다.


공부

  한글을 브라우져 주소창에 입력하면 %4D 뭐 이런 형태로 변하는 건 알고 있었다. URL에 입력가능한 문자 스펙에 한글이 없기 때문인데, 다른 방법으로 유니코드(UTF-8)를 %와 함께 보내도록 정했다고 한다.
 예를 들어 '가' 라는 문자가 있다면 '가'는 유니코드로 ea b0 80 이며 따라서 %ea%b0%80 으로 인코딩된다.(대소문자는 구분하지 않는다.)

 그렇담, 브라우져에선 U'TF-8'으로 기대했던 것과 같이 보내고 있던 게 아닌가. 이제 서버쪽 코드로 관심사를 옮겨보았다. getPathInfo()가 왜 그렇게 해석하고 있는지를... 웹에서 검색해보니 동일한 질문을 발견 답변이 다음과 같았다.

Hi,
I guess you're not a big fan of JavaDocs? ;) Check out the JavaDoc for HttpServletRequest#getPathInfo, especially the "Returns" section, which is fairly unambiguous as these things go ...


굳이 대충 느낌 대로(?) 번역을 하자면, "안녕~ 넌 자바독도 안보냐!! HttpServletRequest#getPathInfo 에서 특히 Returns 좀 잘 사펴보시지~ "뭐 이런 내용? 보고 나도 뜨끔 했다. 그래서 찾아봤다. 자바독(Java Doc) 그 Returns의 내용을...

a String, decoded by the web container, specifying extra path information that comes after the servlet path but before the query string in the request URL; or null if the URL does not have any extra path information


 그렇군, web container 설정에 따라서 해석하는 것이로군!! 그럼 이제 문제는 web container!!.. 현재 테스트 환경은 Web Container가 Tomcat 이라서 다시 웹에서 "Tomcat URI encoding setting"으로 검색해 보니,  server.xml 의 connector 태그에 다음 속성을 하나 추가해 주면 된다고 "바로" 나온다. (요기서.)
URIEncoding="UTF-8"


적용

tomcat의 server.xml 파일에서 8080포트에 대한 connector 를 다음과 같이 수정.
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"  URIEncoding="UTF-8"/>
다시 테스트 해보니,

잘 된다. 이로써 결론은!! 코드에는 문제가 없었다?정도? ㅡㅡ;

참고자료
* 클라이언트 인코딩 관련 내용은: iolo 형아의 자바스크립트의 encodeURI와 친구들 을.. 함 보자.

그리고...
Tomcat은 URIEncoding을 지정해주지 않을 경우 무엇으로 인코딩하는지 궁금해 졌다. 그 건 Apache Tomcat Configuration Reference 를 찾아보니 다음과 같이 나오더라는...
URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.
그냥 그렇단다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함