티스토리 뷰

2000-12-6

HTTP 헤더(HyperText Transfer Protocol Header)

팀 버너스 리는 TCP/IP 프로토콜 에서 운용되는 HTTP라는 프로토콜을 완성해서 전 세계를 거미줄처럼 엮는 월드와이드웹(www)의 기초를 완성했습니다. HTTP는 이름처럼 (하이퍼)링크를 통해 연결된 하이퍼텍스트 데이타의 전송을 위한 프로토콜입니다. HTTP는 기본적으로 클라이언트 쪽에서 웹 서버에 무엇인가를 요청(request)하면 서버에서 판단하여 응답(response)하고 데이타를 보내주는 방식입니다. 이러한 요청과 응답이 가능할려면 서버-클라이언트 사이에 전송되는 컨텐트 데이타 외에, 전송이 제대로 되었는지, 어떤 클라이언트가 접속하는지, 접속 시간은 언제인지 등 메타 정보 역시 오고 가야 합니다. 그 부분을 담고 있는 것이 HTTP 헤더(header)입니다.

 

헤더는 크게 접속이나 날짜, 캐시 제어(cache control)를 다루는 일반 헤더(general header)와 요청(request)하는 클라이언트 쪽 정보를 담고 있는 요청 헤더(request header), 주로 서버 쪽 정보와 보내주는 데이타 관련 정보를 담고 있는 응답 헤더(response header), 마지막으로 컨텐트 길이나 미디어 타입(media type) 정보를 담고 있는 엔터티 헤더(entity header)가 있습니다.

 

헤더는 name: value 형태이고 다양한 필드가 많으므로 각 필드에 대한 내용은 필요 시 찾아 보면 되고, 여기서는 간단한 예를 통해 주로 어떤 정보들이 어떻게 전달되는지 알아보겠습니다. 먼저 클라이언트 쪽에서 서버 쪽으로 요청할 때 보내는 요청 헤더부터 알아 봅시다.

 

 

요청 헤더, 리퀘스트 헤더(Request Header)

웹 브라우져가 웹 서버와 커넥션을 형성하고 요청을 할 때, 어떤 과정이 진행될까요? 사용자가 링크를 클릭하거나 주소창에 웹 주소를 입력하면 웹 브라우져는 그 링크나 주소가 가리키는 페이지의 IP 주소를 찾습니다. 원하는 페이지가 뜨는 대신 "Server does not have a DNS entry" 같은 메시지가 뜨는 경우가 IP 주소를 찾아내지 못 했을 때입니다. IP 주소에 해당하는 웹 서버를 찾았다면 웹 브라우져는 클라이언트 컴퓨터의 IP 주소를 웹 서버에 알려 주면서 웹 서버와 클라이언트 간에 TCP 커넥션을 엽니다.

 

웹 서버와 클라이언트 쪽 웹 브라우져 사이에 연결이 이뤄지면 웹 브라우져는 사용자의 요청(request)을 웹 서버에 알려 주는데, 요청은 일정한 형태를 갖고 있습니다. 이해를 돕기 위해 사용자가 "www.abc.co.kr/abc.html"이라는 페이지에 담긴 "www.xyz.com/xyz.html" 라는 링크를 클릭했다고 합시다. 이 링크를 클릭하는 순간 웹 브라우져는 다음과 같은 요청 헤더를 만들어 냅니다.

 

