Home HTTP 0.9, 1.0, 1.1, 2.0
Post
Cancel

HTTP 0.9, 1.0, 1.1, 2.0

최근에 워게임 문제를 풀다가 HTTP 버전 차이로 인한 문제를 풀었습니다.
이에 HTTP1.0, HTTP1.1, HTTP2.0에 대하여 간단하게 알아봅시다.

What is HTTP?

HTTP(HyperText Transfer Protocol)는 인터넷 상에서 정보를 주고 받을 수 있는 프로토콜입니다.
신뢰성있는 연결을 하기 위해 주로 TCP를 이용하여 데이터를 주고 받습니다.
클라이언트와 서버 사이에 요청(Request), 응답(Response)을 하여 클라이언트는 서버에게 필요한 정보를 요청하고 서버는 클라이언트에게 요청에 대한 응답을 합니다.

HTTP는 0.9가 최초의 버전이며 1.0, 1.1 2.0을 거쳐 현재는 3.0이 나왔습니다.

HTTP Version

HTTP 0.9

HTTP 0.9는 최초의 HTTP 버전입니다.
특징으로는 one-line protocol이라고 불리며, GET 메소드만 사용이 가능합니다.
또한 헤더가 없어 HTML만 전송이 가능하고, 오류 코드에도 존재하지 않습니다.

1
2
3
4
5
6
7
[요청]
GET /mypage.html

[응답]
<html>
  A very simple HTML page
</html>

HTTP 1.0

HTTP 1.0이 도입되고 몇가지가 추가되었습니다.

  • 각 요청 안엥 버전 정보가 포함돠어 전송(HTTP/1.0)
  • 상태 코드 라인(응답)
  • HTTP 헤더
  • Content-type 헤더(다른 타입의 파일도 전송이 가능함)

다만 HTTP 1.0은 커넥션 하나당 요청 하나랑 응답 하나만 처리해줄 수 있습니다.
-> 성능 저하, 서버 부하 비용 증가

1
2
3
4
5
6
7
8
9
10
11
12
13
[요청]
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

[응답]
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="/myimage.gif">
</HTML>

HTTP 1.1

HTTP 1.1은 persist connection 이라는 개념이 도입되었습니다.
-> 한 커넥션의 여러 요청 전달이 가능합니다.

  • 연결을 재사용할 수 있어 시간이 절약
  • 파이프라이닝을 추가하여, 첫번째 요청에 대한 응답이 완전히 전송되기 전에 두번째 요청 전송을 가능케 하여, 통신 지연 시간이 단축
  • 청크된 응답도 지원
  • 추가적인 캐시 제어 메커니즘이 도입
  • 언어, 인코딩 혹은 타입을 포함한 컨텐츠 협상이 도입
  • Host 헤더 덕분에, 동일 IP 주소에 다른 도메인을 호스트하는 기능이 서버 배치가 가능

그러나 파이프라이닝에 Head Of Line Blocking, Header 구조의 중복 이슈가 존재합니다.
간단히 설명하자면 첫번째 요청이 지연되면 다른 요청도 지연이 되는 이슈입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[요청]
GET /en-US/docs/Glossary/Simple_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/Simple_header

[응답]
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)

HTTP 2.0

HTTP 2.0은 2015년에 도입되었습니다.
기존 HTTP 1.X 버전의 성능 향상에 초점을 맞춘 프로토콜로 표준의 대체가 아닌 확장을 도입했습니다.

  • 텍스트 프로토콜이 아닌 이진 프로토콜(바이너리 프레이밍 계층 사용)
    -> 파싱, 전송속도 향상, 오류 발생 가능성 낮춤
    -> 읽을 수도 없고 수동으로 만들 수 없음
    -> 이러한 장애물에도 불구하고, 향상된 최적화 기술을 구현할 수 있음
  • 다중화 프로토콜
    -> 동일한 연결을 통해 병렬 요청을 수행할 수 있어, HTTP/1.x 프로토콜의 제약을 없앰
  • 헤더를 압축
    -> 요청 집합 간에 유사한 경우가 많으므로, 전송된 데이터의 중복과 오버헤드가 제거
  • 서버가 서버 푸시라는 메커니즘
    -> 클라이언트 캐시에 데이터를 저장할 수 있음

후기

워게임에서 HTTP 1.1의 connection 헤더를 바꿔 분할 요청 공격을 통해 FLAG를 얻은 문제를 풀면서 HTTP 버전에 따라 어떻게 발전했는지 배울 수 있었습니다. 현재 HTTP 3.0이 나왔고, HTTP3.0의 경우 UDP 기반의 QUIC 프로토콜을 사용합니다.
HTTP 3.0의 경우 다음 글에서 다루도록 하겠습니다.