[HTTP 완벽가이드] 02. URL과 리소스

URL(Uniform Resource Locator)은 인터넷 리소스를 가리키는 표준이름이다. 

 

[인터넷의 리소스 탐색하기]

URL은 브라우저가 정보를 찾는데 필요한 리소스의 위치를 가리키며, URL을 이용해 사람과 애플리케이션이 인터넷 상의 수십억 개의 리소스를 찾고 사용하며 공유할 수 있다. 그리고 URL을 통해 사람이 HTTP 및 다른 프로토콜을 통해 접근할 수 있다.

 

URI는 URL, URN으로 나뉘어질 수 있다. 

  • URN: 리소스가 어디에 존재하든 이름만으로 리소스를 식별할 수 있다.
  • URL: 리소스가 어디에 있는지 설명해서 리소스를 식별한다.

 

URL을 구성하는 3가지 요소를 살펴보자

  1. 스킴: 리소스에 접근할 수 있는 방법 
    예시) http
  2. 서버의 위치: 리소스의 호스팅 위치
    예시) www.joes-hardware.com
  3. 리소스의 경로: 서버의 로컬 리소스 중 어떤 리소스를 제공하면 될 지
    예시) /seasonal/index-fall.html

URL을 사용하면 리소스를 일관된 방식으로 지칭할 수 있다.

URL은 `스킴://서버위치/경로` 구조로 이루어진다.

 

[URL 문법]

URL로 인터넷 상의 모든 리소스를 찾을 수 있지만 리소스는 다른 스킴을 통해서 접근할 수 있다. 

또한, URL 문법은 스킴에 따라 달라지지만 일반적으로는 비슷하다.

 

일반적인 URL 스킴 문법은 일반적으로 9개 부분으로 나뉘지만 이 모든 컴포넌트를 가진 URL은 거의 없다. URL의 가장 중요한 3가지 컴포넌트는 스킴, 호스트, 경로다.

`<스킴>://<사용자이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<프래그먼트>`

 

1) 스킴: 사용할 프로토콜

스킴은 주어진 리소스에 어떻게 접근하는지 알려주는 중요한 정보다.

이는 URL을 해석하는 애플리케이션이 어떤 프로토콜을 사용하여 리소스를 요청해야 하는지 알려준다.

 

2) 호스트와 포트

호스트와 포트는 리소스를 호스팅하고 잇는 장비와 장비 내에서 리소스에 접근할 수 있는 서버가 어디에 있는지를 알려준다.

호스트는 접근하려고 하는 리소스를 가진 호스트 장비를 가리킨다. 이 값은 호스트명이나 IP 주소 형태로 제공된다.

 

포트 컴포넌트는 서버가 열어놓은 네트워크 포트를 가리킨다.

➡️ TCP 프로토콜을 사용하는 HTTP는 기본 포트로 80을 사용

 

3) 사용자 이름과 비밀번호

많은 서버는 자신이 가지고 있는 데이터에 접근을 허용하기 이전에 사용자 이름과 비밀번호를 요구한다.

 

대표적인 예시가 FTP 서버다. 

만약 FTP 서버와 같이 사용자 이름과 비밀번호를 필요로 하는 서버에서 해당 값을 기술하지 않은채로 URL에 접근한다면 브라우저마다 가지고 있는 기본 값을 사용하여 접속하게 된다.

 

'@' 문자는 URL로부터 사용자 이름과 비밀번호 컴포넌트를 분리한다.

 

4) 경로

URL 경로 컴포넌트는 리소스가 서버의 어디에 있는지 알려주며, HTTP URL에서 경로 컴포넌트는 '/' 문자를 기준으로 경로조각으로 나뉜다.

 

5) 파라미터

많은 스킴은 객체에 대한 호스트, 경로 정보만으로는 리소스를 찾지 못한다.

 

URL을 사용하는 애플리케이션이 리소스에 접근하려면 프로토콜 파라미터가 필요하다. 프로토콜 파라미터가 없다면, 다른 한편에 있는 서버는 그 요청을 잘못 처리하게 된다. 

FTP는 바이너리와 텍스트 2개의 포맷을 지원한다.
사용자는 이미지(바이너리)가 텍스트 형식으로 지원되는 것을 원하지 않는다. 이미지가 엉망으로 전송되기 때문이다.

기본값으로 FTP 요청을 보낸 URL
ftp://example.com/image.jpg​

 

바이너리 포맷으로 제공을 받기 위해 파라미터를 수정하여 FTP 요청을 보낸 URL
ftp://example.com/image.jpg;type=i

 

URL의 파라미터 컴포넌트는 애플리케이션이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는데 사용한다.

이 컴포넌트는 이름/값 쌍의 리스트로 URL 나머지 부분들로부터 ';' 문자로 구분하여 URL에 기술한다.

 

즉, 파라미터는 URL 경로에 속한 리소스의 특성이나 처리 방법을 지정하는 데 사용된다.

 

6) 질의 문자열

