티스토리 뷰
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별로 따로 알려줍니다.
'프로그래밍' 카테고리의 다른 글
펄(Perl) CGI를 이용한 웹 기반 복리계산기 만들기 (0) | 2020.08.10 |
---|---|
펄(Perl) CGI와 펄을 이용한 HTTP 요청/응답 헤더 처리 (0) | 2020.08.09 |
펄(Perl)에서 글로빙(globbing)과 파일 정보 그리고 날짜 처리 (0) | 2020.08.06 |
펄(Perl)에서 파일 읽기, 쓰기, 파일 테스트 그리고 디렉토리 작업 (0) | 2020.08.06 |
컴파일드 언어, 인터프리티드 언어(Compiled, Interpreted Languages) 그리고 자바(Java) (0) | 2020.08.01 |