장고(Django) urlencode
요즘 거의 모든 프로그래밍 언어들은 유니코드(unicode)를 지원하고, 또한 유니코드 기반으로 프로그램이 돌아간다. 그래서 예전처럼 한글에 대한 특별한 경계심 없이 개발을 하곤 한다.
그런데 특이한 일이 발생했다.
웹 서버 로그 모니터링 중에 400 에러가 발생했다. 원인을 찾아가다 보니 전혀 엉뚱한 곳에서 문제점을 발견했다.
- 400 에러는 IE(인터넷 익스플로러) 브라우저에서만 발생했다.
- 400 에러가 발생하는 IE 버전이 일정하지 않다. 같은 버전에서도 일정하지 않다.
- 한글이 urlencode 된 부분에서 발생한다. (원인을 찾고 나서야 알았다.)
Web Server Log:
"GET /sample/log/%B0%B3%BF%AA%C7%D1%B1%DB%C6%C7/ HTTP/1.1" 400 - "" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
한참을 헤매다가... 정말 우연히 원인을 찾았다. (구글링의 힘이었다. 땡큐~구글)
%B0%B3%BF%AA%C7%D1%B1%DB%C6%C7 <- 이 부분이 한글이 urlencode 된 부분이다. 동일한 다른 로그와 비교해 봤더니, 이 부분의 값이 달랐다.
왜 다를까? 어떻게 다른 걸까? 무엇 때문에 달라진걸까?
결론은 특정 IE(인터넷 익스플로러) 브라우저에서 한글을 urlencode 할 때, 그 한글의 charset을 euc-kr로 인식하고 urlencode를 하는 것이다. 나머지 다른 부분에서는 utf-8 한글로 처리하면서 urlencode에서만 euc-kr로 잘못 인식을 해서 처리한다.
해당 한글을 euc-kr에서 urlencode 한 결과와 utf-8에서 urlencode 한 결과를 가지고 웹 서버 로그를 확인해 보니, 각각 그 값이 동일하다는 것을 확인했다.
헉 ... 한글을 url에 거리낌없이 사용했는데... 이를 어찌해야 하나 ...
방법이 없다. 고민 끝에 url에 들어가는 한글은 urlencode를 했다.
다음은 장고(Django)에서 설정한 예시다.
view:
return HttpResponseRedirect('/sample/log/%s/' % (quote(volume.encode('utf8'))))
template:
<a href="/sample/?keyword={{Keyword|urlencode}}"> sample search </a>
사족 : IE(인터넷 익스플로러)는 여전히 기대(?)를 저버리지 않는 것 같다.
- 추가 확인 사항 -
자바 스크립트에서 한글을 사용하는 경우에도 주의를 기울여야 할 것 같다.
먼저, charset 설정이다.
<script type="text/javascript" src="path/file.js" charset="utf-8"></script>
두번째, encoding이다.
escape <-> unescape
encodeURI <-> decodeURI
encodeURIComponent <-> decodeURIComponent
- 개발자 A -