데이터베이스 같은 서비스들은 요청받을 리소스 형식의 범위를 좁히기 위해서 질문이나 질의를 받을 수 있다.

'?'의 우측에 있는 값이며, 질의 컴포넌트라고 부른다.

 

URL의 질의 컴포넌트는 게이트웨이를 가리키는 URL의 경로 컴포넌트와 함께 전달한다.

특정 문자를 제외하고 질의 컴포넌트 포맷에 제약사항은 없지만 많은 게이트웨이가 '&'로 나뉜 '이름=값' 쌍 형식의 질의 문자열을 사용한다.

 

즉, 질의 문자열은 서버가 처리해야 할 데이터를 전달하는 역할을 합니다.

 

7) 프래그먼트

HTML 같은 리소스 형식들은 본래의 수준보다 더 작게 나뉠 수 있다. 

예를 들어 문단이 포함된 용량이 큰 한 개의 텍스트 문서의 경우, 리소스에 대한 URL은 텍스트 문서를 가리키지만 이상적으로는 리소스 안에 있는 특정 문장을 가리킬 수 있어야 한다.

 

리소스의 특정 부분을 가리킬 수 있도록 URL은 리소스 내의 조각을 가리킬 수 있는 프래그먼트 컴포넌트를 제공하며, 프래그먼트는 URL의 오른쪽의 '#' 문자에 이어서 온다.

예시) `http://www.joes-hardware.com/tools.html#drills`
drills라는 프래그먼트는 죠의 컴퓨터 가게 웹 서버에 위치한 /tools.html 웹페이지의 일부를 가리킨다.

 

일반적으로 HTTP 서버는 객체 일부가 아닌 전체만 다루므로, 클라이언트는 서버에 프래그먼트를 전송하지 않는다. 브라우저가 서버로부터 전체 리소스를 내려받은 후, 프래그먼트를 사용하여 리소스의 일부를 보여주도록 되어있다.

서버는 객체를 전체 단위로만 전송하므로 URL 프래그먼트는 클라이언트에서만 사용된다.

[단축 URL]

웹 클라이언트는 몇몇 단축 URL을 인식하고 사용한다. 

상대 URL은 리소스 내의 리소스를 간결하게 기술하는데 사용할 수 있다.

 

1) 상대 URL

URL은 상대 URL과 절대 URL로 나뉘며, 절대 URL은 리소스에 접근하는데 필요한 모든 정보를 가지고 있다.

이와 달리 상대 URL은 모든 정보를 담고 있지 않으며 상대 URL로 리소스에 접근하는데 필요한 모든 정보를 얻기 위해서는 기저(base)라고 하는 다른 URL을 사용해야 한다.

 

상대 URL 문법에 따르면, HTML 작성자는 URL에 스킴, 호스트, 다른 컴포넌트를 모두 입력하지 않아도 되며 해당 정보는 컴포넌트가 포함된 리소스의 기저 URL에서 알아낼 수 있다.

 

 

기저 URL을 http://www.joes-hardware.com/tools.html 이라고 가정하자
이 URL을 기저 URL로 사용하여, 상대 URL에서는 기술하지 않은 정보를 추측할 수 있다.

기저 URL을 사용하면 스킴은 http이고, 호스트는 www.joes-hardware.com이라는 것을 추측할 수 있으며,
`./hammers.html`으로 상대 URL을 작성하면 `http://www.joes-hardware.com/hammers.html`이 된다.

 

상대 URL은 프래그먼트나 URL 일부이므로, URL을 처리하는 애플리케이션은 상대 URL과 절대 URL 간에 상호 변환을 할 수 있어야 한다.

 

기저 URL을 찾는 3가지 방법

(1) 리소스에서 명시적으로 제공

어떤 리소스는 기저 URL을 명확하게 기술한다. 

예시) HTML 문서에서 내부의 모든 상대 URL을 변경하기 위해, 기저 URL을 가리키는 <base> HTML 태그를 기술할 수 있다.

 

(2) 리소스를 포함하고 있는 기저 URL

기저 URL이 명시되지 않은 리소스에 포함된 상대 URL은, 해당 리소스의 URL을 기저 URL로 사용할 수 있다.

 

(3) 기저 URL이 없는 경우

기저 URL이 아예 존재하지 않는 경우는 절대 URL만으로 이루어져 있다는 뜻이다.

 

상대 URL을 해석하는 순서

상대 URL을 절대 URL로 변환하기 위한 단계는 상대 URL과 기저 URL을 각각의 컴포넌트 조각으로 나누는 것이다. 

기저 URL과 상대 URL을 컴포넌트로 분해하고 나면 변환을 끝내기 위해 특별한 알고리즘을 사용할 수 있다. 

이 알고리즘은 상대 URL을 리소스로 참조하는데 사용할 수 있는 절대 경로 형태로 변환한다.

 

알고리즘

