잡동사니

HTTP의 이해 본문

IT/Web

HTTP의 이해

yeTi 2020. 2. 5. 13:46

안녕하세요. yeTi입니다.
오늘은 HTTP(Hypertext Transfer Protocol)에 대해 알아보려고 합니다.

HTTP - 위키백과에 따르면 HTTP는 WWW상에서 정보를 주고받을 수 있는 Request-Response 프로토콜로, 주로 HTML 문서를 주고받는데 사용됩니다.

현재 주로 사용하는 HTTP/1.1의 표준은 공식적으로 1997년 1월에 출시되었고, HTTP/2는 2015년 5월에 출시되었다.

HTTP/1.1

RFC 2068에 따르면, HTTP는 Application-level 프로토콜로 Generic, Stateless, Object-oriented의 특성을 가지며 다양한 환경에서 사용가능하다.

첫 버전인 HTTP/0.9는 raw data를 전송하기 위한 단순한 프로토콜이었는데, HTTP/1.0을 발표하면서 MIME타입의 메시지 포맷이나 메타정보, Request/Response 형태를 지원하게 됐다.

이 후 HTTP/1.0을 보완한 HTTP/1.1을 발표하면서 hierarchical proxies, 캐싱, connection의 지속, 가상 호스트를 지원하게 됐다.

그리고 URI(Uniform Resource Identifier), URL(Uniform Resource Location), URN(Uniform Resource Name)와 같은 규약을 정하여 찾고자하는 리소스나 방식(Method)를 정의할 수 있도록 했습니다. 또한 SMTP, NNTP, FTP, Gopher, WAIS 프로토콜과 호환할 수 있도록 generic 프로토콜을 사용합니다.

클라이언트는 서버에 request를 보내는데, 이 떄 request method, URI, 프로토콜 버전, MIME 타입, 클라이언트의 정보, body content를 커넥션으로 보내고, 서버는 상태, 프로토콜 버전, 성공/실패 코드, MIME 메시지, 메타정보, body content를 response로 보냅니다.

프로토콜의 파라메터를 나열하면 다음과 같습니다.

  • HTTP 버전
  • URI
  • Date/Time 포맷
  • 캐릭터 셋
  • Content Codings
  • Transfer Codings (Header field : Transfer-Encoding)
  • Media Types (Header field : Content-Type, Accept)
  • Product Tokens
  • Quality Values
  • Language Tags
  • Entity Tags
  • Range Units

메시지의 구성은 다음과 같습니다.

  • 타입
  • 헤더
  • 바디
  • 바디의 길이

Request 메시지는 추가적으로 Method와 Request-URI를 가집니다.

Response 메시지는 추가적으로 상태 코드와 이유를 가집니다.

그 밖에

접속에 대한 인증, 캐싱, 보안에 대한 규약을 가지고 있습니다.

HTTP/2

HTTP/1.1은 가장 광범위하게 쓰이는 프로토콜 중 하나입니다. 하지만 근래에 커넥션과 관련하여 어플리케이션의 퍼포먼스를 떨어뜨리는 몇몇 특성이 있습니다.

특히, HTTP/1.0은 TCP connection으로 하나의 request만 외부에 요청을 보낼 수 있었던데에 반하여 HTTP/1.1은 request pipelineing을 지원하여 부분적으로 request의 동시성 문제를 해결했으나 여전히 head-of-line blocking를 가지고 있습니다.

따라서 HTTP/1.0과 HTTP/1.1을 사용하는 클라이언트는 동시성을 달성하고 latency를 줄이기 위해 다수의 커넥션을 사용해야합니다. 게다가 HTTP 헤더가 반복적이고 간결하지 않아 불필요한 네트워크 트래픽을 발생하는 문제가 있는데, 이는 다수의 request를 보내기 위해 TCP connection을 만드는 과정에서 필요이상의 latency를 만들 수 있습니다.

이에 HTTP/1.1의 대안으로 HTTP/2가 발표됐고, RFC 7540에 따르면 HTTP/2는 네트워크의 리소스를 보다 효율적으로 사용하고 헤더 필드 압축에 따른 지연 감소, 동일 커넥션에서 다수의 메시지 교환을 할 수 있도록 지원합니다.

즉, 동일한 연결에서 request 및 response 메시지에 대한 인터리빙을 허용여 HTTP 헤더를 효과적으로 사용할 수 있도록 합니다. 또한 request의 우선 순위를 정할 수 있어 보다 중요한 request를 빠르게 전송하여 성능을 더욱 향상시키도록 합니다.

기본 단위 - Frame

HTTP/2는 프레임을 기본 단위로 사용합니다. 예를 들어 HEADERS and DATA 프레임은 일반적인 HTTP request/response 모델을 처리하고, SETTINGS, WINDOW_UPDATE, PUSH_PROMISE는 HTTP/2의 새로운 기능을 지원합니다.

기본적으로 프레임은 커넥션을 한번 맺으면 endpoint간 메시지 교환을 계속 할 수 있고, 그렇기 때문에 Stream이나 Multiplexing이 가능하다.

프레임의 레이아웃은 다음과 같다.

    +-----------------------------------------------+
    |                 Length (24)                   |
    +---------------+---------------+---------------+
    |   Type (8)    |   Flags (8)   |
    +-+-------------+---------------+-------------------------------+
    |R|                 Stream Identifier (31)                      |
    +=+=============================================================+
    |                   Frame Payload (0...)                      ...
    +---------------------------------------------------------------+

                          Figure 1: Frame Layout

HTTP/1.1의 메시지의 변경

클라이언트는 기존의 HTTP/1.1의 requst를 HTTP/2로 변경하려면 다음과 같이 Upgrade에 대해서 정의해주면 된다.

GET / HTTP/1.1
Host: server.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
Comments