HTTP 완벽가이드[2] URL과 리소스
on HTTP
2.1 인터넷의 리소스 탐색하기
- URL(Uniform Resource Locator)은 인터넷 리소스를 가리키는 표준이름
- URL은 리소스가 어디에 있고 어떻게 접근할 수 있는지 알려주는 역할
2.2 URL 문법
- 대부분의 URL은 일반 URL 문법을 따르며, 서로 다른 URL 스킴도 형태와 문볍면에서 매우 유사
- URL의 가장 중요한 세가지 컴포넌트는 스킴, 호스트, 경로이다.
컴포넌트 | 설명 | 기본값 |
---|---|---|
스킴 | 어떤 프로토콜을 사용하여 서버에 접근해야 하는지 명시 | |
사용자 이름 | 몇몇 스킴은 리소스에 접근을 하기 위해 사용자 이름이 필요 | anonymous |
비밀번호 | 사용자의 비밀번호를 카리키며, 사용자 이름에 콜론(:)으로 이어서 기술 | <이메일 주소="">이메일> |
호스트 | 리소스를 호스팅하는 서버의 호스트 명이나 IP 주소 | |
포트 | 리소스를 호스팅하는 서버가 열어놓은 포트번호 | 스킴에 따라 다름 |
경로 | 이전 컴포넌트와 빗금(/)으로 구분, 서버 내 리소스가 서버 어디에 있는지를 가리킴 | |
파라미터 | 특정 스킴들에서 입력 파라미터를 기술하는 용도로 사용 | |
질의 | 스킴에서 애플리케이션에 파라미터를 전달하는데 쓰임, URL의 끝에 “?”로 구분 | |
프래그먼트 | 리소스의 조각이나 일부분을 가리키는 이름, URL의 끝에 “#”문자로 구분 |
1. 스킴 : 사용할 프로토콜
- 주어진 리소스에 어떻게 접근하는지 알려주는 중요한 정보
- 알파벳으로 시작해야하고 URL의 나머지 부분들과 첫번째 ‘:’문자로 구분
- 대소문자를 가리지 X
2. 호스트와 포트
- 리소스를 호스팅하고 있는 장비와 그 장비 내에서 리소스에 접글할 수 있는 서버의 위치 정보 제공
- 호스트 컴포넌트 접근하려고 하는 리소스를 가지고 있는 인터넷상의 호스트 장비를 가리킴
- 아래의 첫 번째는 호스트명으로, 두 번째는 IP 주소로같은 리소스를 기리킴
http://www.joes-hardware.com:80/index.html
http://161.58.228.45:80/index.html
- 포트 컴포넌트는 서버가 열어놓은 네트워크 포트를 가리킴 - 내부적으로 TCP 프로토콜을 사용하는 HTTP는 기본 포트로 80을 사용
3. 사용자 이름과 비밀번호
- 많은 서버가 자신이 가지고 있는 데이터에 접근을 허용하기 전에 사용자 이름과 비밀번호를 요구
- ’@’ 문자는 URL로부터 사용자 이름과 비밀번호 컴포넌트를 분리
ftp://ftp.prep.ai.mit.edu/pub/gnu - 이름, 비밀번호 없음
ftp://anonymous:my_passwd@ftp.prep.ai.mit.edu/pub/gnu - 이름, 비밀번호 있음
4. 경로
- 서버 내 리소스의 위치 정보 제공
- 계층적 파일 시스템 경로와 유사한 구조를 가짐
- ’/’문자를 기준으로 경로조각으로 나뉘게 되며, 각 경로조각은 자체만의 파라미터 컴포넌트를 가질 수 있음
5. 파라미터
- 애플리케이션이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는데 사용
- 이름/값 쌍의 리스트로 URL 나머지 부분들로부터 ‘;’문자로 구분하여 URL에 기술
http://www.joe-hardware.com/hammers;sale=false/index.html;graphics=true
- HTTP URL에서의 경로 컴포넌트는 경로조각으로 나눌 수 있고, 각 조각은 자체 파라미터를 가질 수 있다
- 위의 URL에서 hammers 경로조각은 값이 false인 slae이라는 파라미터를, index.html 경로조각은 값이 ture인 grapgics란 파라미터를 가짐
6. 질의 문자열
- 데이터베이스 같은 서비스들은 요청받을 리소스 형식의 범위를 좁히기 위해서 질문이나 질의를 받을 수 있음
- URL의 질의 컴포넌트는 게이트웨이를 가리키는 URL의 경로 컴포넌트와 함께 전달
http://www.joes-hardware.com/inventory-check.cgi?item=12731&color=blue
- 편의상 많은 게이트웨이가 ‘&’로 나뉜 ‘이름=값’쌍 형식의 질의 문자열을 원함
- 위의 예에는 item=12731과 color=blue 두 개의 질의 컴포넌트가 존재 - 제품번호가 12731이고, 파란색인 물품의 재고가 있는지 검사
7. 프래그먼트
- 리소스의 특정 부분을 가리킬 수 있음
- HTTP 서버는 객체 일부가 아닌 전체만 다루기 때문에, 클라이언트는 서버에 프래그먼트를 전달하지 않음 -> 전체 리소스를 내려받은 후, 프래그먼트를 사용하여 리소스의 일부를 보여주는 방식
- 프래그먼트는 URL의 오른쪽에 # 문자에 이어서 존재
http://www,joes-hardware.com/tools.html#drils
2.3 단축 URL
2.3.1 상대 URL
- URL을 짧게 표기하는 방식
- 상대 URL로 리소스에 접근하는데 필요한 모든 정보를 얻기 위해서는, 기저(base)라고 하는 URL을 사용해아 함
- 상대 URL 문법에 따르면, URL에 스킴과 호스트, 그리고 다른 컴포넌트들을 모두 입력하지 않아도 됨 ( 기저 URL을 통해 파악 가능 )
2.3.2 URL 확장
- 특정 브라우저들은 URL을 입력한 다음이나 입력하고 있는 동안 자동으로 URL을 확장해 사용자가 URL을 빠르게 입력할 수 있게 도와줌
- 호스트명 확장
- 주소 입력란에 ‘naver’를 입력하면, 브라우저는 호스트 명에 자동으로 ‘www.’와 ‘.com’을 붙여서 ‘www.naver.com’을 만듬
- 사용자의 시간을 절약하고 혼란을 막아주지만, 프락시와 같은 다른 HTTP 애프리케이션에 문제를 발생시킬 수 있음 (6장 상세)
- 히스토리 확장
- ‘http://nav’와 같이 이전에 방문했던 URL의 시작 부분 입력 시, ‘http://naver.com’을 표시
- 프락시를 사용할 경우 URL 자동확장 기능은 다르게 동작할 수 있음
2.4 안전하지 않은 문자
- 안전한 전송 - 정보가 유실될 위험 없이 URL을 전송할 수 있다는 것
- 전자메일에 사용되는 SMTP와 같이 특정 문자를 제거할 수도 있는 전송 방식을 사용하는 프로토콜의 경우, URL에 상대적으로 작고 일반적으로 안전한 알파벳 문자만 포함하도록 허락
- 출력이 되지 않거나 보이지 않는 문자들을 사용하는 것은 금지됨
- 이스케이프라는 기능을 통해 안전하지 않은 문자를 안전한 문자로 인코딩 가능
2.4.1 URL 문자 집합
- 많은 컴퓨터 애플리케이션이 US-ASCII 문자 집합을 사용
- US-ASCII는 적은 수의 문자만을 포함하고 있어 표현 가능한 언어의 수가 적음
- URL이 특정 이진 데이터를 포함해야 하는 경우가 존재
- 위의 문제를 해결하기 위해 URL에 이스케이프 문자열을 쓸 수 있게 설꼐
- 이스케이프 문자열은 US-ASCII에서 사용이 금지된 문자들로, 특정 문자나 데이터를 인코딩할 수 있게하여 이동성과 완성도를 높임
2.4.2 인코딩 체계
- 안전하지 않은 문자를 퍼센티치 기호(%)로 시작해, ASCII 코드로 표현되는 두 개의 16진수 숫자로 이루어진 ‘이스케이프’문자로 변환
문자 | ASCII 코드 | URL의 예 |
---|---|---|
~ | 126 (0x7E) | http://github.taeho0304.io/%7Etaeho |
빈문자 | 32 (0x20) | http://github.taeho0304.io/more%20about.html |
% | 37 (0x25) | http://github.taeho0304.io/100%25 |
2.4.3 문자제한
- 몇몇 문자는 URL 내에서 특별한 의미로 예약되어 있음
- URL에서 예약된 문자들을 본래의 목적이 아닌 다른 용도로 사용하려면, 그전에 반드시 인코딩해야 함
문자 | 선점 및 제한 |
---|---|
% | 인코딩된 문자에 사용할 이스케이프 토큰으로 선점 |
/ | 경로 컴포넌트에 있는 경로 세그먼트를 나누는 용도로 선점 |
. | 경로 컴포넌트에서 선점 |
.. | 경로 컴포넌트에서 선점 |
# | 프래그먼트의 구획 문자로 선점 |
? | 질의 문자열의 구획 문자로 선점 |
; | 파라미터의 구획 문자로 선점 |
: | 스킴, 사용자 이름/비밀번호, 호스트/포트의 구획 문자로 선점 |
2.5 스킴의 바다
- 웹에서 쓰이는 스킴들 ( 종류는 많지만 대표적인 3개만 정리)
스킴 | 설명 |
---|---|
http | 일반 URL 포맷을 지키는 하이퍼텍스트 전송 프로토콜로 기본 포트값은 80이다 |
https | http 스킴과 거의 같다. 차이점은 HTTP의 커넥션의 양 끝단에서 암호화하기 위해 넷스케이프에서 개발한 보안 소켓 계층(Secure Sockets Layer, SSL)을 사용한다. 기본 포트값은 443이다. |
ftp | FTP 서버에 있는 파일을 올리거나 내리고, FTP 서버 디렉토리의 콘텐츠 목록을 가져오는데 사용 |