특수 문자 URL 인코딩: 개발자 레퍼런스
공백, 앰퍼샌드, 유니코드 등 특수 문자의 URL 인코딩을 다루는 종합 레퍼런스입니다.
URL의 특수 문자
URL은 RFC 3986에 정의된 엄격한 문법을 따릅니다. 많은 문자가 특별한 의미를 가지거나 URL의 특정 위치에서는 허용되지 않습니다. 이러한 문자를 올바르게 인코딩하는 방법을 이해하는 것은 안정적인 웹 애플리케이션과 API를 구축하는 데 필수적입니다.
공백 문자
공백 문자는 가장 흔하게 인코딩되는 문자입니다. 다만 상황에 따라 두 가지 방식으로 인코딩될 수 있습니다.
%20- RFC 3986 percent-encoding으로, URL 경로를 비롯한 대부분의 상황에서 사용됩니다+-application/x-www-form-urlencoded형식(HTML 폼 제출)에서 사용됩니다
URL을 프로그래밍 방식으로 생성할 때는 일관성을 위해 %20을 사용하는 것이 좋습니다. 폼 데이터를 구성할 때는 + 표기가 표준입니다.
예약 문자 자세히 살펴보기
앰퍼샌드 (&)
앰퍼샌드는 쿼리 파라미터를 구분합니다. 앰퍼샌드가 파라미터 값 안에 나타날 경우, 구분자로 해석되지 않도록 %26으로 인코딩해야 합니다. HTML 문맥에서는 엔티티 형태인 &로도 인코딩해야 합니다.
물음표 (?)
물음표는 경로와 쿼리 문자열을 구분합니다. 물음표가 파라미터 값 안에 나타날 경우 %3F로 인코딩해야 합니다. encodeURI()는 물음표를 인코딩하지 않지만, encodeURIComponent()는 인코딩한다는 점에 유의하세요.
해시 (#)
해시 기호는 프래그먼트 식별자를 시작합니다. URL에서 쿼리 파라미터 값에 포함된 #는 반드시 %23으로 인코딩해야 합니다. 그렇지 않으면 브라우저가 그 뒤의 모든 내용을 프래그먼트 식별자로 해석하여 서버로 전송하지 않습니다.
슬래시 (/)
슬래시는 경로 세그먼트를 구분합니다. 슬래시가 경로 세그먼트 값 안에 나타날 경우(예: 슬래시를 포함한 파일 이름), %2F로 인코딩해야 합니다. 다만 일부 서버는 %2F를 디코딩한 뒤에도 여전히 경로 구분자로 취급할 수 있다는 점에 유의하세요.
유니코드 문자
ASCII가 아닌 문자는 먼저 UTF-8 바이트 시퀀스로 변환한 다음, 각 바이트를 percent-encoding하여 인코딩합니다. 몇 가지 예를 들면 다음과 같습니다.
- 예음 부호가 붙은 라틴 문자 e(e) → UTF-8: 0xC3 0xA9 →
%C3%A9 - 한자 중(zhong) → UTF-8: 0xE4 0xB8 0xAD →
%E4%B8%AD - 이모지 지구본(globe) → UTF-8: 0xF0 0x9F 0x8C 0x8D →
%F0%9F%8C%8D
URL 구성 요소별 인코딩
| 구성 요소 | 인코딩해야 하는 문자 | 예시 |
|---|---|---|
| 경로 세그먼트 | 공백, ?, #, 그리고 비ASCII 문자 | /path/my%20file |
| 쿼리 키 | =, &, #, +, 공백 | my%20key=value |
| 쿼리 값 | &, #, +, 공백, = | key=hello%20world |
| 프래그먼트 | 공백 및 비ASCII 문자 | #section%20one |
흔히 저지르는 실수
- 쿼리 값에서
#를 인코딩하지 않는 경우(URL의 나머지 부분이 조용히 사라집니다) - 이미 인코딩된 문자열을 이중으로 인코딩하는 경우(
%20대신%2520이 됩니다) - 파라미터 값에
encodeURIComponent()대신encodeURI()를 사용하는 경우 - 쿼리 값에서
+를 인코딩하지 않는 경우(공백으로 디코딩됩니다) - 모든 서버가 경로에서
%2F를 동일하게 처리한다고 가정하는 경우