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 요청 방식은 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