다음은 HTTP 완벽 가이드 책을 읽고 정리한 내용입니다.
URL은 통합 자원 식별자(Uniform Resource Identifier) 혹은 URI라고 불리는 부분집합이다.
URI는 URL과 URN으로 구성된 종합적인 개념으로, URN은 이름만으로 리소스를 식별하며, URL은 위치로 리소스를 식별한다.
대부분 URL과 URI를 하나로 취급해서 설명한다.
대부분의 URL Scheme 문법은 일반적으로 9개 부분으로 나뉜다.
<스킴>://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<프래그먼트>
위의 문법을 모두 가지는 URL은 거의 없고, 스킴
, 호스트
, 경로
가 가장 중요하다.
컴포넌트 | 설명 |
---|---|
스킴 | 리소스를 가져오려면 어떤 프로토콜을 사용하여 서버에 접근해야하는지 가리킴 |
사용자 이름 | 몇몇 스킴은 리소스에 접근을 하기 위해 사용자 이름이 필요함 |
비밀번호 | 사용자의 비밀번호를 가리키며, 사용자 이름에 콜론으로 이어서 기술 |
호스트 | 리소스를 호스팅하는 서버의 호스트 명이나 IP 주소 |
포트 | 리소스를 호스팅하는 서버가 열어놓은 포트번호 (HTTP 기본 포트 번호 80) |
경로 | 서버 내 리소스가 서버 어디에 있는지를 가리킴, 서버와 스킴에 따라 문법이 다름 |
파라미터 | 특정 스킴들에서 입력 파라미터를 기술하는 용도 |
질의 | 스킴에서 애플리케이션에 파라미터를 전달하는데 쓰임 |
프래그먼트 | 리소스의 조각이나 일부분을 가리키는 이름, 서버에 전달되지 않음 |
FTP 서버와 같이 데이터에 접근하기 위해서는 사용자 이름과 비밀번호를 URL에 전달해야한다.
ftp://ftp.prep.ai.mit.edu/pub/gnu
ftp://anonymous:my_passwd@ftp.prep.ai.mit.edu/pub/gnu
ftp://joe:joespasswd@www.joes-hardware.com/sales_info.txt
위에 첫번째 예시처럼 사용자 이름이나 비밀번호 없이 접근할 수 있다.
근데 만약 사용자 이름과 비밀번호를 요구하지만, 입력하지 않은 경우 기본 값으로 사용자 이름은 anonymous
이고, 비밀번호는 브라우저마다 다르다.
사용자 이름과 비밀번호를 기술한 경우는 3번째 예시처럼 사용자 이름은 joe
이고, 비밀번호는 joespasswd
가 된다.
URL의 파라미터는 애플리케이션이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는데 사용한다.
이름/값 쌍의 리스트로 URL 나머지에 ;
문자로 구분하여 기술한다.
ftp://prep.ai.mit.edu/pub/gnu;type=d
이 예시의 경우 이름은 type
이고, 값은 d
인 한 개의 파라미터를 전달한다.
http:/www.joes-hardware.com/hammers;sale=false/index.html;graphics=true
위 URL에는 hammers와 index.html이라는 두 개의 경로 조각이 있다.
hammers 경로 조각은 값이 false인 sale이라는 파라미터를 가지고, index.html 경로 조각은 값이 true인 graphics 파라미터를 가지게 된다.
리소스의 특정 부분을 가리킬 수 있도록, URL은 프래그먼트를 제공한다.
예를 들어 URL은 HTML 문서에 있는 특정 이미지나, 일부분을 가리킬 수 있다.
http://www.joes-hardware.com/tools.html#drills
위 예시는 drills라는 프래그먼트로 해당 웹 서버에 위치한 /tools.html
웹 페이지의 일부를 가리킨다.
프래그먼트는 클라이언트에서만 다루고, 서버에는 전달하지 않는다.
URL은 상대 URL과 절대 URL 두 가지로 나뉜다. (상대 경로, 절대 경로)
지금까지의 예시는 절대 URL이며, 절대 URL은 리소스에 접근하는데 필요한 모든 정보를 가지고 있다.
상대 URL은 모든 정보를 담고 있지 않으며, URL을 짧게 표기하는 방식이다.
http://www.joes-hardware.com/tools.html
- 현재 URL (기저 URL)
http://www.joes-hardware.com/hammers.html
2개의 URL이 있고, 현재 URL은 tools.html이다.
해당 HTML 파일안에 ./hammers.html
을 가리키는 하이퍼링크가 이런식으로 작성되어 있다면, 이는 문서의 URL을 기준으로 상대 URL로 작성된 것이다.
어떤 브라우저들은 URL을 입력한 다음이나 입력하는 도중에 자동으로 URL이 확장된다. (자동완성)
자동으로 URL이 확장되기 때문에 URL 전체를 입력하지 않아도 되어 빠르고 편리하게 도와준다.
이러한 확장은 2가지 기능으로 나뉘어진다.
yahoo
를 입력하면, 브라우저는 호스트 명에 자동으로 www.
와 .com
을 붙여서 www.yahoo.com
을 만든다.http://www.joes-
처럼 이전에 방문했던 URL의 시작 부분을 입력하면, 브라우저는 http://www.joes-hardware.com
을 보여주게 된다.컴퓨터 시스템의 기본 문자 집합은 보통 영어 중심으로 설정되어 US-ASCII
문자 집합을 사용해왔다.
하지만 전 세계 사람들이 사용하다보니, 각 나라의 언어의 문자들은 US-ASCII
가 지원하지 않는다.
따라서 이러한 문자들을 지원하기 위해, URL 설계자들은 URL에 이스케이프 문자열을 쓸 수 있게하여 US-ASCII
에서 지원하지 않는 문자들을 인코딩할 수 있게 했다.
지원되지 않는 문자에는 공백도 포함된다. 따라서 공백은
%20
으로 처리된다.
몇몇 문자는 URL 내에서 예약어로 사용된다.
따라서 아래 표에 있는 예약어를 사용하기 위해서는 반드시 사용전에 인코딩해야 한다.
문자 | 선점 및 제한 |
---|---|
% | 인코딩된 문자에 사용할 이스케이프 토큰 |
/ | 경로에 있는 경로 세그먼트를 나누는 용도 |
. | 경로에서 사용 |
.. | 경로에서 사용 |
# | 프래그먼트의 문자 |
? | 질의 문자열의 문자 |
; | 파라미터의 문자 |
: | 스킴, 사용자 이름/비밀번호, 호스트/포트의 문자 |
$ , + | 선점 |
@ & = | 특정 스킴에서 특별한 의미로 사용 |
{}~[]` | 게이트웨이와 같은 여러 전송 에이전트에서 불안전하게 다루기에 제한 |
<>" | 안전하지 않음, 반드시 인코딩해서 사용해야하는 문자 |