Network

[Network] HTTP에 대해서 알아보자!! (3편 - HTTP 메시지)

coding-knowjam(코딩노잼) 2022. 1. 8.
728x90

안녕하세요 coding-knowjam입니다.

오늘은 HTTP에서 요청과 응답에 사용되는 중요한 정보인 메시지에 대해서 알아보겠습니다.

 

1. HTTP Message

HTTP Message는 다음과 같은 구조를 가지고 있습니다.

(공식문서 : https://datatracker.ietf.org/doc/html/rfc7230#section-3)

HTTP-message =  start-line
                             *( header-field CRLF )
                              CRLF
                              [ message-body ]

각각의 라인에 대한 의미는 다음과 같습니다.

  • start-line : 시작 라인으로써 해당 메시지가 요청인지 응답인지에 따라서 다른 형태로 작성됩니다.
  • *( header-field CRLF ) : 메시지는 0개 이상의 헤더 필드는 가질 수 있으며, 헤더는 메시지에 대한 부가정보를 나타냅니다. 헤더가 작성될 때는 공백 라인을 통해 구분됩니다.
  • CRLF : 공백 라인을 의미합니다.
  • [ message-body ] : 메시지에서 전달하고자 하는 본문 내용이 작성됩니다. (html, json, xml 등등)

이제 각각의 라인들에 대해서 조금 더 자세하게 알아보겠습니다.

 

1.1 start-line (시작 라인)

시작 라인은 아래와 같이 request-line과 status-line으로 나누어지는데 해당 메시지가 요청인지 응답인지에 따라 구분됩니다.

(공식문서 : https://datatracker.ietf.org/doc/html/rfc7230#section-3.1)

start-line = request-line / status-line

 

요청 메시지는 다음과 같은 구조로 작성되며 내용은 다음과 같습니다.

(공식문서 : https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.1)

request-line = method SP request-target SP HTTP-version CRLF
  • method : 메서드는 서버가 수행해주길 원하는 동작을 지정하는 부분으로 GET, POST, PUT, DELETE 등이 있습니다. (해당 부분에 대해서는 추후에 따로 다루겠습니다)
  • SP : 공백(한 칸 띄움)을 의미합니다.
  • request-target : 요청 타깃은 URI의 형태로 작성되며 대부분의 요청은 절대 경로를 사용을 합니다. (https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.1)
  • HTTP-version : HTTP버전은 의미 그대로 현재 HTTP의 버전을 의미하는 부분입니다.
  • CRLF : 앞서 말씀드린 것과 동일한 공백 라인을 의미합니다.

위의 내용으로 작성된 예시는 아래와 같습니다.

출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본지식 (김영한 저)

 

 

응답 메시지는 다음과 같은 구조로 작성되며 내용은 다음과 같습니다.

(공식문서 : https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2)

status-line = HTTP-version SP status-code SP reason-phrase CRLF
  • HTTP-version : HTTP 버전을 의미합니다
  • SP : 공백(한 칸 띄움)을 의미합니다.
  • status-code : 상태 코드는 3자리의 정수로 표현되며(200, 300, 400, 500 등) 요청에 대한 응답의 결과를 의미합니다. 상태 코드에 대해서는 추후에 더 자세하게 다뤄보겠습니다. (https://datatracker.ietf.org/doc/html/rfc7231#section-6)
  • reason-phrase : 상태 코드에 대한 의미를 설명하는 목적으로 사용됩니다. (OK, BAD_REQUEST 등)

위의 내용을 바탕으로 작성된 예시는 다음과 같습니다.

출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본지식 (김영한 저)

 

1.2 header-field (헤더 필드)

헤더 필드는 요청 메시지, 응답 메시지 구분 없이 동일한 형태로 작성되며 다음과 같은 구조를 가집니다.

(공식문서 : https://datatracker.ietf.org/doc/html/rfc7230#section-3.2)

header-field = field-name ":" OWS field-value OWS
  • field-name : 헤더의 이름을 의미하며 대소문자를 구분하지 않습니다. 필드 이름 뒤에는 ":" (콜론)이 빈칸 없이 붙어야 합니다.
  • OWS : 공백(한 칸 띄움)을 의미하는데 띄어도 되고, 안 띄워도 된다는 것을 의미합니다.
  • field-value : 헤더의 값을 의미합니다.

헤더의 역할은 HTTP 메시지를 전송할 때 필요한 부가정보를 모두 나타내기 위해 사용합니다. 예를 들면 콘텐츠의 길이, 타입, host는 누구인지, 어느 브라우저에 요청했는지, 쿠키 정보, 인증정보 등등이 있습니다.

또한 필요에 의해서 임의의 헤더를 정의해서 사용할 수도 있습니다. (표준 헤더가 아니기 때문에 서로 약속한 서버와 클라이언트만 이해할 수 있습니다)

추가로 요청에서만 사용되는 헤더, 응답에서만 사용되는 헤더도 존재하며 이러한 정보들에 대해서는 추후 더 자세하게 다뤄보겠습니다.

위의 구조로 작성된 헤더의 예시는 아래와 같습니다.

출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본지식 (김영한 저)

 

1.3 message-body (메시지 바디)

메시지 바디는 HTTP 메시지에서 실제 전송하고자 하는 데이터가 들어있는 부분입니다. 메시지 바디에는 html, json, xml, 이미지 등 byte로 표현할 수 있는 모든 데이터가 들어갈 수 있습니다. 또한 요청 메시지와 응답 메시지 모두 메시지 바디를 가질 수 있습니다. 

메시지 바디의 길이가 0인 경우에도 요청과 응답에 메시지 바디가 포함되지만, 메시지 바디가 포함되지 않는 경우도 있습니다.(상태 코드 204, 304 등)

메시지 바디를 포함한 HTTP 메시지의 예시는 아래와 같으며 조금 더 자세한 내용은 공식문서를 살펴보시길 권해드립니다. (https://datatracker.ietf.org/doc/html/rfc7230#section-3.3)

출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본지식 (김영한 저)

 

해당 글은 인프런 - 모든 개발자를 위한 HTTP 웹 기본지식을 참고하여 작성하였습니다.

다음 포스팅에서는 HTTP 메서드와 상태 코드에 대해서 다뤄보겠습니다.


728x90

댓글