앞의 예시를 위의 알고리즘을 통해 변환된 과정은 다음과 같다.

  1. 경로는 './hammers.html'
    기저 URL은 'http://www.joes-hardware.com/tools.html'
  2. 스킴이 비어 있으므로, 기저 URL의 스킴을 상속 받는다. (HTTP)
  3. 적어도 한 개의 컴포넌트는 비어있지 않으므로, 호스트와 포트 컴포넌트를 상속 받는다.
  4. 상대 URL 컴포넌트와 상속 받은 컴포넌트를 합치면 새로운 절대 URL 경로를 얻을 수 있다.

[안전하지 않은 문자]

URL은 인터넷에 있는 모든 리소스가 여러 프로토콜을 통해서 전달될 수 있도록 각 리소스에 유일한 이름을 지을 수 있게 설계되었다.

 

URL에 이진 데이터나 알파벳 외의 문자도 포함하고 싶어했기에 이스케이프라는 기능을 추가하여 안전하지 않은 문자를 안전한 문자로 인코딩할 수 있게 했다.

 

1) URL 문자 집합

컴퓨터 시스템의 기본 문자 집합은 영어 중심으로 설정되어 있다. 즉, 많은 컴퓨터 애플리케이션이 US-ASCII 문자 집합을 사용해왔다.

하지만 비라틴계 언어들에 존재하는 문자들, 이진 데이터들은 US-ASCII가 지원하지 않는다.

이를 지원하기 위해서, URL 설계자들은 URL에 이스케이프 문자열을 쓸 수 있게 설계하였으며, 이를 통해 이동성과 완성도를 높였다.

 

2) 인코딩 체계

URL에 안전하지 않은 문자들을 표현할 수 있는 인코딩 방식이 고안되었다.

인코딩은 안전하지 않은 문자를 퍼센티지 기호(%)로 시작해 ASCII 코드로 표현되는 2개의 16진수 숫자로 이뤄진 '이스케이프' 문자로 바꾼다.

 

3) 문자 제한

몇몇 문자는 URL 내에서 특별한 의미로 예약되어 있다. 어떤 문자는 US-ASCII의 출력 가능한 문자 집합에 포함되어 있지 않다.

그리고 어떤 문자는 몇몇 인터넷 게이트웨이와 프로토콜에서 혼동되는 것으로 알려져 있어 사용이 꺼려지기도 했다.

예를 들면, ':', '?', '%' 처럼 특별한 기능을 하는 문자들은 예약어이므로 이 문자 자체를 URL의 특정 값으로 인식을 시키려면 인코딩을 해야한다.

 

입력받은 URL에서 어떤 문자를 인코딩해야하는지 결정하는 것은 브라우저처럼 최초로 URL을 입력받는 애플리케이션에서 하는 것이 가장 적절하다. 

 

[스킴의 바다]

스킴 목록

스킴 설명
http 사용자 이름이나 비밀번호가 없다는 것을 제외하고, 일반 URL 포맷을 지키는 하이퍼텍스트 전송 프로토콜 스킴이다. 

기본 포트값: 80
기본 형식: `http://<호스트>:<포트>/<경로>?<질의>#<프래그먼트>`
https https 스킴은 http와 거의 동일하다.
http와 차이점은 HTTP의 커넥션 양 끝단에서 암호화하기 위해 보안 소켓 계층(SSL)을 사용한다는 것이다.

기본 포트값: 443
기본 형식: `http://<호스트>:<포트>/<경로>?<질의>#<프래그먼트>`
mailto mailto URL은 이메일 주소를 가리킨다.
이메일은 다른 스킴과는 다르게 동작하기 때문에 mailto URL은 표준 URL과는 다른 포맷을 가진다.

기본 형식: `mailto:<RFC-822-addr-spec>`
ftp 파일 전송 프로토콜 URL은 FTP 서버에 있는 파일을 내려받거나 올리고, FTP 서버의 디렉터리에 있는 콘텐츠 목록을 가져오는데 사용할 수 있다.

기본형식: `ftp://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>`
rtsp, rtspu RTSP URL은 실시간 스트리밍 프로토콜을 통해서 읽을 수 있는 오디오 및 비디오와 같은 미디어 리소스 식별자다.
rtspu 스킴에 있는 u는 리소스를 읽기 위해 UDP 프로토콜이 사용됨을 의미한다.

기본 형식: `rtsp://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>`
`rtspu://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>`
file file 스킴은 주어진 호스트 기기에서 바로 접근할 수 있는 파일들을 나타낸다. 
만약 호스트가 생략되어 있으면, URL을 사용하고 있는 기기의 로컬 호스트가 기본값이 된다.

기본 형식: `file://<호스트>/<경로>`
telnet 대화형 서비스에 접근하는데 사용한다.
telnet URL 자체가 객체를 가리키지는 않지만 리소스라고 할 수 있는 대화형 애플리케이션은 telnet 프로토콜을 통해 접근할 수 있다.

기본 형식: `telnet://<사용자 이름>:<비밀번호>@<호스트>:<포트>/`