HTTP 요청/응답 구조에 대해서 - (1) HTTP 요청

April 02, 2019

이 글은 MDN documentation 을 정리한 글입니다.

HTTP (Hyper Text Transfer Protocol) 은 www 상에서 문서를 주고받는 프로토콜로써, TCP, UDP를 사용하며, 80 포트를 사용합니다.

HTTP/1.1에서는 클라이언트가 요청을 보내면 서버가 응답을 보내주는 구조이며, 이를 HTTP메시지 라고 합니다. 메시지 타입은 클라이언트가 서버로 전달해서 서버의 액션이 일어나는 요청 메시지 (Request) 와 서버가 답변하는 응답 메시지(Response)로 구성되어 있습니다. HTTP 메시지는 ASCII로 인코딩된 텍스트 정보이며, 이러한 메세지는 설정파일 (프록시, 서버) 혹은 API (브라우저 경우) 혹은 다른 기타의 인터페이스에 의해 가공되어 제공됩니다.

HTTP 메시지 구조

HTTP 요청 및 응답 메시지 구조는 다음과 같이 형성되어 있습니다.

  1. 시작줄(start line) - 실행해야 할 요청 및 요청 수행에 대한 결과가 기록됩니다.
  2. HTTP 헤더 세트 - 옵션으로써 요청에 대한 설명 및 본문(body)에 대한 설명이 기록됩니다.
  3. 빈줄 (blank line) - 요청에 대한 모든 메타정보가 전송되었음을 알립니다.
  4. 본문(body) - 요청과 관련된 내용 혹은 문서 (document)가 포함됩니다.

HTTP 요청 구조

시작줄 (start line)

  1. HTTP 메서드

동사(GET, PUT, POST) 혹은 명사 (HEAD, OPTIONS)를 사용하여 서버가 수행해야 할 동작들을 나타냅니다. 메서드에 대한 간략한 내용은 다음과 같습니다.

  • OPTIONS - 요청 URL에 어떠한 메서드를 요청 가능한지 확인합니다.
  • HEAD - GET과 비슷하나, 응답 Header만 받습니다.
  • GET - 리소스를 클라이언트로 가져옵니다.
  • POST - URL에 새로운 데이터를 보냅니다.
  • PUT - URL에 저장된 정보를 보냅니다.
  • DELETE - URL에 저장된 리소스를 삭제합니다.
  • TRACE - 보낸 메세지를 다시 받습니다.
  • CONNECT - 프록시에 사용되는 예약 메서드입니다.
  • 요청 타겟

주로 URL, 프로토콜, 포트, 도메인의 절대 경로로 나타낼 수 있으며, 이는 요청 컨텍스트에 따라 결정됩니다. 요청 타겟 포맷은 HTTP 메서드에 따라 달라집니다. 포맷 종류는 다음과 같습니다.

  • origin 형식: 끝에 ? 와 쿼리 문자열이 붙는 경로입니다. 사용되는 메서드는 GET, POST, HEAD, OPTIONS 입니다.

ex) POST / HTTP 1.1 GET /background.png HTTP/1.0 HEAD /test.html?query=alibaba HTTP/1.1

  • absolute 형식: 완전한 URL 형식이며, 프록시에 연결하는 경우 대부분 GET 과 함께 사용됩니다.

ex) GET http://www.xxx.com HTTP/1.1

  • authority 형식: 도메인 이름 및 옵션 포트 (:) 가 붙습니다. authority component이며, HTTP 터널을 구축하는 경우에만 CONNECT와 함께 사용 가능합니다.

ex) CONNECT developer.mozilla.org:80 HTTP/1.1

  • asterisk 형식: OPTIONS와 함께 별표(*) 하나로 서버 전체를 나타냅니다.

ex) OPTIONS * HTTP/1.1

헤더 (Header)

  • general 헤더 - Via, Connection 등의 내용이 포함됩니다.
  • Request 헤더 - User-Agent, Accept-Type과 같은 헤더로써 요청의 내용을 좀더 구체화 시키며, 컨텍스트를 제공하기도 합니다. (Referrer)
  • Entity 헤더 - Content-Length와 같이 본문이 적용된 내용에 관련된 헤더 입니다.
헤더 구조

본문 (Body)

본문은 요청의 마지막 부분에 삽입되며, GET, HEAD, DELETE, OPTIONS와 같이 리소스를 가져오는 요청은 본문이 필요없습니다. 일부 요청은 업데이트를 하기 위해 서버에 데이터를 전송하는데, 보통 POST 요청일 경우 Body를 포함하고 있습니다.

  • 단일-리소스 본문(single-resource bodies) - Content-Type 혹은 Content-Length로 정의된 단일 파일을 구성합니다.
  • 다중-리소스 본문(multiple-resource bodies) - 멀티파트 본문으로 구성되는 내용으로써, 보통 HTML폼 데이터와 관련있습니다.
...