[HTTP] HTTP 1.1 vs HTTP 2.0

2023. 4. 14. 18:25몰랐던거/WEB


HTTP 1.1과 HTTP 2.0 비교하기

HTTP 1.1은 HTTP 2.0의 등장 전까지 무려 15년 동안이나 유지되었습니다.

하지만 시간이 지나감에 따라 멀티미디어 리소스나 비동기 요청들이 하나의 웹 사이트에서도 굉장히 많이 발생하게 되면서 더 이상 HTTP 1.1이 버티기가 힘들었고 HTTP 2.0이 등장하게 됩니다.

그럼 HTTP 1.1에서의 문제점을 알아보고 HTTP 2.0에서 이를 어떻게 개선했는지에 대해서 알아보겠습니다.

 

HTTP 1.1 알아보기

 일단 HTTP 1.0에서는 하나의 connection을 이용해서 하나의 요청을 처리할 수 있었고 이렇게 되면 멀티미디어 리소스가 많은 상황에서 네트워크 지연이 발생하게 됩니다. 

그래서 HTTP 1.1에서는 이를 해결하기 위한 하나의 방법으로 HTTP pipelining을 도입했습니다. 이것은 TCP 안에 두 개 이상의 HTTP 요청을 담아서 네트워크 지연을 줄이는 방식이지만 이는 정확한 구현도 힘들 뿐더러 HOL Blocking이라는 문제가 발생합니다.

HOL (Head of Line) Blocking

이는 앞선 요청에 의해서 후에 발생한 요청이 지연되는 현상을 의미합니다. 이름처럼 파이프라인을 방식을 이용하기 때문에 요청 받은 순서대로 응답이 되어야 해서 지연이 생기게 됩니다.

그리고 다른 문제는 무거운 헤더입니다.

무거운 헤더

많은 HTTP 요청들은 header 정보가 대부분 동일합니다. 하지만 HTTP 1.1에서는 이런 헤더를 그냥 중복해서 계속 사용했고 cookie 정보 역시 매 요청마다 헤더에 포함해서 전송했습니다.

그러다 보니까 불필요한 정보를 주고 받기 위해서 리소스의 낭비가 발생했습니다.

 

이것을 HTTP 1.1에서 해결하기 위해서 많은 개발자들이 노력을 했습니다.

  1. Image Spriting : 여러 이미지 파일들에 대해 각각의 요청을 하기 보단 한 번에 요청으로 끝내기를 택했고 여러 이미지를 모아서 큰 이미지를 만들어 CSS로 해당 이미지의 좌표값을 지정해서 사용했습니다.
  2. Domain Sharding : 하나의 도메인에 대해서 여러 개의 Connection을 생성해서 병렬로 요청을 보냅니다. 하지만 브라우저 별로 도메인 당 Connection 수가 제한되어 있어서 근본적인 해결책이 될 수 없습니다.
  3. CSS, JavaScript 최소화 : 전송 데이터 용량을 줄이기 위해 CSS, java script 파일을 최소화하여 통신했습니다.

HTTP 2.0 알아보기

HTTP 2.0은 기존 HTTP 1.1을 성능적으로 개선하는 쪽으로 방향성을 맞춘 프로토콜로 2015년 2월 표준으로 승인되었습니다. HTTP 1.1의 여러 문제들을 구글이 개발한 비표준 개방형 프로토콜 SPDY를 기반으로 개선했습니다.

Multiplexed Streams

먼저 HTTP 1.1의 pipelining의 개선안으로 하나의 Connection을 이용해서 여러 메시지를 주고 받을 수 있게 개선했습니다.

또한 응답에서 요청 순서와 상관없이 Stream으로 받아서 HOL Bocking 문제도 해결했습니다.

Stream Prioritization

응답에 대한 우선순위를 정해서 우선순위가 높다면 응답을 빨리 합니다. 이를 통해서 먼저 렌더링을 해야하는 부분들을 띄우고 우선순위가 낮은 리소스들을 나중에 띄우는 방식을 이용할 수 있게 되었습니다.

Server Push

서버가 클라이언트의 요청없이 응답을 보내는 방법입니다. 하나의 HTML 문서에 CSS, 여러 IMG 파일이 있다고 가정하면 기존에는 HTML 문서 요청 후 다시 각 리소스들을 요청했지만 Server Push로 인해서 클라이언트의 요청을 최소화하고 서버가 알아서 리소스를 보내주도록 개선했습니다.

Header Compression

헤더에 중복된 정보들이 많아 리소스 낭비가 심했던 HTTP 1.1에 대해서 HTTP 2.0에서는 Header Table과 Huffman Encoding을 사용하는 HPACK 압추방식으로 이를 개선했습니다.

클라이언트와 서버는 각각 Header Table을 관리하고 이전 요청과 동일한 필드는 table의 index만 보내고 변경되는 값은 Huffman Encoding 후 보냄으로써 Header의 크기를 경량화 했습니다.


마무리

HTTP 프로토콜을 많이 사용하지만 HTTP 프로토콜의 역사를 모르는 것 같아서 이에 대해서 공부했습니다. HTTP 3.0은 아직 보편화가 덜 되었다고 생각되어서 다음에 공부해볼 생각이고 알기로는 HTTP 2.0까지는 TCP/IP.를 사용해서 Connection 연결과 해제에 대한 HandShake 과정이 있는데 HTTP 3.0에서는 UDP/IP를 이용해서 이를 줄였다고 합니다.

 

Reference

https://ssungkang.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-HTTP-11-VS-HTTP-20

'몰랐던거 > WEB' 카테고리의 다른 글

[HTTP] HTTP 1.1 vs HTTP 2.0 (2)  (0) 2023.04.18
세션 vs 쿠키  (0) 2022.11.26
[Architecture] Layered Architecture(feat. MVC 패턴)  (0) 2022.11.05
Javascript, HTML, CSS  (0) 2022.08.30