HTTP/1.1은 웹의 표준으로 오랫동안 사용되었지만 성능 면에서 한계가 분명했다. 특히 지연(latency) 문제와 커넥션 관리 문제 때문에 웹페이지 로딩 속도가 느려졌다.
이런 문제를 해결하기 위해 구글의 SPDY 프로토콜을 기반으로 발전한 것이 HTTP/2.0이다.

출처 : https://mark-kim.blog/HTTP2_0/
HTTP/1.1은 텍스트 기반 프로토콜이어서 메시지를 파싱하는 데 비용이 크고 오탈자나 구분자 처리 문제도 있었다. HTTP/2.0은 이러한 한계를 없애기 위해 모든 통신을 이진 형식으로 인코딩된 프레임 단위로 나눈다.
즉, HTTP/2.0은 텍스트 줄바꿈 기반 프로토콜에서 이진 프레임 기반 구조로 바뀌면서 파싱 오류 가능성을 줄이고 더 정밀한 제어가 가능해졌다.
HTTP/1.1에서는 하나의 연결에 대해 요청을 순차적으로 처리해야 해서 대기 시간이 길어졌다. 파이프라이닝을 통해 어느 정도 개선하려 했지만 여전히 응답이 순서에 묶이는 HOL(Head-of-Line) 블로킹 문제가 존재했다. HTTP/2.0은 하나의 TCP 커넥션 위에서 여러 개의 스트림을 동시에 처리할 수 있게 하여 병렬성을 크게 높였다. 즉, 이미지, CSS, JS와 같은 여러 리소스를 동시에
HTTP 요청과 응답에는 User-Agent, Cookie, Accept-Language 같은 헤더가 반복적으로 포함된다. HTTP/1.1에서는 이 헤더들이 매 요청마다 그대로 전송되어 대역폭 낭비가 컸다. HTTP/2.0은 HPACK이라는 전용 압축 방식을 도입해 중복된 헤더를 테이블에 저장하고 재사용한다. 이를 통해 불필요한 데이터 전송을 줄이고 네트워크 효율성을 크게 개선했다.
기존 HTTP는 반드시 클라이언트가 요청해야만 서버가 응답을 보냈다. HTTP/2.0은 서버가 클라이언트의 요청을 예측해 추가 리소스를 선제적으로 전송할 수 있도록 했다. 예를 들어 HTML 문서를 요청했을 때 해당 문서가 반드시 참조하는 CSS나 JS 파일을 서버가 미리 푸시해 주면 클라이언트는 별도의 요청을 기다릴 필요가 없어 로딩 속도가 빨라진다. 다만 불필요한 리소스를 과도하게 푸시하면 오히려 성능이 떨어질 수 있어 신중한 활용이 필요하다.
모든 리소스가 동일한 중요도를 가지는 것은 아니다. 사용자가 웹페이지를 열 때, 레이아웃을 구성하는 CSS나 핵심 스크립트가 이미지보다 더 빠르게 로드되어야 한다. HTTP/2.0은 각 스트림에 우선순위(priority)를 부여할 수 있어 중요한 리소스부터 네트워크 자원을 집중시킬 수 있다. 이를 통해 사용자 체감 성능을 더 높일 수 있다.
| 구분 | HTTP/1.1 | HTTP/2.0 |
|---|---|---|
| 전송 단위 | 텍스트 기반 메시지 | 이진 프레임 |
| 병렬 처리 | 파이프라이닝, 연결 다중화 한계 | 멀티플렉싱 지원 |
| 헤더 | 반복 전송 | HPACK 압축 |
| 서버 응답 | 요청 기반 | 서버 푸시 가능 |
| 성능 | HOL 블로킹, 지연 문제 | 병렬 스트림, 지연 최소화 |
HTTP/2.0은 HTTP/1.1의 한계를 보완하기 위해 기존 HTTP 인터페이스는 그대로 유지하면서 전송 방식을 혁신한 프로토콜이라는 점이 인상 깊었다. 특히 이진 프레이밍을 통해 통신 단위를 세분화하고 멀티플렉싱과 헤더 압축으로 성능을 극대화한 부분은 웹 성능 최적화의 핵심 아이디어였다. 또한 서버 푸시와 스트림 우선순위 같은 기능은 단순한 성능 향상을 넘어 사용자 경험(UX)까지 고려한 설계라는 점에서 의미가 있다. 다만 TCP 위에서 동작하기 때문에 근본적인 HOL 블로킹 문제는 남아 있으며 이를 해결하려는 시도가 HTTP/3와 QUIC이라는 사실을 알게 된 것도 큰 학습 포인트였다.
참고