목차

  1. 메시지 타입
  2. 메시지 헤더
  3. 공통 메시지 헤더 필드

1. 메시지 타입

HTTP 메시지는 클라이언트에서 서버로의 request와 서버에서 클라이언트로의 response로 이루어져 있다.

HTTP-message    =  Simple-Request        ; HTTP/0.9 메시지
                |  Simple-Response
                |  Full-Request          ; HTTP/1.0 메시지
                |  Full-Response

Full-Request와 Full-Response는 RFC822의 일반적인 형식을 이용해서 entity를 전송한다. 두 종류의 메시지 모두 선택적으로 헤더 필드와 entity body를 가질 수 있다. entity body는 null line(CRLF만 있는 라인) 으로 분리된다.

Full-Request    =  Request-Line          ; Section 5.1
                   *( General-Header     ; Section 4.3
                    | Request-Header     ; Section 5.2
                    | Entity-Header )    ; Section 7.1
                   CRLF
                   [ Entity-Body ]       ; Section 7.2

Full-Response   =  Status-Line           ; Section 6.1
                   *( General-Header     ; Section 4.3
                    | Response-Header    ; Section 6.2
                    | Entity-Header )    ; Section 7.1
                   CRLF
                   [ Entity-Body ]       ; Section 7.2

Simple-Request와 Simple-Response는 헤더 정보의 사용을 금지하며, Request method를 GET 하나로 제한한다.

Simple-Request  =  "GET" SP Request-URI CRLF

Simple-Response =  [ Entity-Body ]

Simple-Request 형식을 사용하는 것은 서버가 반환하는 entity의 타입을 표시하지 못하게 하기 때문에 사용하지 않기를 권장한다.

2. 메시지 헤더

공통 헤더(Section 4.3), Request 헤더(Section 5.2), Response 헤더(Section 6.2), 그리고 Entity 헤더(Section 7.1) 필드를 포함하는 HTTP 헤더는 RFC822Section 3.1의 형식을 따른다. 각 헤더 필드는 이름과 콜론, 한 개의 공백(SP), 그리고 필드 값으로 이루어진다. 이 때, 필드 이름은 대소문자 구분을 하지 않는다. 그리고 권장하는 방법은 아니지만 헤더 필드는 줄의 맨 처음에 한 개 이상의 공백(SP)이나 탭(HT)을 붙임으로써 여러 줄에 걸쳐 구성될 수 있다.

HTTP-header     =  field-name ":" [ field-value ] CRLF

field-name      =  token
field-value     =  *( field-content | LWS )

field-content   =  <필드 값을 구성하는 OCTET,
                    *TEXT, 혹은 token이나 tspecial, quoted-string의 조합>

어떤 헤더 필드를 먼저 수신하는지의 순서는 중요하지 않다. 하지만 공통 헤더를 먼저 보내고 Request-Header나 Response-Header를 Entity-Header보다 먼저 보내는 것이 “좋은 습관”이다.
같은 필드 이름을 가진 여러 HTTP 헤더 필드가 존재하는 경우는 오직 해당 필드의 필드 값이 쉼표로 분할된 리스트[i.e., #(values)]로 정의되어있을 때 뿐이다. 이 때, 반드시 각 필드 값을 쉼표로 구분해서 차례로 붙임으로써 메시지의 시맨틱을 변경하지 않고 여러 개의 헤더 필드를 하나의 ‘필드 이름: 필드 값’ 쌍으로 만드는 것이 가능해야 한다.

3. 공통 메시지 헤더 필드

Request와 Response 모두에서 사용 가능하지만 entity에는 사용할 수 없는 몇 가지 헤더 필드가 있다. 이 헤더는 전송되는 메시지에만 적용된다.

General-Header  =  Date                 ; Section 10.6
                |  Pragma               ; Section 10.12

공통 헤더 필드의 이름은 프로토콜의 버전 변화에 따라 안정적으로 확장될 수 있다. 한편, 새롭거나 실험적인 공통 메시지 헤더 필드는 통신 구성원 모두가 공통 헤더 필드라고 인식했을 때에만 공통 헤더로서의 시맨틱을 가진다. 그렇지 않은 경우 해당 헤더는 Entity 헤더 필드로 인식된다.

헤더 문법 정리

HTTP-header     =  field-name ":" [ field-value ] CRLF

field-name      =  token
field-value     =  *( field-content | LWS )

field-content   =  <필드 값을 구성하는 OCTET,
                    *TEXT, 혹은 token이나 tspecial, quoted-string의 조합>

token           =  1*<US-ASCII 캐릭터(0~127)중 제어문자와 tspecial을 제외한 문자>
LWS             =  [ CRLF ] 1*( SP | HT )
TEXT            =  <제어 문자를 제외하고 LWS를 포함하는 모든 OCTET>
OCTET           =  <모든 8-bit 수열로 이루어진 데이터>

General-Header  =  Date                 ; Section 10.6
                |  Pragma               ; Section 10.12