HTTP 완벽 가이드 2장

2장 URL과 리소스

인터넷의 리소스 탐색하기

URL(Uniform Resource Identifier) 통합 자원 식별자
리소스의 위치를 설명하는 방법으로 구성됨
애플리케이션 및 웹 클라이언트가 원하는 리소스를 가져오기 위한 방법

문법

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

스킴

리소스가 있는 서버에 어떻게 접속하는지 프로토콜 종류를 나타낸다. (http:, ftp:)

사용자 이름

몇몇 스킴은 리소스에 접근하기 위해 사용자 이름을 필요로 한다. (기본값: anonymous)

비밀번호

사용자 이름에 대한 비밀번호를 의미한다.

호스트

리소스를 호스팅하는 서버의 호스트 명이나 IP주소 알려준다.

포트

해당 호스트 서버가 열어 놓은 포트번호, 스킴마다 기본 포트가 다르다. (http: 80)

경로

이전 컴포넌트와 \로 구분되어 있으며, 리소스 위치를 나타낸다.

파라미터:

특정 스킴들에서 입력 파라미터를 기술하는 용도로 사용한다. ;key=value 형태를 가지며 여러 개를 가질 수 있다.

질의

스킴에서 애플리케이션(DB, 게시판, 검색엔진, 인터넷 게이트웨이 등)에 파라미터를 전달하는데 쓰인다. ?key1=value1&key2=value2

프래그먼트

리소스의 조각이나 일부분을 가리키는 이름이다. URL이 특정 객체를 가리킬 경우 프래그먼트 필드는 서버에 전달 되지않고 클라이언트에서만 사용된다.

상대 URL

Base URL을 이용하여 뒤에 추가되는 내용만 붙이는 방법.

예시

Base URL: http://www.somehost.com/index.html
상대 URL : ./page1.html

  1. 스킴이 비어있는 경로이므로 Base URL의 스킴을 상속 받는다
  2. 컴포넌트가 비어있지 않기 때문에 호스트와 포트 컴포넌트를 상속 받는다.
  3. 상속받은 스킴, 호스트, 포트와 상대 URL을 합치면, 새로운 절대 URL인 http://www.somehost.com/page1.html 이 완성된다.

안전하지 않은 문자

URL은 인터넷에 있는 모든 리소스가 여러 프로토콜을 통해 잘 전달될 수 있도록,
각 리소스에 유일한 이름을 지을 수 있게 설계되었다.
URL에서는 출력이 되지 않거나 보이지 않는 문자를 사용하는 것을 금지하였고,
특정 문자에 대하여 이스케이프라는 기능을 추가하여, 안전하지 않은 문자를 안전한 문자로 인코딩할 수 있게 하였다.

안전하지 않은 모든 문자를 인코딩하는 위치는 어디가 적절할까?

  • 사용자로부터 최초로 URL을 입력받는 애플리케이션에서 하는 것 이 가장 적절하다.

인코딩 체계

  • %로 시작해, ASCII 코드로 표현되는 두개의 16진수 숫자로 이루어진 이스케이프 문자로 바꾼다.
문자 ASCII코드 인코딩 전 인코딩 후
~ 126 (0x7E) www.test.com/~title www.test.com/%7Etitle
빈 문자 32 (0x20) www.test.com/main page www.test.com/main%20page
% 37 (0x25) www.test.com/100%up www.test.com/100%25up

문자 제한

  • 이하 문자는 선점된 의미로 사용되지 않을 경우 인코딩이 필요한 문자이다.
문자 선점 및 제한
% 인코딩된 문자에 사용할 이스케이프 토큰으로 선점
/ 경로 컴포넌트에 있는 경로 세그먼트를 나누는 용도로 선점
. 경로 컴포넌트에서 선점
.. 경로 컴포넌트에서 선점
# 프래그먼트의 구획 문자로 선점
? 질의 문자열의 구획 문자로 선점
; 파라미터의 구획 문자로 선점
: 스킴, 사용자 이름/ 비밀번호, 호스트/포트의 구획 문자로 선점
$, + 선점
@ & = 특정 스킴에서 특별한 의미가 있기 때문에 선점
{} | \ ~ [] ` 게이트웨이와 같은 전송 에이전트에서 불안전하게 다루기 떄문에 제한됨
<> “ URL 범위 밖에서 역할이 있는 문자이기 떄문에 반드시 인코딩이 필요

인코딩 함수

  • encodeURI()

    • 인터넷 주소에서 사용하는 알파벳, 0~9의 숫자, ; , / ? : @ & = + $ # - _ . ! ~ * ' ( ) 를 제외하고 인코딩
    • url 전체를 인코딩하여 특정 인코딩 해야 할 문자를 인코딩 하는데 사용한다.
  • encodeURIComponent()

    • 알파벳, 0~9의 숫자, - _ . ! ~ * ' ( ) 를 제외하고 인코딩
    • 파라미터의 값을 인코딩 하는데 사용한다.

예시
url = https://test.com?key=ab&co

// 전체 URL을 인코딩하는 경우 사용됨
encodeURI(url) // https://test.com?key=ab&co

// 쿼리의 값을 인코딩하는 경우 사용됨
encodeURIComponent(url) // https%3A%2F%2Ftest.com%3Fkey%3Dab%26co (x)
encodeURIComponent(‘ab&co’) // ab%26co (o)

URN

  • 프로토콜을 사용하지 않음
  • 해당 자원의 이름을 의미함
  • 독립적인 자원 지시자

URL은 강력한 도구이지만, 리소스가 옮겨지면 URL을 사용할 수 없어지는 문제점이 있다.
해결 방법으로는 객체의 위치와 상관없이, 그 객체를 가리키는 실제 객체의 이름을 사용하는 것이다.
인터넷 기술 태스크포스(IEFT)는 URN(Uniform Resource Names)이라는 새로운 표준 작업에 착수하였다.

지속 통합 자원 지시자(PURL)을 사용하면 URL로 URN의 기능을 제공 할 수 있다.
PURL에서는 리소스의 실제 URL 목록을 관리하고 추적한다. 사용자가 고정된 URL로 요청하면
관리되는 실제 URL 주소를 이용하여 리소스를 가져올 수 있도록 한다.