Published on

HTTP 프로토콜 정리

Authors
  • avatar
    Name
    JaeHyeok CHOI
    Twitter
    none

HTTP 메시지

HTTP 메시지는 서버와 클라이언트 간에 데이터가 교환되는 방식이다.

메시지

  • 요청 (Request) : 클라이언트가 서버로 전달해서 서버가 액션이 일어나게 함.
  • 응답 (Response) : 요청에 대한 서버의 답변

메시지는 ASCII로 인코딩된 텍스트 정보이며, 여러 줄로 되어 있다. HTTP 프로토콜 초기 버전과 HTTP/1.1 에서는 클라이언트와 서버 사이의 연결을 통해 공개적으로 전달되었다. 이렇게 한 때 사람이 읽을 수 있었던 메시지는 HTTP/2 에서 최적화와 성능 향상을 위해 HTTP 프레임으로 나누어 진다.

웹 개발자가 손수 HTTP 메시지를 텍스트로 작성하는 경우는 없고 SW, 브라우저, 프록시 혹은 웹 서버가 HTTP 메시지를 생성하며 전송한다. HTTP 메시지는 설정 파일 (프록시 혹은 서버의 경우), API(브라우저의 경우) 혹은 다른 인터페이스를 통해 제공된다.

httpmsg2.png

HTTP/2 의 이진 프레이밍 메커니즘 (binary framing mechanism)은 사용중인 API나 설정 파일 등을 변경하지 않아도 되도록 설계 되었기 때문에, 사용자가 보고 이해하기 쉽다.

HTTP 요청과 응답의 구조는 서로 닮았다.

  1. 시작 줄(’start-line’) 에는 실행되어야 할 요청 또는 요청 수행에 대한 성공/실패가 기록된다.
  2. 옵션으로 ‘HTTP 헤더’ 세트가 들어간다. 여기엔 요청에 대한 설명 혹은 메시지 본문에 대한 설명이 들어간다.
  3. 요청에 대한 모든 메타 정보가 전송되었음을 알리는 빈 줄(’blank line’)이 삽입된다.
  4. 요청과 관련된 내용 (HTML 폼 컨텐츠 등)이 옵션으로 들어가거나 응답과 관련된 문서가 들어간다. 본문의 존재 유무 및 크기는 첫 줄과 HTTP 헤더에 명시된다.

HTTP 메시지의 시작 줄과 HTTP 헤더를 묶어서 ‘요청 헤드(head)’ 라고 부르며 이와 반대로 HTTP 메시지의 페이로드는 ‘본문(body)’라고 한다.

httpmsgstructure2.png


HTTP 요청

시작 줄

HTTP 요청은 서버가 특정 동작을 취하게 끔 만들기 위해 클라이언트에서 전송하는 메시지이다.

시작 줄의 요소

  • ‘HTTP 메서드’

    • GET
    • PUT
    • POST
    • HEAD
    • OPTIONS

    위 메서드를 사용해 서버가 수행해야 할 동작을 나타낸다.

  • ‘요청 타겟’

    • 주로 URL, 프로토콜, 포트, 도메인의 절대 경로로 나타낼 수도 있으며 이들은 요청 컨텍스트에 의해 특정지어 진다. 요청 타겟 포맷은 HTTP 메소드에 따라 달라진다. 포맷에는 다음과 같은 것들이 있다.
      • 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 형식’으로 알려진 완전한 URL은 프록시에 연결하는 경우 대부분 GET 과 함께 사용됨.
    • authority 형식 으로 알려지고 도메인 이름 및 옵션 포트 (’:’ 가 앞에 붙는다.)로 이루어진 URL의 인증 컴포넌트이다. HTTP 터널을 구축하는 경우에만 CONNECT 와 함께 사용할 수 있다.
    • OPTIONS 와 함께 별표 '*' 하나로 서버 전체를 나타내는 ‘asterisk 형식’ 이다. OPTIONS * HTTP/1.1
  • 메시지의 남은 구조를 정의하는 HTTP 버전은 응답 메시지에서 써야 할 HTTP 버전을 알려주는 역할을 한다.

헤더

요청에 들어가는 HTTP 헤더는 HTTP 헤더의 기본 구조를 따른다.

대소문자 구분없는 문자열 다음에 콜론이 붙으며, 그 뒤에 오는 값은 헤더에 따라 달라진다. 헤더는 값까지 포함해 한 줄로 구성되지만, 꽤 길어질 수도 있다.

요청 헤더의 종류

  • General 헤더 - 메시지 전체에 적용됨

    HTTP 헤더를 가리키는데 사용되는 구식 용어, 요청 메시지와 응답 메시지 모두에 사용할 수 있지만 콘텐츠 자체에 적용되지는 않는다.

  • Response 헤더

    조건적으로 제한(If-None-Match)하거나 컨텍스트(Referer)를 제공하여 특정하여 요청을 수정한다.

  • Representation 헤더

    메시지 데이터의 원본 형식과 적용된 인코딩을 설명한다. (Content-Type)

http_request_headers3.png

본문

본문은 요청의 마지막 부분에 들어간다. 모든 요청에 본문이 들어가지는 않는다. GET, HEAD , DELETE , OPTIONS 처럼 리소스를 가져오는 요청은 보통 본문이 필요 없다. 일부 요청은 업데이트를 하기 위해 서버에 데이터를 전송한다.

종류

  • Content-TypeContent-Length로 정의된 단일 파일로 구성되는 단일-리소스 본문
  • 각각 서로 다른 정보를 담고 있는 멀티파트 본문으로 구성되는 다중 리소스 본문

HTTP 응답

