HTTP 완벽 가이드
책을 읽고 정리한 내용입니다.
URL은 인터넷의 리소스를 가리키는 표준이름이다. URL은 전자정보 일부를 가리키고 그것이 어디에 있고 어떻게 접근할 수 있는지 알려준다.
URL은 브라우저가 정보를 찾는데 필요한 리소스의 위치를 가리키며, URL을 이용해 사람과 애플리케이션이 인터넷상의 수십억 개의 리소스를 찾고 사용하며 공유할 수 있다.
URL은 통합 자원 식별자 혹은 URI라고 불리는 더 일반화된 부류의 부분집합이다. URI는 두 가지 주요 부분집합인, URL과 URN으로 구성된 종합적인 개념이다.
URL은 브라우저가 더 영리하게 리소스에 접근하고 그것을 다루게 함으로써 온라인 세상을 단순화시킨다. 애플리케이션은 URL을 사용하여 정보에 쉽게 접근할 수 있다. URL은 당신과 브라우저가 정보 찾는데 필요한 모든 것을 제공하며, 당신이 원하는 리소스가 어디에 위치하고 어떻게 가져오는지 정의한다.
대부분의 URL 스킴의 문법은 일반적으로 9개 부분으로 나뉜다.
<스킴>://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<플래그먼트>
이 모든 컴포넌트를 가지는 URL은 거의 없다. URL의 가장 중요한 세 가지 컴포넌트는 스킴, 호스트, 경로다.
컴포넌트 | 설명 | 기본값 |
---|---|---|
스킴 | 리소를 가져오려면 어떤 프로토콜을 사용하여 서버에 접근해야 하는지 가리킨다. | 없음 |
사용자 이름 | 몇몇 스킴은 리소스에 접근을 하기 위해 사용자 이름을 필요로 한다. | anonymous |
비밀번호 | 사용자의 비밀번호를 가리키며, 사용자 이름에 콜론(:)으로 이어서 기술한다. | <이메일 주소> |
호스트 | 리소스를 호스팅하는 서버의 호스트 명이나 IP 주소. | 없음 |
포트 | 리소스를 호스팅 하는 서버가 열어놓은 포트번호. | 스킴에 따라 다름 |
경로 | 이전 컴포넌트와 빗금(/)으로 구분되어 있으며, 서버 내 리소스가 어디에 있는지를 가리킨다. | 없음 |
파라미터 | 특정 스킴들에서 입력 파라미터를 기술하는 용도로 사용한다. | 없음 |
질의 | 스킴에서 애플리케이션에 파라미터를 전달하는데 쓰인다. | 없음 |
프래그먼트 | 리소스의 조각이나 일부분을 가리키는 이름이다. | 없음 |
스킴은 주어진 리소스에 어떻게 접근하는지 알려주는 중요한 정보다. 이는 URL을 해석하는 애플리케이션이 어떤 프로토콜을 사용하여 리소스를 요청해야 하는지 알려준다.
애플리케이션이 인터넷에 있는 리소스를 찾으려면, 리소스를 호스팅하고 있는 장비와 그 장비 내에서 리소스에 접근할 수 있는 서버가 어디에 있는지 알아야 한다. URL의 호스트와 포트 컴포넌트는 그 두 가지 정보를 제공해준다.
호스트 컴포넌트는 접근하려고 하는 리소스를 가지고 있는 인터넷상의 호스트 장비를 가리킨다.
포트 컴포넌트는 서버가 열어놓은 네트워크 포트를 가리킨다.
사용자 이름과 비밀번호를 기술하지 않고 URL에 접근하면, 기본 사용자 이름 값으로 'anonymous'가, 비빌번호는 브라우저가마다 가지고 있는 기본값을 사용한다.(크롬은 'chrome@example.com')
http://user:password@www.google.com/test.txt
@
과 :
문자는 URL로부터 사용자 이름과 비밀번호 컴포넌트를 분리한다.
URL의 경로 컴포넌트는 리소스가 서버의 어디에 있는지 알려준다. HTTP URL에서 경로 컴포넌트는 '/'문자를 기준으로 경로조각으로 나뉜다.
URL을 사용하는 애플리케이션이 리소스에 접근하려면 프로토콜 파라미터가 필요하다. URL의 파라미터 컴포넌트는 애플리케이션이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는데 사용한다. 이 컴포넌트는 이름/값 쌍의 리스트로 URL 나머지 부분들로부터 ';' 문자로 구분하여 URL에 기술한다. 이를 통해 애플리케이션이 리소스에 접근하는데 필요한 어떤 추가 정보든 전달할 수 있다.
http://www.google.com/hammers;sale=false/index.html;graphics=true
위 URL에는 hammers와 index.html이라는 두 개의 경로조각이 있다. hammers 경로조각은 값이 false인 sale이라는 파라미터를 가진다. index.html 경로조각은 값이 true인 graphics란 파라미터를 가진다.
데이터베이스 같은 서비스들은 요청받을 리소스 형식의 범위를 좁하기 위해서 질문이나 질의를 받을 수 있다.
http://www.joes-hardware.com/inventory-check.cgi?item=12731
아이템 번호 12731의 재고가 있는지 확인하기 위해서 웹 데이터베이스 게이트웨이에 질의하는데 사용된다.
리소스의 특정 부분을 가리킬 수 있도록, URL은 리소스 내의 조각을 가리킬 수 있는 프래그먼트 컴포넌트를 제공한다. 예를 들어 URL은 HTML 문서에 있는 특정 이미지나 일부분을 가리킬 수 있다.
프래그먼트는 URL의 오른쪽에 # 문자에 이어서 온다.
http://www.joes-hardware.com/tools.html#drills
이 예에서 drills라는 프래그먼트는 죠의 컴퓨터 가게 웹 서버에 위치한 /tools.html 웹페이지의 일부를 가리킨다. 그 부분을 'drills'라고 기술하였다.
http://www.joes-hardware.com/tools.html#drills
를 가리키는 링크를 선택한다.http://www.joes-hardware.com/tools.html
을 요청한다. (프래그먼트는 서버로 보내지 않는다.)상대 URL은 리소스 안에 있는 리소스를 간결하게 기술하는데 사용할 수 있다.
URL은 상대 URL과 절대 URL 두 가지로 나뉜다. 상대 URL은 URL을 짧게 표기하는 방식이다. 상대 URL 문법에 따르면, HTML 작성자는 URL에 스킴과 호스트 그리고 다른 컴포넌트들을 모두 입력하지 않아도 된다. 그 정보는 컴포넌트가 포함된 리소스의 기저 URL에서 알아낼 수 있다.
<BASE>
HTML 태그를 기술할 수 있다../hammers.html
. 기저 URL은 http://www.joes-hardware.com/tools.html
../hammers.html
) 컴포넌트와 상속받은 컴포넌트를(스킴: http
, 호스트: www.joes-hardware.com
, 포트: 80) 합치면, 새로운 절대 URL인 http://www.joes-hardware.com/hammers.html
을 얻을 수 있다.어떤 브라우저들은 URL을 입력한 다음이나 입력하고 있는 동안에 자동으로 URL을 확장한다.
호스트 명 확장 기능을 지원하는 브라우저는 단순한 휴리스틱만을 사용해서 입력한 호스트 명을 전체 호스트 명으로 확장할 수 있다. 예를 들어 주소 입력란에 'yahoo'를 입력하면, 브라우저는 호스트 명에 자동으로 'www.'와 '.com'을 붙여서 'www.yahoo.com'을 만든다.
하지만 호스트 명에 대한 확장 기능은 프락시와 같은 다른 HTTP 애플리케이션에 문자를 발생시킬 수도 있다.
사용자가 URL을 입력하는 시간을 줄이고자, 브라우저가 사용하는 또 다른 기술은 과거에 사용자가 방문했던 URL의 기록을 저장해 놓는 것이다. URL을 입력하면, 그 입력된 URL의 앞 글자들을 포함하는 완결된 형태의 URL들을 선택하게 해준다.
안전한 전송이란, 정보가 유실될 위험 없이 URL을 전송할 수 있다는 것을 의미한다. 전자메일에 사용되는 SMTP 같은 프로토콜은 특정 문자를 제거할 수도 있는 전송 방식을 사용한다.
URL 설계자는 사람들이 URL에 이진데이터나 일반적으로 안전한 알파벳 외의 문자도 포함하려고 할 때가 있다는 것을 알게 되었다. 그래서 이스케이프라는 기능을 추가하여, 안전하지 않은 문자를 안전한 문자로 인코딩할 수 있게 하였다.
US-ASCII는 만들어진 지 오래된 문자 집합이기 때문에, 적은 수의 문자만을 포함하고 있다. 유럽 언어나 비 라틴계 언어들에 존재하는 변형된 문자들까지 지원하지는 않는다. 그뿐만 아니라 URL이 특정 이진 데이터를 포함해야 하는 경우도 있다. 이런 것들을 지원하기 위해서 URL 설계자들은 URL에 이스케이프 문자열을 쓸 수 있게 설계하였다. 이스케이프 문자열은 US-ASCII에서 사용이 금지된 문자들로, 특정 문자나 데이터를 인코딩할 수 있게 함으로써 이동성과 완성도를 높였다.
안전한 문자 집합을 이용하는 경우 그 표현의 한계를 넘기 위해, URL에 있는 안전하지 않은 문자들을 표현할 수 있는 인코딩 방식이 고안되었다. 인코딩은 안전하지 않은 문자를 퍼센티지 기호(%)로 시작해 ASCII 코드로 표현되는 두 개의 16진수 숫자로 이루어진 '이스케이프' 문자로 바꾼다.
문자 | 선점 및 제한 |
---|---|
% | 인코딩된 문자에 사용할 이스케이프 토큰으로 선점 |
/ | 경로 컴포넌트에 있는 경로 세그먼트를 나누는 용도로 선점 |
. | 경로 컴포넌트에서 선점 |
.. | 경로 컴포넌트에서 선점 |
# | 프래그먼트의 구획 문자로 선점 |
? | 질의 문자열의 구획 문자로 선점 |
; | 파라미터의 구획 문자로 선점 |
: | 스킴, 사용자 이름/비밀번호, 호스트/포트의 구획 문자로 선점 |
$, + | 선점 |
@ & = | 특정 스킴에서 특별한 의미가 있기 때문에 선점 |
{} | \ ∙ ~ [] ' | 게이트웨이와 같은 여러 전송 에이전트에서 불안전하게 다루기 때문에 제한됨 |
<> " | 안전하지 않음. 웹 문서에서 URL을 구분지어 표시하듯이 URL 범위 밖에서 역할이 있는 문자 |
0x00-0x1F, 0x7F | 제한됨. 이 16진수 범위에 속하는 문자들은 인쇄되지 않는 US-ASCII 문자다. |
> 0x7F | 제한됨. 이 16진수 범위에 속하는 문자들은 7비트 US-ASCII 문자가 아니다. |
애플리케이션은 정해진 방식대로 구현해야 한다. 어떤 애플리케이션에 어떤 URL을 보내든지, 그 전에 클라이언트 애플리케이션에서 안전하지 않거나 제한된 문자를 변환하는 것이 좋다.
해당 문자들을 직접 입력 받는 애플리케이션이야말로 어떤 문자를 인코딩해야 하는지 결정하기에 가장 좋은 위치이다.
URL은 강력한 도구다. URL은 세상에 존재하는 모든 객체에 이름을 지을 수 있고, 새로운 포맷을 쉽게 추가할 수 있게 설계됐다. URL은 인터넷 프로토콜 간에 공유할 수 있는 일관된 작명 규칙을 제공한다.
하지만 URL이 완벽한 것은 아니다. 사실 URL은 주소이지 실제 이름은 아니다. 이는 URL이 특정 시점에 어떤 것이 위치한 곳을 알려준다는 것을 뜻한다. URL은 리소스를 찾는데 필요한 포트와 서버 이름을 제공한다. 이런 스킴의 단점은 리소스가 옮겨지면 URL을 더는 사용할 수 없다는 것이다.
URN은 객체가 옮겨지더라도(웹 서버 내에서나 웹 서버 간 모두) 항상 객체를 가리킬 수 있는 이름을 제공한다. 지속 통합 자원 지시자 (PURL)을 사용하면 URL로 URN 기능을 제공할 수 있다.