Encoding URL (a.k.a Percent Encoding)

개발을 하다가 URL을 왜 Encoding 해야 하는가? 라는 생각이 들자 갑자기 URL을 Encoding 한다는게 의미하는게 정확히 뭔가? 라는 생각이 들었다.

URL을 Encoding해야 되는 이유는 크게 2가지다.

1. RFC3986에 따르면 URL은 ASCII Character-set으로만 구성되어야 하기 때문에 한글을 포함한 대부분의 외국어나 ASCII에 정의되지 않은 특수문자의 경우 URL에 포함될 수 없기 때문에.

2. URL 내에서 의미를 갖고 있는 문자(%, ?, #)나 URL에 올 수 없는 문자 (Space) 혹은 System에서 해석이 될 수 있는 문자(<, >)를 치환하여 야기될 수 있는 문제점을 예방하기 위해. 
* URL에서 문제를 야기할 수 있는 문자들은 이 링크에 잘 정리되어 있습니다.

1) 태초에 URL은 ASCII Character-set으로만 구성되도록 설계되었고, 인터넷 초창기에는 이러한 부분이 크게 문제가 되지도 불편하지도 않았을 거다.  2) 허나 시간이 흐르고, 예상과 다르게 인터넷이 빅히트를 치고 URL이 세계적으로 광범위하게 사용됨에 따라, ASCII의 128개 Character-set으로만 URL을 구성하는건 마치 딸기맛 새콤달콤 밖에 만들 수 없는 제약과 비슷하게 느껴졌을 것이다. 또한 세종대왕 포함 각국의 오피니언 리더들은 모국어로 URL을 만들고 싶은 바램이 있었을 것이다.  3) 이러한 시대의 바램에 부응하기 위해 URL은 ASCII의 한계를 벗어나는 노력을 게을리 하지 않았고, 마침내 Percent Encoding이라는 꼼수라면 꼼수요, 규약이라면 규약을 통해 ASCII의 한계를 벗어날 수 있었던 것이다.

URL Encoding은 어떻게 이루어지는가?

URL Encoding stands for encoding certain characters in a URL by replacing them with one or more character triplet(s) that consist of the percent character %” followed by two hexadecimal digits.

위의 문장이 가장 깔끔하게 URL Encoding을 정의한다. URL에서 문제가 될 수 있는 문자를 %와 2개의 16진수로 구성된 triplet(s)들로 치환한다. 몇개의 triplet으로 하나의 문자를 표현하는지는 Encoding Type과 치환하려는 글자의 종류에 따라 다르다.

Examples) URL Encoding이 필요한 경우와 before & after.

  • ASCII에 정의되지 않는 문자가 포함된 경우. (라틴어는 UTF-8 기준 2byte로 표현된다.) 
    Ex) François  ->Fran%C3%A7ois
  • ASCII에 정의되지 않는 문자가 포함된 경우. (한글은 UTF-8 기준 3byte로 표현된다.) 
    Ex) 왜 -> %EC%99%9C
  • URL에 공백이 포함된 경우. (URL에는 공백이 포함될 수 없기 때문에 %20으로 치환된다) 
    Ex) hello world -> hello%20world
  • %는 URL Encoding을 판단하는 문자로 % 이후는 인코딩 타입으로 인식한다. 따라서 %를 그대로 URL로 전달할때는 %25로 치환해야한다. 
    Ex) 50%people -> 50%25people
  •  #은 URL에서 Fragment 구분자로 사용되기 때문에 #을 그대로 사용하려면 %23으로 치환해서 사용해야 한다. 
    Ex) apple# -> apple%23

위의 설명에 가장 부합하도록 URL(URI)을 Encoding 해주는 Library는 commons-httpclient에 포함되어 있는 URIUtil Class의 encodeQuery(String) 함수가 가장 원하는 결과를 반환하는 것 같다.

* References (More examples and practice) 
http://www.ietf.org/rfc/rfc3986.txt 
http://www.url-encode-decode.com/ 
http://bluestarblogkr.blogspot.kr/2011/10/url-encoding.html


'Knowledge' 카테고리의 다른 글

[MS-SQL] 테이블 복사  (0) 2018.03.16
[MS-SQL] date와 Datetime의 차이점  (1) 2018.03.16
PSTN  (0) 2018.03.04
C# Winforms Message Box  (0) 2018.03.04
Wave 파일 압축 코덱 비교  (0) 2018.02.24

+ Recent posts