GET /xyz.html HTTP/1.1
Host: www.xyz.com
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Accept: text/html; */*
Cookie: name = value
Referer: http://www.abc.com/abc.html

 

첫 번째 줄은 요청(request) 라인으로 [method URI HTTP version]의 형태입니다. method는 요청의 종류로 GET, POST 등 여러 가지가 있고 주로 이 두 가지를 많이 사용합니다. 위의 예 첫 번째 줄은, "GET 메쏘드로 / 디렉토리의 xyz.html을 요청한다, 사용하는 HTTP 프로토콜 버전은 1.1이다."라는 의미의 요청 라인입니다.

 

첫 줄, 요청 라인 다음에 나오는 부분이 요청 헤더(request header)에 해당합니다. 그리고 각각 name: value의 형태로 규정되어 있음을 알 수 있습니다. method 이름은 반드시 대문자로만 해야 하지만 요청 헤더는 대소문자 구분이 없고, 공백도 자동으로 없앱니다. 

 

위 예시의 요청 헤더 각 줄의 내용을 살펴 봅시다.

 

 1. Host: 클라이언트 쪽에서 요청한 주소의 호스트입니다. 즉, 웹 서버 주소입니다. 위의 경우 www.xyz.com입니다.

 

 2. User-Agent: 클라이언트 쪽 웹 브라우져 종류에 대한 정보입니다. 위의 경우, 윈도우즈 NT에서 인터넷 익스플로러 6.0을 이용해서 접속하고 있다는 것을 서버에 알려 주고 있습니다.

 

 3. Accept: 서버로부터 받는 데이타 중 어떤 미디어 타입(media type)의 데이타를 웹 브라우져가 다룰 수 있는지 알려 주는 부분입니다. text/html는텍스트 html 문서를 받을 수 있다는 의미이고 그 옆의 "*/*"는 특정한 유형이 아닌 일반적인 형태를 다 허용한다는 의미입니다. Accept 헤더 필드를 통해 이렇게 클라이언트 웹 브라우져에서 처리할 수 있는 미디어타입(media type)을 알려 줍니다.

 

 3. Cookie: Cookie 헤더 필드는 사용자 하드 디스크에 쿠키가 있는 경우 그 쿠키의 이름과 값(name, value)을 읽어 들여서 웹 서버로 전송합니다.

 

 4. Referer: Referer 헤더 필드는 접속한 클라이언트의 주소를 담고 있습니다. 위 경우는 "www.abc.co.kr/abc.html"입니다.

 

이외에도 웹 페이지가 수정된 경우 가장 최근 버전의 페이지를 전송해 달라는 요청인 If-Modified-Since와 특정 날짜가 지난 뒤에 특정 페이지나 이미지로의 접속을 차단하는 Expires 헤더 필드 등 이외에도 많은 필드가 있습니다.

 

이상의 헤더 내용이 전달되면 헤더가 끝났다는 것을 서버에 알려 줄 필요가 있을 것입니다. 줄 바꿈(CR이나 LF) 문자가 나오고 빈 줄 하나가 연달아 나오면 웹 서버는 헤더가 끝난 것으로 인식합니다. 그러므로 연달아 줄 바꿈 문자가 두 개 나오면 헤더가 끝나는 것입니다. \n\n이 나오면 헤더가 끝난 것으로 인식합니다.

응답 헤더, 리스판스 헤더 (Response Header)

웹 서버가 위와 같은 요청을 받으면 요청한 클라이언트에 응답 헤더와 함께 요청받은 내용을 전달합니다. 응답 헤더는 상태(status) 정보를 담고 있습니다. 상태 정보는 "Found"와 "404 Not Found" 중 하나의 값을 갖습니다. 응답 헤더입니다.

 

HTTP/1.1 200 Found
Date: Mon, 10 Feb 1997 23:48:22 GMT
Server: Apache/1.3.9 
Connection: close
Content-type: text/html; charset=utf-8
Last-Modified: Tues, 11 Feb 2000 22:45:55 GMT

 

첫 줄은 상태(status) 정보를 담고 있는 응답 라인입니다. 클라이언트가 요청한 주소가 웹 서버에 있으면, "Found", 없으면 "404 Not Found"입니다. 그 다음 줄부터 응답 헤더의 각 필드와 값들이 나옵니다.

 

 1. Date: 요청된 내용을 수행하는 시간과 날짜입니다. 

 

 2. Server: 웹 서버의 종류입니다.

 

 3. Connection: 접속 상태를 규정하는 것으로 close인 경우 이번 트랜잭션이 마무리되면 접속을 끊는다는 뜻입니다.

 

 4. Content-type: 보내는 데이타의 미디어 타입입니다.

 

 5. Last-Modified: 보내는 데이타가 마지막으로 수정된 날짜입니다.

 

보내는 파일이 html 문서가 아니라면 Content-type 헤더에는 다른 미디어 타입이 담깁니다. 즉, 웹 페이지에 담겨 있는 모든 아이템들 각각에 대해 Content-type이 무엇인지 알려 주는 것입니다. 이미지는 이미지별로 html은 html별로 따로 알려줍니다. 

 

 

반응형
댓글