HTTP1 부터 HTTP2, HTTP3 까지 각각의 한계를 어떻게 해결했는지, 성능 향상, 보안, 유저 경험에 대해 알아보자
HTTP/1은 1996년 소개되었다
이전의 HTTP/0.9 는 오직 GET 메소드만 헤더 없이 -> HTTP response만 포함하고 있었다
HTTP/1.0은 HTTP/0.9 에서 아래의 항목이 추가 되었다
하지만 매 요청마다 새로운 TCP 연결을 해야 했다
HTTP/1.1 는 HTTP/1.0의 한계를 극복하기 위해 1997년에 소개 되었다
HTTP/1.1 버전은 25년 넘게 장수하고 있는데 이러한 장수의 놀라운 비결은 무엇일까?
언급된 되로 HTTP는 단일 request, response 로 시작했다
클라이언트에서 서버를 연결하고, request 만들고 response를 받는다
그리고 연결 끝낸다 만약 다음 요청이 있으면 위의 과정을 반복한다.
이는 바쁜 음식점의 단일 웨이터 같다
웹 페이지가 멀티 리소스를 가져와야 할때도 연결과 끝내는 것을 반복해야 한다
또한 HTTP/1 는 3-way handshake 거쳤다 -> 연결의 비용이 높다
이러한 문제를 해결하기 위해 HTTP/1.1은 지속적 연결을 제공하면서 오버헤드를 낮췄다
TCP 연결은 닫으라는 말 없으면 열려 있어야 한다.
HTTP/1.1은 파이프 라인 개념으로도 소개되었다
클라이언트가 다중의 요청을 받는다 응답에 동기화 되지 않고
다음 요청을 보내기 전에 각각의 지연시간을 줄이면서 성능을 향상 시켰다
응답을 작은 청크로 보내는 것도 가능해 졌다 - 전체 응답을 생성하기 전에
초기 페이지의 렌더링을 빠르게하고 유저 경험을 좋게 하였다
HTTP/1.1은 세련된 캐싱 메커니즘과 조건부 request로도 소개된다.
헤더에 추가된 Cache-Control, ETag 등을 이용해 클라이언트와 서버가 캐시 데이터를 잘 관리하게 하고 불필요한 전송을 줄였다.
If-Modified-Since, If-None-Match 등을 이용해 수정된 리소스만 전송하고, 대역폭의 성능을 향상시켰다
HTTP/1.1 은 20여년 동안 웹의 놀라운 성장을 가능하게 했다
하지만 웹도 많이 진화 했다
네트워크를 통해 더 많은 데이터를 전송, 다운로드 한다
웹 사이트는 80~90의 데이터를 요청하고 2MB의 데이터를 다운로드 받는다
그래서 아래와 같은 문제점이 발생했다

웹 페이지의 리소스가 증가하면 지연시간이 커진다
이 문제를 해결하기 위한 해결책은 무엇일까?

HOL blocking 문제는 하나의 도메인에 여러 Http connection 으로 해결이 된다
하지만 요즘 사이트에서는 이것도 충분하지 않다
해결 방법으로 서브 도메인이 정적 리소스를 제공하게 하는 것
도메인 샤딩은 완벽해 보이지만 단점이 있다
TCP 는 slow-start 알고리즘이다
다른 해결방법은 요청수를 줄이는 것
하지만 이미지를 다시 고쳐 써야되는 개발 노력이 든다
HTTP1 의 성능 문제를 해결하기 위해서
HTTP1 는 사람이 읽을 수 있는 형태로 데이터를 보낸다
HTTP/2 는 binary format -> 프레임이라는 더 작은 단위로 전송 할 수 있게 한다
프레임은 기본적으로 TCP 패킷과 유사한 데이터 패킷
각 프레임은 단일 요청-응답 쌍을 나타내는 특정 스트림에 속한다
HTTP2는 HTTP 요청의 데이터 섹션과 헤더 섹션을 서로 다른 프레임으로 분리

프레임으로 나눔으로 효율적 전송이 가능하다
다른 스트림의 멀티 프레임도 같은 커넥션으로 전송 가능함
이럼에도 HTTP1 가 호환된다
장점
full 요청, 다중의 응답을 허용

다른 스트림을 사용하면서 동시에 보내고 받을 수 있다
스트림 우선순위도 지원
HTTP1 단일 요청, 응답이기 때문에 우선순위 필요 없음
HTTP2는 서버에서 브라우저로 리소스를 다시 보낼 수도 있음
서버는 우선순위가 높은 요청에 대해 더 많은 프레임을 보낸다
클라이언트가 요청하기 전에 서버에서 데이터를 전달
클라이언트 관점에서는 데이터를 캐시할지 거부할지 결정

HTTP1 은 기본데이터만 압축하고 헤더는 텍스트로 전송
왜냐하면 헤드는 상당히 작았기 때문에
하지만 현대는 api 요청이 자주있어 문제가 발생
HPACK 를 사용해서 헤드를 작게 만들었다

웹이 계속 발전해서 HTTP2 와 TCP의 한계가 명확해 졌다
HTTP2 는 상당히 발전했지만 TCP의 의존도가 성능 문제를 야기했다
그래서 구글에서 QUICK 을 등장 시켰다
이는 HTTP3 개발에 길을 열었다
HTTP3는 UDP를 사용한다


HTTP1
HTTP2
HTTP3