HTTP 애플리케이션은 URL을 URI의 한 부분으로 취급한다.

2.4 안전하지 않은 문자

⭐️⭐️ URL 은 잘 호환되도록 설계되어있다. 그리고 URL은 인터넷에 있는 모든 리소스가 여러 프로토콜을 통해 전달될 수 있도록, 각 리소스에 유일한 이름을 지을 수 있게 설계되었다. 모든 프로토콜이 데이터를 전송하기 위해서 서로 다른 장치를 가지고 있기에, 어떤 인터넷 프로토콜을 통해서든 안전하게 전송될 수 있도록 URL 설계하는건 중요하다.

안전한 전송이란, 정보가 유실될 위험 없이 URL을 전송할 수 있다는것을 의미. 전자메일에 사용되는 SMTP 같은 프로코톨은 특정 문자를 제거할 수도 있는 전송 방식을 쓴다.(이는 메시지에 대해 7비트 인코딩을 쓰기 때문. 만약 소스가 8비트 이상으로 인코딩되어 있으면 정보가 소실될 수 있다.) 문자가 제거되는 일을 피하고자 URL 은 상대적으로 작고 일반적으로 안전한 알파벳 문자만 포함되도록 허락한다.

URL 설계자들은, 모든 인터넷 프로토콜로 URL 이 전송 될 수 있길 바랐고, 이와함께 가독성도 있기를 바랐다.

여기에 더해서 URL은 더 완벽해져야 했다. URL 설계자는 사람들이 URL에 이진데이터나 일반적으로 안전한 알파벳 외의 문자도 포함하려 할 때가 있다는걸 알게되었다. 그래서 이스케이프라는 기능을 추가하여, 안전하지 않은 문자를 안전한 문자로 인코딩할 수 있게 했다.

2.4.1 URL 문자 집합

컴퓨터 시스템의 기본 문자 집합은 보통 영어 중심이다. 역사적으로 많은 애플리케이션들이 US-ASCII 문자 집합을 써 왔다. 7비트를 사용하여 영문 자판에 있는 키 대부분과 몇몇 출력되지 않는 제어문자를 표현한다.

==비 영어 문자나 이진 데이터를 표현하기 위해서 URL 설계자들은 URL에 이스케이프 문자열을 쓸 수 있게 설계했다.==

2.4.2 인코딩 체계

안전한 문자 집합을 이용하는 경우 그 표현의 한계를 넘기 위해, URL에 있는 안전하지 않은 문자들을 표현할 수 있는 인코딩 방식이 고안되었다. 인코딩은 안전하지 않은 문자를 ’%‘기호로 시작해, ASCII 코드로 표현되는 두 개의 16진수 숫자로 이루어진 ‘이스케이프’문자로 바꾼다. 16 * 16 = 256 즉 256개의 ASCII 코드 표현이 되군.

&{0x}{0x}

2.4.3 문자 제한

몇몇 문자는 URL 내에서 특별한 의미로 예약되어 있다. 어떤 문자는 US-ASCII의 출력 가능한 문자 집합에 미포함이다. 어떤 문자는 몇몇 인터넷 게이트웨이와 프로토콜에서 혼동되는것으로 알려져 사용이 꺼려지기도 했다.

다음 표는 URL에서 예약된 문자들을 본래의 목적이 아닌 다른 용도로 사용하려면, 그 전에 반드시 인코딩 해야하는 문자들은 나열했다.

예약되지 않은 문자

  • 영문자: A-Z, a-z (0x41-0x5A, 0x61-0x7A)
  • 숫자: 0-9 (0x30-0x39)
  • 특수문자: - . _ ~ (0x2D, 0x2E, 0x5F, 0x7E)
  • ASCII 범위: 0x00 ~ 0x7F (0-127)

퍼센트 인코딩이 필요한 범위

  • 0x00-0x1F: 제어 문자들
  • 0x20: 공백 (스페이스) → %20
  • 0x7F: DEL 문자 → %7F
  • > 0x7F: 모든 비ASCII 문자 (한글, 중문 등)
문자선점 및 제한
%인코딩된 문자에서 사용할 이스케이프 토큰으로 선점
/경로 컴포넌트에 있는 경로 세그먼트를 나누는 용도로 선점
.경로 컴포넌트에서 선점
..경로 컴포넌트에서 선점
#프래그먼트의 구획 문자로 선점
?질의 문자열의 구획 문자로 선점
;파라미터의 구획 문자로 선점
:스킴, 사용자 이름/비번, 호스트/포트의 구획 문자로 선점
$ , +선점
@ & =특정 스킴에서 특별한 의미가 있기에 선점
{ } | \ 중앙점 ~ [ ] `게이트웨이와 같은 여러 전송 에이전트에서 불안전하게 다루기에 제한됨
< > “안전하지 않음. 웹 문서에서 URL을 구분 지어 표시하듯이(예를들어 ‘http://www.naver.com’), URL 범위 밖에서 역할이 있는 문자이기에 반드시 인코딩 해야한다
0x00-0x1F, 0x7F제한됨. 이 16진수 범위에 속하는 문자들은 인쇄되지 않는 US-ASCII 문자
> 0x7F제한됨, 이 16진수 범위에 속하는 문자들은 7비트 US-ASCII 문자가 아님