HTTP란
📘 HTTP란?
HTTP는 데이터를 전송하기 위한 인터넷의 기본 프로토콜입니다.
웹서버와 웹브라우저 사이의 통신규약이라고도 표현할 수 있습니다.
1990년대에 팀 버너스리와 그의 팀이 개발하였고 지금까지 많은 기술적인 변화가 있었습니다.
처음에는 단순히 페이지만 전송하다가 점점 인터넷이 진화하면서 동영상, 스트리밍 등의 멀티미디어 데이터를 송수신했습니다.
나중엔 유튜브, 인스타, 트위터 등의 대용량 트래픽 처리에 대한 수요가 생기면서 그에 맞추어 HTTP 프로토콜도 진화를 거듭했습니다.
HTTP는 신뢰성있는 전송 프로토콜의 사용을 가정하고 만들어 졌기 때문에
HTTP를 전송하기 위해서 HTTP는 2.0버전까지 TCP를 사용하였습니다.
(TCP의 3way -handshake가 100% 데이터 신뢰성을 보장해주기 때문)
2022-06에 도입된 HTTP 3.0은 UDP 기반의 프로토콜(QUIC)을 사용합니다.
📘 HTTP 0.9 (1991년)
최초로 문서화된 버전인 0.9버전입니다.
초기엔 깔끔하고 쉬웠습니다. 1줄밖에 없는 프로토콜이었기 때문입니다.
GET /index.html
이때는 HTTP 매서드도 GET 말고는 없었습니다.
일단 서버에 연결되고 나면 프로토콜 종류, 서버ip, 포트와 같은 정보도 요구하지 않았기 때문에 요청에 URL과 HTTP 헤더를 포함한 그 어떠한 정보도 들어있지 않습니다.
따라서 이때는 우리가 인터넷으로 오로지 HTML페이지 말고는 전송할수 없었습니다.
현재는 HTTP 0.9방식의 전송을 대부분 지원하지 않습니다.
📘 HTTP 1.0 (1996년)
HTTP 헤더가 도입되었습니다.
헤더에는 메타데이터가 전송 될 수 있고 이전에 비해 유연해지고 확장가능하게 되었습니다.
요청
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
응답
200 OK
심플 페이지
Date: Mon, 29 Nov 1999 23:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
``````
1회 요청당 1회의 결과만 받을수 있었습니다.
따라서 서버에 요청되는 매순간 tcp의 3way handshake로 커넥션을 받으면 1회 요청 1회 응답 이후에 커넥션이 바로 끊어집니다.
📘 HTTP 1.1 (1997~9년)
성능 최적화 및 기능이 향상되었습니다.
파이프라이닝이 추가되었습니다.
파이프라인이 없다면 송신 > 수신 > 송신 > 수신 하며 동작했지만
파이프라인 덕분에 송신 > 송신 > 수신> 수신 또한 동작할 수 있게 되었습니다.
파이프라이닝을 통하여 우리는 앞으로 요청할 것이라고 알고있는 자료들에 대해 미리 보내줄수 있게 되었습니다.
keep-alive 옵션이 생겨 1.0과 다르게 커넥션을 재사용할 수 있게 되었습니다.
이는 데이터 송수신의 오버헤드를 많이 줄여주게 되었습니다.
요청
GET / HTTP/1.1
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
응답
HTTP/1.1 307 Internal Redirect
Location: https://rddcat.github.io/
Cross-Origin-Resource-Policy: Cross-Origin
Non-Authoritative-Reason: HSTS
(컨탠츠)
HTTP 1.1 버전은 다음 버전이 나오기까지 약 20년동안 매우 안정적으로 동작했습니다.
📘 HTTP 2.0 (2015년)
점유율이 44%밖에 안됨.. (2022.09.15 기준)
웹 페이지는 더욱 복잡해지고 한 화면을 표시하는데 필요한 데이터의 볼륨도 증가하였습니다.
대용량의 데이터가 HTTP 1.1을 통해 전송되었고 이후에 나온 HTTP 2.0의 목표는 전송성능을 개선하고 대기시간을 줄이고 처리량을 높이는 것입니다.
-
이전 버전과는 다르게 하나의 커넥션으로 데이터 스트림을 병렬로 연결할 수 있습니다. 이로인해 애플리케이션 계층의 HOL 문제를 해결하였지만 여전히 TCP 전송계층에서의 HOL 문제를 가지고 있습니다.
-
헤더파일의 중복을 압축합니다.
한 커넥션안에서 헤더파일이 유사한 경우가 많기 때문에 이러한 데이터의 중복 및 오버헤드를 제거합니다. -
서버에서 클라이언트의 파일을 업데이트 하도록 푸쉬할 수 있습니다.
-
텍스트가 아닌 바이너리(2진수)로 데이터를 송수신합니다.
📘 HTTP 3.0(2022.06)
HTTP3 는 구글이 개발한 UDP기반 QUIC 프로토콜을 사용합니다.
📘 구글 QUIC(Quick UDP Internet Connections)
UDP를 베이스로 만들어진 전송계층 프로트콜입니다.
구글에서 대용량 트래픽을 다루기 위해 개발되었습니다.
UDP의 장점인 빠른 데이터 전송을 유지한채로 단점인 신뢰성 문제를 해결한 프로토콜입니다.
최신의 사용자의 경향을 보면, 모바일 사용자가 여러 데이터송수신 방식을 번갈아 가며 사용합니다.
WIFI 에 연결되었다가 4G에 연결되었다가 3G로 LTE로 5G로 연결이 시도때도없이 바뀌는 환경속에서 엄청난 양의 데이터를 송수신하는데 유리합니다.
QUIC은 최초에 유저와 연결될때 연결정보를 저장하여 서버에 캐싱해두고 UDP 방식으로 클라이언트와 통신한다. 이때 연결한 커넥션을 병렬스트림이 공유합니다. 병렬 스트림은 서로 독립적으로 동작합니다. 그래서 이전 버전에서 HOL 이라고 알려진 Head Of Line 차단 문제를 해결합니다.