2장 URL과 리소스
인터넷의 리소스 탐색하기
리소스 : 웹에서 사용되는 식별을 할 수 있는 모든 자원
URL : 브라우저가 정보를 찾는데 필요한 리소스의 위치
- URI(Uniform Resource Identifier)의 부분집합이다.
- HTTP명세에서는 URI를 더 일반화된 개념의 리소스 식별자로 사용하나 대부분 URL과 URI를 혼용해서 사용한다.
- 예를 들어
http://www.joes-hardware.com/seaseon/index-fall.html
이라는 URL을 불러오면http
는 URL의 스킴으로 어떻게 웹 클라이언트가 리소스에 접근하는지 알려준다.www.joes-hardware.com
은 서버의 위치이다. 웹 클라이언트가 리소스가 어디에 호스팅되어 있는지 알려준다./seaseon/index-fall.html
은 리소스의 경로다. 경로는 서버에 존재하는 로컬 리소스들 중에서 요청 받은 리소스가 무엇인지 알려준다.
- URL은 HTTP 프로토콜이 아닌 다른 가용한 프로토콜을 사용할 수도 있다. 이메일 주소
mailto
, FTP서버의 파일ftp
, 스트림ㅁ밍을 제공하기 위해 비디오 서버에 호스팅하고 있는 영화rtsp
- 이렇게 URL을 사용하면 리소스를 일관된 방식으로 지칭할 수 있다. 이로 인해 모든 사람이 같은 명명된 방식으로 리소스를 찾을 수 있게 된다.
URL이 있기 전 암흑의 시대
URL이 있기 전에는 친구에게 파일을 공유하기 위해 많은 설명이 필요했다.
하지만 URL이 생기고 나서는 웹 브라우저에서 ftp://ftp.lots-o-books.com/pub/complete-catalog.xls
을 열어봐 라고 말하면 끝이다.
또한 웹 브라우저를 이용하면 사용자가 리소르를 가져오는데 사용되는 프로토콜을 알지 않아도 될 뿐더러 리소스를 가져오기 위한 클라이언트가 따로 필요없이 쉽게 접근 할 수 있게된다.
URL 문법
URL로 인터넷상의 모든 리소스를 찾을 수 있다. 하지만 그 리소스들은 다른 스킴을 통해 접근할 수 있으며, URL 문법은 스킴에 따라 달라진다.
대부분의 URL 스킴의 문법은 일반적으로 9개로 나뉜다.
<스킴>://<사용자이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<프래그먼트>
스킴: 사용할 프로토콜
- 스킴은 리소스에 접근하기 위해 사용할 프로토콜을 정의한다.
- 스킴은 알파벳으로 시작하고 대소문자를 구분하지 않는다.
- URL의 나머지 부분들과 첫 번째
콜론(:)
으로 구분된다.
호스트와 포트 : 리소스가 호스팅되어 있는 서버
http://www.joes-hardware.com:80/index.html
http://161.58.228.45.80/index.html
- 호스트는 리소스를 호스팅하고 있는 서버를 가리킨다.
- 호스트는 도메인 이름이나 IP 주소로 지정할 수 있다.
- 포트는 서버가 열어놓은 네트워크 포트를 가리킨다.
- 내부적으로 TCP 프로토콜을 사용하는 HTTP는 기본 포트로 80을 사용한다.
- 포트는 생략될 수 있으며 생략하면 기본 포트인 80이 사용된다.
- 포트는 숫자로 지정되며 0~65535까지 사용할 수 있다.
- 포트는
콜론(:)
으로 호스트와 구분된다.
사용자 이름과 비밀번호 : 리소스에 접근하기 위한 권한
ftp://ftp.prep.ai.mit.edu/pub/gnu
ftp://anonymous@ftp.prep.ai.mit.edu/pub/gnu
ftp://anonymous:my_password@ftp.prep.ai.mit.edu/pub/gnu
http://woo:my_password@www.joes-hardware.com/sales_info.txt
- 첫번째 예제는 사용자 이름과 비밀번호가 없는 경우이다.
- 사용자 이름과 비밀번호를 기술하지 않는 경우에는 기본 사용자 이름과 비밀번호 값을 넣어놓는다.
- FTP의 경우 기본 사용자 이름은
anonymous
이고 비밀번호는 브라우저마다 가지고 있는 기본 비밀번호를 사용한다.
- 두번째 예는 사용자 이름이
anonymous
인 경우이다.@
문자는 사용자 이름과 비밀번호를 호스트와 구분하기 위해 사용된다.
- 세번째 예는 사용자 이름이
anonymous
이고 비밀번호가my_password
인 경우이다.- 사용자 이름과 비밀번호는
:
문자로 구분된다.
- 사용자 이름과 비밀번호는
경로 : 서버의 리소스
http://www.joes-hardware.com/seasonal/index-fall.html
- URL의 경로는 서버의 리소스를 가리킨다.
- 경로는
/
문자로 구분된다. - 경로는 서버의 유닉스 파일 시스템의 디렉터리와 파일 이름과 유사하다.
- 각 경로조각은 자체만의 파라미터 컴포넌트를 가질 수 있다.
파라미터 : 리소스에 전달되는 추가적인 정보
많은 스킴이 객체에 추가적인 정보를 전달하기 위해 파라미터를 사용한다.
파라미터는 ;
문자로 구분되며 이름=값
쌍으로 구성된다.
http://www.joes-hardware.com/inventory-check;user=woo
- 위 예제는
user
라는 파라미터를 가지고 있다. - 파라미터는 스킴에 따라 다르게 해석된다.
http://www.joes-hardware.com/inventory-check;user=woo;/index.html;size=large
- 위 처럼 두 개의 경로조각에 각 각 파라미터를 가질 수 있다.
질의 : 리소스에 전달되는 추가적인 정보
http://www.joes-hardware.com/inventory-check?item=12731&color=blue&size=large
- 질의는
?
문자로 구분된다. - 질의는
이름=값
쌍으로 구성된다. - 질의는 편의상
&
로 나뉜 여러 개의이름=값
쌍을 가질 수 있다. - 악의적인 문자열이 아닌 이상 질의는 딱히 제한사항이 없다.
프래그먼트 : 리소스의 조각
http://www.joes-hardware.com/tools.html#drills
- 프래그먼트는
#
문자로 구분된다. - 프래그먼트는 리소스의 특정한 조각을 가리킨다.
- 위 예제에는
tools.html
이라는 웹 페이지 일부인drills
라는 조각을 가리킨다. - 보통 HTTP 서버는 객체 일부가 아닌 전체만 다루기 때문에 클라이언트는 서버에 프래그먼트를 전달하지 않는다.
단축 URL
상대 URL
- URL은 상대 URL과 절대 URL로 나뉜다.
- 절대 URL은 모든 정보를 담고 있고 상대 URL은 일부 정보만 담고 있다.
- 상대 URL은 기본적으로 기저 URL(base)을 기반으로 한다.
// base URL
http://www.joes-hardware.com/tools.html
<html>
<head>
<title>Sample Page</title>
</head>
<body>
<a href="./hammers.html">Spring promotions</a>
</body>
</html>
- 위 예에서
href
속성의 값은./hammers.html
이다. - 이 경우 웹 서버의
/tools.html
리소스를 기준으로 상대경로로 명시되었다. - 기존 기저 URL
http://www.joes-hardware.com/tools.html
을 기준으로 추측하여 새로운 절대 URL을 만들어낸다. - 상대 URL은 기저 URL을 기반으로 하기 때문에 기저 URL이 변경되면 상대 URL도 변경된다.
- 또한 프래그먼트 또한 기저 URL을 기반으로 한다.
상대 참조 해석하기 알고리즘 한번씩 자세히 보기
URL 확장
브라우저에서 URL을 입력하면 브라우저는 URL을 확장한다.
이러한 확장기능은 두가지로 나뉘는데
호스트 명 확장과 히스토리 확장이 있다.
사실 중요한 내용으로는 안보인다.
안전하지 않은 문자
URL은 인터넷에 있는 모든 리소스가 여러 프로토콜을 통해서 전달 될 수 있도록 설계되었다.
따라서 안전한 전송을 위해 URL은 안전한 알파벳 문자만 포함하도록 허락한다.
하지만 URL은 인터넷에서 사용되는 모든 문자를 표현할 수 있어야 한다.
이에 따라 이스케이프라는 기능이 추가되어 안전하지 않은 문자를 인코딩할 수 있게 하였다.
URL 문자 집합
- URL은 128개의 7비트 ASCII 문자 집합을 사용한다.
- URL 설계자들은 URL에 이스케이프 문자열을 쓸 수 있도록 설계하여 URL에 안전하지 않은 문자를 표현할 수 있게 하였다.
인코딩 체계
- URL은 안전하지 않은 문자를 표현하기 위해 인코딩 체계를 사용한다.
- 인코딩 체계는
%
문자와 두개의 16진수 숫자로 구성된다.
문자 | ASCII 코드 | URL의 예 |
---|---|---|
빈 문자 | 32 | %20 |
% |
37 | %25 |
~ |
126 | %7E |
문자 제한
몇몇 문자는 URL 내에서 특별한 의미를 가지기 때문에 사용할 수 없다.
약간의 예시를 나열하면 다음과 같다.
문자 | 선점 및 제한 |
---|---|
# |
프래그먼트 |
% |
인코딩 |
& |
질의 |
+ |
공백 |
/ |
경로 |
: |
스킴, 포트 |
; |
파라미터 |
= |
파라미터, 질의 |
? |
질의 |
@ |
사용자 이름, 비밀번호 |
[ |
IPv6 |
\ |
경로 |
] |
IPv6 |
^ |
인증 |
` |
인증 |
미래
URL은 강력한 도구 이지만 완벽한 것은 아니다.
이에 따라 URL을 대체할 수 있는 URN(Uniform Resource Name)이라는 개념이 등장하였다.
URN은 리소스의 위치가 아닌 리소스의 이름을 가리킨다.
하지만 URN은 아직까지는 실험적인 단계이다.
URL에서 URN으로 주소 체계를 바꾸는 것은 매우 큰 작업 이기 때문에 아직까지는 URL이 사용된다.