개발여행

HTTP 버전에 대해 알아보기 본문

CS

HTTP 버전에 대해 알아보기

jbilee 2024. 11. 4. 15:29

HTTP는 인터넷 상에서 웹 클라이언트(브라우저 등)와 웹 서버 간 데이터를 전송할 때 사용하는 프로토콜이다. 크롬이나 파이어폭스 같은 웹 브라우저 애플리케이션이 HTTP 프로토콜을 통해 서버와 웹 페이지, 이미지, 영상 등의 데이터를 주고 받는다.

 

HTTP/0.9

태초의 버전이지만 당시에는 따로 버전 라벨이 없었기 때문에 나중에 0.9를 붙여줬다. 한줄짜리 GET 요청만 썼었고, 리소스 주소도 프로토콜, 서버, 포트 번호가 필요 없었기 때문에 전체 주소를 쓰지 않았다.


응답도 굉장히 간단하게 요청한 파일 그 자체만 들어있었고, HTML 파일만 전송 가능했다. 헤더, 상태, 에러코드의 개념이 없었다. 문제가 발생하면 상황을 알리는 특수한 HTML 파일이 생성되는 방식이었다.

 

요청ㅡ응답 예시:

요청:
GET /my-page.html

응답:
<html>
  A very simple HTML page
</html>

 

HTTP/1.0

버전의 개념이 생겨서 요청 정보에 같이 담기기 시작했다. 또한 요청과 응답 메세지에 헤더가 생겨서 메세지에 대한 메타정보를 추가할 수 있게 됐고, 이로 인해 HTTP 프로토콜의 확장성이 무궁무진해졌다. 초기 버전 0.9는 HTML 문서만 전달할 수 있었는데, Content-Type 헤더를 설정해 HTML이 아닌 파일도 전송할 수 있게 됐다.


서버 응답에 상태 코드도 추가해 브라우저가 요청의 성공/실패 여부를 판단하고 상태에 따라 추가 요청을 날리는 등의 대응을 할 수 있게 됐다. 다만 1개의 연결 당 1개의 요청을 처리해서 매 요청마다 새로운 연결을 열기 위한 TCP 3-way handshake가 발생하는 지연(latency) 이슈가 있었다.

 

그 외에도 기존의 GET 메서드에 추가적으로 POST와 HEAD 메서드가 생겼다. POST 메서드를 사용해 클라이언트에서 데이터 생성 요청을 보내는게 가능해졌다.

 

요청ㅡ응답 예시:

요청:
GET /my-page.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

응답:
HTTP/1.0 200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
A page with an image
  <IMG SRC="/my-image.gif">
</HTML>

 

⚠ 참고: 일부 브라우저와 서버는 서버가 응답한 후에도 클라이언트ㅡ서버 연결을 유지할 수 있도록 HTTP/1.0 프로토콜의 스펙을 확장해서 Connection: keep-alive 헤더값을 만들어 사용했다. 당시에는 실험적인 기능이었어서 표준 스펙이 아닌 HTTP/1.0+ 버전에서만 지원했고, 기본 값은 Connection: close(연결 종료)였기 때문에 따로 “keep-alive” 세팅을 해줘야했다.

 

HTTP/1.1

HTTP 프로토콜의 첫 표준화 버전이다. 지속 연결, 파이프라이닝, 캐시 관리 개선, 신규 메서드 등이 소개됐다.

  • 지속 연결(persistent connection)이라는 개념과 Connection 헤더가 표준화되었다. 지정된 시간 동안 클라이언트ㅡ서버 연결을 열어둬서 반복적인 3-way handshake를 줄일 수 있게 됐다.
  • 파이프라이닝은 연결이 keep-alive인 상태에서 요청을 여러번 보낼 때, 이전 요청이 응답 받을 때까지 기다리지 않고 한꺼번에 요청을 보내는 것이다. 서버는 먼저 들어온 순번이 먼저 나가는 FIFO(First In, First Out) 방식을 따라 요청이 들어온 순서대로 응답을 보내는데, 이 때문에 각 요청은 앞에 들어온 요청이 처리될 때까지 처리되지 않고 기다려야 해서 head of line 블로킹이 발생한다.
  • Host 헤더를 추가해 하나의 IP 주소에서 여러 도메인을 호스팅할 수 있게 됐다.
  • PUT, DELETE, OPTIONS, TRACE 메서드가 추가됐다.

요청ㅡ응답 예시: (HTML 문서를 받아오고 연이어 .png 이미지도 받아오는 요청과 응답)

요청 1:
GET /en-US/docs/Glossary/CORS-safelisted_request_header HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_request_header

응답 1:
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 20 Jul 2016 10:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
Server: Apache
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding

(content)

요청 2:
GET /static/img/header-background.png HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_request_header

응답 2:
HTTP/1.1 200 OK
Age: 9578461
Cache-Control: public, max-age=315360000
Connection: keep-alive
Content-Length: 3077
Content-Type: image/png
Date: Thu, 31 Mar 2016 13:34:46 GMT
Last-Modified: Wed, 21 Oct 2015 18:27:50 GMT
Server: Apache

(image content of 3077 bytes)

 

HTTP/2.0

  • 멀티플렉스 프로토콜을 사용해 HTTP/1.1의 head-of-line 블로킹 이슈를 해결했다. 멀티플렉스는 하나의 TCP 연결로 여러개의 메세지를 동시다발적으로 주고 받는 방법이며, 응답이 요청 순서에 상관없이 스트림(프레임 단위의 메세지로 이루어진 것)의 형태로 전송된다.
  • 리소스의 우선순위를 정해 먼저 필요한 리소스부터 보내주는 스트림 우선순위(stream prioritization) 통신을 사용하게 됐다.
  • 헤더 압축이 가능해졌다.

 

HTTP/3.0

  • Transport 계층에서 TCP 대신 UDP 프로토콜로 연결해 전송 속도를 높이는 QUIC 프로토콜을 도입했다.
  • QUIC 프로토콜로 인해 사용자가 네트워크를 변경해도(예: 모바일 기기에서 와이파이를 사용하다가 LTE로 전환) 연결을 유지시킬 수 있게 됐다.
  • HTTP/2.0의 멀티플렉싱을 개선시켜 head of line 블로킹을 완전히 없앴다.