상태줄

HTTP 응답의 시작 줄은 ‘상태 줄’ 이라고 불린다.

  1. HTTP/1.1 인 프로토콜 버전
  2. 요청의 성공 여부를 나타내는 상태 코드
  3. 사람이 HTTP 메시지를 이해할 때 도움이 되는 상태 코드에 대한 상태 텍스트

헤더

응답에 들어가는 HTTP 헤더는 다른 헤더와 동일한 구조를 따른다. 대소문자를 구분하지 않는 문자열 다음에 콜론이 오며, 그 뒤에 오는 값은 구조가 헤더에 따라 달라진다. 헤더는 값을 포함해 전체를 한 줄로 표시한다.

응답 헤더의 종류

  • General 헤더

    메시지 전체에 적용된다. Via

  • Response 헤더

    상태 줄에 포함되지 않은 서버에 대한 추가 정보를 제공한다. Vary, Accep-Ranges

  • Representation 헤더

    메시지 데이터의 원래 형식과 적용된 인코딩을 설명한다. Content-Type

http_response_headers3.png

본문

응답의 마지막에 들어간다. 모든 응답에 본문이 들어가지는 않는다. 해당 페이로드 없이도 요청에 충분히 응답하는 201 **Created** 204 **No Content** 과 같은 상태 코드를 가진 응답에는 보통 본문이 없다.

본문의 종류

  • 단일 리소스 본문

    Content-TypeContent-Length 라는 헤더의 정의하는 길이가 알려진 하나의 파일로 구성

  • 단일 리소스 본문

    Transfer-Encodingchunked 로 설정된 청크로 나뉘어 인코딩되는 길이를 모르는 하나의 파일로 구성

  • 다중 리소스 본문

    서로 다른 정보를 담고 있는 멀티 파트 본문


HTTP/2 프레임

HTTP/1.x 메시지는 몇가지 성능 결함이 있습니다.

  • 본문은 압축이 되지만, 헤더는 압축이 되지 않습니다.
  • 연속된 메시지들은 비슷한 헤더 구조를 가지지만 메시지마다 반복되어 전송되고 있습니다.
  • 다중전송(multiplexing)이 불가능합니다. 서버 하나에 연결을 여러개 열어야 하고, 적극적인(warm) TCP 연결이 소극적인(cold) TCP 연결보다 효율적입니다.

HTTP/2에서는 추가적인 단계가 도입되었습니다. HTTP/1.x 메시지를 프레임으로 나누어 스트림에 끼워 넣는 것입니다. 데이터와 헤더 프레임이 분리 되었기 때문에, 헤더를 압축할 수 있습니다. 스트림 여러개를 하나로 묶을 수 있어서(이러한 과정을 '멀티플렉싱'이라 합니다), 기저에서 수행되는 TCP 연결이 좀 더 효율적으로 이루어집니다.

binary_framing2.png

출처 : MDN

https://developer.mozilla.org/ko/docs/Web/HTTP/Messages



웹 개발자 입장에서의 HTTP 응용

HTTP 요청과 응답

  • HTTP 요청: 클라이언트(웹 브라우저 등)가 서버에게 특정 리소스에 대한 작업을 요청할 때 사용합니다. 요청은 메소드, URL, 헤더, 그리고 필요한 경우 바디(body)를 포함합니다.
  • HTTP 응답: 서버가 클라이언트의 요청에 대해 응답할 때 사용합니다. 응답은 상태 코드, 헤더, 그리고 응답 바디를 포함할 수 있습니다.

HTTP 헤더

  • 목적: HTTP 헤더는 요청과 응답에 대한 추가 정보를 제공합니다.
  • 종류:
    • 일반 헤더: 요청과 응답 모두에 적용되는 헤더입니다 (예: DateCache-Control).
    • 요청 헤더: 서버에 대한 추가 정보와 클라이언트의 선호도를 나타냅니다 (예: User-AgentAccept).
    • 응답 헤더: 응답에 대한 추가 정보를 제공합니다 (예: ServerSet-Cookie).
    • 엔티티 헤더: 요청이나 응답 바디의 정보를 제공합니다 (예: Content-TypeContent-Length).

HTTP 메소드

  • GET: 리소스를 검색할 때 사용합니다.
  • POST: 서버에 데이터를 제출할 때 사용합니다.
  • PUT: 지정된 리소스를 업데이트할 때 사용합니다.
  • DELETE: 지정된 리소스를 삭제할 때 사용합니다.
  • HEAD: GET 메소드와 유사하지만, 리소스의 바디는 반환하지 않고 헤더 정보만 반환합니다.

HTTP 상태 코드

  • 1xx (정보): 요청을 받았으며 프로세스가 계속됩니다 (예: 100 Continue).
  • 2xx (성공): 요청이 성공적으로 수행되었습니다 (예: 200 OK201 Created).
  • 3xx (리다이렉션): 추가 조치가 필요합니다 (예: 301 Moved Permanently302 Found).
  • 4xx (클라이언트 오류): 클라이언트의 잘못된 요청 (예: 404 Not Found403 Forbidden).
  • 5xx (서버 오류): 서버가 요청을 처리하지 못함 (예: 500 Internal Server Error503 Service Unavailable).

HEAD 메소드

  • 용도: HEAD 메소드는 해당 리소스에 대한 헤더 정보만을 요청합니다. 실제 데이터를 다운로드하지 않기 때문에, 리소스의 유무나 변경 여부를 확인하는 데 유용합니다.
  • 응답: HEAD 요청에 대한 응답은 바디를 포함하지 않으며, 상태 코드와 헤더 정보만을 포함합니다.