URL 인코딩 완벽 가이드
URL 인코딩에 관한 모든 것을 알아보세요. URL 인코딩이란 무엇이고 왜 중요한지, 퍼센트 인코딩은 어떻게 동작하는지, 그리고 URL에서 특수 문자를 다루는 모범 사례까지 다룹니다.
URL 인코딩이란?
퍼센트 인코딩(percent-encoding)이라고도 불리는 URL 인코딩은 특정 상황에서 URI(Uniform Resource Identifier)에 정보를 인코딩하기 위한 메커니즘입니다. URL 인코딩이라는 이름으로 알려져 있지만, 실제로는 URL(Uniform Resource Locator)과 URN(Uniform Resource Name)을 모두 포함하는 상위 개념인 URI 집합 전반에서 더 넓게 사용됩니다.
URL은 인터넷을 통해 ASCII 문자 집합으로만 전송할 수 있기 때문에 이러한 인코딩이 필요합니다. URL에는 ASCII 집합에 속하지 않는 문자가 포함되는 경우가 많으므로, URL을 유효한 ASCII 형식으로 변환해야 합니다. URL 인코딩은 안전하지 않은 ASCII 문자를 % 기호와 그 뒤에 오는 두 자리 16진수로 치환합니다.
퍼센트 인코딩은 어떻게 동작하나요?
퍼센트 인코딩 메커니즘은 인코딩이 필요한 각 문자를 하나 이상의 바이트로 변환하는 방식으로 동작합니다. 그런 다음 각 바이트는 퍼센트 기호와 두 자리 16진수로 표현됩니다. 이 16진수는 지정된 인코딩(일반적으로 UTF-8)에서 해당 문자의 바이트 값을 나타냅니다.
예를 들어 공백 문자(ASCII 값 32, 16진수 20)는 %20이 됩니다. 앰퍼샌드 &(ASCII 값 38, 16진수 26)는 %26이 됩니다. 억음 부호가 있는 e와 같은 비 ASCII 문자는 먼저 UTF-8 바이트 시퀀스로 인코딩된 다음, 각 바이트가 퍼센트 인코딩됩니다.
예약 문자와 비예약 문자
RFC 3986은 URI에서 사용하는 문자를 예약 문자(reserved)와 비예약 문자(unreserved)의 두 가지 범주로 정의합니다. 비예약 문자에는 대문자와 소문자(A-Z, a-z), 숫자(0-9), 하이픈(-), 마침표(.), 밑줄(_), 물결표(~)가 포함됩니다. 이러한 문자는 인코딩 없이 URI에 그대로 포함할 수 있습니다.
예약 문자는 URL 구문에서 특별한 의미를 갖습니다. 여기에는 :, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ;, =가 포함됩니다. 이러한 문자를 예약된 용도가 아닌 다른 목적으로 URI 구성 요소에 사용할 때는 반드시 퍼센트 인코딩해야 합니다.
여러 언어에서의 URL 인코딩
JavaScript
JavaScript는 URL 인코딩을 위해 두 쌍의 함수를 제공합니다. 완전한 URI를 인코딩하는 encodeURI() / decodeURI()와 개별 URI 구성 요소를 인코딩하는 encodeURIComponent() / decodeURIComponent()입니다. 핵심적인 차이는 encodeURI()가 URI에서 특별한 의미를 갖는 예약 문자(예: /, ?, #)를 그대로 보존하는 반면, encodeURIComponent()는 영숫자가 아닌 모든 문자를 인코딩한다는 점입니다.
Python
Python의 urllib.parse 모듈은 기본 인코딩/디코딩을 위한 quote()와 unquote(), 그리고 딕셔너리를 쿼리 문자열로 인코딩하는 urlencode()를 제공합니다. quote() 함수는 인코딩하지 않을 문자를 지정하는 선택적 safe 매개변수를 받습니다.
PHP
PHP는 공백을 +로 인코딩하는 urlencode()(application/x-www-form-urlencoded 형식을 따름)와 공백을 %20으로 인코딩하는 rawurlencode()(RFC 3986을 따름)를 제공합니다. 디코딩할 때는 각각 urldecode()와 rawurldecode()를 사용합니다.
모범 사례
- 사용자 입력을 URL에 포함하기 전에 항상 인코딩하세요
- JavaScript에서 쿼리 매개변수 값을 인코딩할 때는
encodeURIComponent()를 사용하세요 encodeURI()는 완전한 URI를 인코딩할 때만 사용하세요- 애플리케이션 전반에 걸쳐 일관된 인코딩 방식을 유지하세요
- 서버 측에서 처리하기 전에 항상 URL을 디코딩하세요
- 유니코드를 포함한 특수 문자로 인코딩을 테스트하세요
- URL을 이중으로 인코딩하지 마세요. 문자열이 이미 인코딩되어 있는지 항상 확인하세요