HTTP Request (요청)
HTTP Requset messages (요청 메시지)
브라우저에서 웹 페이지를 열게 되면, 브라우저는 서버에 다음과 같은 요청 메시지를 보낸다.
GET / HTTP/1.1
Accept: image/gif, image/jpeg, */*
Accept-Language: ko
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;)
Host: www.xxx.zzz
Connection: Keep-Alive
요청 메시지는 다음과 같은 구문으로 구성된다.
HTTP Request line(요청 라인)
GET / HTTP/1.1
HTTP Request Header(요청 헤더)
Accept: image/gif, image/jpeg, */*
Accept-Language: ko
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;)
Host: www.xxx.zzz
Connection: Keep-Alive
HTTP Body(본문)
메세지 본문(POST 메소드 등을 사용)
Start line (요청 시작 라인)
HTTP 요청의 시작 줄에는 다음 세 가지 요소가 있다.
- HTTP 메소드
- 요청 대상(경로 이름)
- HTTP 프로토콜 버전
요청 라인은 다음 형식으로 표시된다.
요청 라인
[HTTP 메소드] [요청 대상] [HTTP 프로토콜 버전]
경로명은 보통 “/aaa/bbb/ccc.html"와 같고, 슬래시로 시작되는 패스명이나, “http://“으로 시작되는 URL가 지정된다. 버전은 현재 1.1이 보통 사용된다.
HTTP Method (메소드)
HTTP/1.0, HTTP/1.1에서 지원되는 메소드는 아래와 같다.
메소드 | HTTP/1.0 | HTTP/1.1 | 설명 |
---|---|---|---|
GET | ◎ | ◎ | 가장 일반적으로 사용되는 메소드이다. 브라우저는 서버에 페이지를 검색하도록 요청한다. |
HEAD | ◎ | ◎ | 헤더 전용 정보를 요청한다. 서버는 GET 메소드와 HEAD 메소드는 반드시 지원해야 한다. |
POST | ○ | ○ | method="POST" 를 지정한 폼에 입력한 데이터를 서버에 전송할 때 사용된다. |
PUT | ○ | ○ | |
DELETE | ○ | ○ | 지정된 자원을 삭제할 것을 서버에 요구한다. |
CONNECT | × | ○ | 프록시 서버를 경유해 SSL 통신할 때 등에 사용한다. |
OPTIONS | × | ○ | 서버가 서포트하고 있는 메소드나 옵션을 조회할 때에 이용한다. |
TRACE | × | ○ | HTTP 요청이 어느 프록시 서버를 경유해 송신되는지 등, HTTP의 동작을 추적할 때에 이용한다. 이 메시지를 받은 마지막 서버는 요청 메시지에 포함된 엔티티(일반적으로 헤더 + 메시지 본문)를 그대로 반환한다. |
LINK | ○ | × | 지정한 URL과 리소스에 링크 관계를 연결한다. HTTP/1.1에서는 더 이상 사용되지 않는다. |
UNLINK | ○ | × | 지정된 URL과 자원 간의 링크 관계를 해제한다. HTTP/1.1에서는 더 이상 사용되지 않는다. |
(◎: 필수, ○: 서포트, ×: 미지원)
Apache는 위 이외에도 PATCH, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK 등의 메소드를 지원하고 있다.
GET
GET 요청 방식은 URI(URL)가 가진 정보를 검색하기 위해 서버 측에 요청하는 형태이다.
전송 형태
GET [request-uri]?query_string
HTTP/1.1\r\n
Host: [Hostname] 혹은 [IP] \r\n
POST
POST 요청 방식은 요청 URI(URL)에 폼 입력을 처리하기 위해 구성한 서버 측 스크립트(ASP, PHP, JSP 등) 혹은 CGI 프로그램으로 구성되고 Form Action과 함께 전송되는데, 이때 헤더 정보에 포함되지 않고 데이터 부분에 요청 정보가 들어가게 된다.
전송 형태
POST [request-uri]?query_string
HTTP/1.1\r\n
HOST:[Hostname] 혹은 [IP] \r\n
Content-Lenght:[Lenght in Bytes] \r\n
\r\n
[query-string] 혹은 [데이터]
HEAD
HEAD 요청 방식은 GET과 유사한 방식이나 웹 서버에서 헤더 정보 이외에는 어떤 데이터도 보내지 않는다.
웹 서버의 다운 여부 점검(Health Check)이나 웹 서버 정보(버전 등)등을 얻기 위해 사용될 수 있다.
전송 형태
HEAD [request-uri] HTTP/1.1\r\n
Host: [Hostname] 혹은 [IP] \r\n
OPTIONS
rfc2616
해당 메소드를 통해 시스템에서 지원되는 메소드 종류를 확인할 수 있다.
전송 형태
OPTIONS [request-ri]
HTTP/1.1\r\n
Host: [Hostname] 혹은 [IP] \r\n
PUT
POST와 유사한 전송 구조를 가지기 때문에 헤더 이외에 메시지(데이터)가 함께 전송된다.
원격지 서버에 지정한 콘텐츠를 저장하기 위해 사용되며 홈페이지 변조에 많이 악용되고 있다.
전송 형태
PUT [request-uri] HTTP/1.1\r\n
Host: [Hostname] 혹은 [IP] \r\n
Content-Lenght:[Length in Bytes] \r\n
Content-Type:[Content Type] \r\n
\r\n
[데이터]
PATCH
PUT과 유사하게 요청된 자원을 수정(UPDATE)할 때 사용한다.
PUT의 경우 자원 전체를 갱신하는 의미지만, PATCH는 해당자원의 일부를 교체하는 의미로 사용된다. 즉, 리소스를 부분적으로 변경한다.
전송 형태
PATCH [request-uri] HTTP/1.1\r\n
Host: [Hostname] 혹은 [IP]\r\n
Content-Lenght:[Length in Bytes]\r\n
Content-Type:[Content Type]\r\n
\r\n
[데이터]
DELETE
원격지 웹 서버에 파일을 삭제하기 위해 사용되며 PUT과는 반대 개념의 메소드이다.
전송 형태
DELETE [request-uri] HTTP/1.1\r\n
Host: [Hostname] 혹은 [IP] \r\n
\r\n
TRACE
원격지 서버에 Loopback(루프백) 메시지를 호출하기 위해 사용된다.
전송 형태
TRACE [request-uri] HTTP/1.1\r\n
Host: [Hostname] 혹은 [IP] \r\n
\r\n
CONNECT
웹 서버에 프락시 기능을 요청할 때 사용된다.
전송 형태
CONNECT [request-uri] HTTP/1.1\r\n
Host: [Hostname] 혹은 [IP] \r\n
\r\n
요청 대상(경로 이름)
요청 대상은 URL, 경로, 쿼리 문자열 등을 포함한다.
이하의 굵은 문장이 “요청 대상"에 해당한다.
요청 대상 형식 | 형식 예 | 설명 |
---|---|---|
origin form | - POST / HTTP/1.1 - GET /background.png HTTP/1.0 - HEAD /test.html?query=alibaba HTTP/1.1 - OPTIONS /anypage.html HTTP/1.0 |
일반적인 형식 |
absolute form | GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1 | 프록시로 GET 할 때 사용 |
authority form | CONNECT developer.mozilla.org:80 HTTP/1.1 | CONNECT에서 사용 |
asterisk form | OPTIONS * HTTP/1.1 | OPTIONS에서 사용 |
HTTP 프로토콜 버전
HTTP 버전을 나타낸다. 일반적으로 HTTP/1.1 or 2.0 이다.
HTTP Header (요청 헤더)
요청 헤더에는 세 가지 유형이 있다.
헤더 유형 | 설명 | 예 |
---|---|---|
응답 헤더 | 요청 본문의 데이터와 관련이 없는 헤더 | - Host - User-Agent - Accept - - If- - Referer |
일반 헤더 | 검색할 리소스 | - Date - Cache-Control |
엔티티 헤더 | 요청 본문에 적용 | - Content-Type - Content-Length - Expires |
HTTP Body (요청 본문)
HTTP 요청 본문은 요청에서 보낼 데이터이다.
일반적으로 ‘GET’, ‘HEAD’, ‘DELETE’, ‘OPTIONS’에는 요청 본문이 없다. (리소스를 조회하거나 삭제하는 경우에만 사용한다.)
요청 본문은 POST, PUT 등으로 리소스에 데이터를 전송하는 경우에 이용한다.
요청 본문 확인
% curl --trace-ascii - http://www.devkuma.com/ -XPOST -d 'user=kimkc,password=1234'
=> Send data, 24 bytes (0x18)
0000: user=kimkc,password=1234