WWW (World Wide Web) 에서 데이터를 주고받는 데 사용되는 통신 규약
웹 브라우저가 웹 서버에 HTML문서, 이미지, 동영상 등 정보를 요청하고, 서버가 그 요청에 응답하여 콘텐츠를 전달
HTTP는 클라이언트가 서버에 원하는 동작을 알리기 위해 메서드를 사용
서버는 클라이언트 요청에 대한 결과를 세자리 숫자 코드로 클라이언트에 전달


HTTPS(Hypertext Transfer Protocol Secure) 은 HTTP에 보안기능 추가한 것
| 구분 | HTTP | HTTPS |
|---|---|---|
| 보안 | 암호화되지 않은 데이터를 전송 | SSL/TLS암호화 기술을 사용하여 데이터 보호 |
| 포트 | 80번 포트 | 443포트 |
속도는 암호화 과정이 없는 HTTP가 빠를 수 밖에
Frame이라는 최소 단위로 데이터를 주고 받음
한 프레임은 고정된 구성을 가지고 프레임 헤더와 데이터(payload)로 구성

프레임의 헤더 구조는 다음과 같다
+-----------------------------------------------+
| Length (24) |
+---------------+---------------+---------------+
| Type (8) | Flags (8) |
+-+-------------+---------------+-------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0...) ...
+---------------------------------------------------------------+
| Field | Length | Description |
|---|---|---|
| Length | 3 bytes | 페이로드의 길이 (프레임 헤더 미포함) |
| Type | 1 byte | 프레임의 타입 지정 (DATA, HEADERS, PRIORITY, SETTINGS 등) |
| Flags | 1 byte | 프레임 타입별 플래그 필드 END_STREAM(데이터의 끝), END_HEADERS(헤더의 끝) 등 |
| Reserved (R) | 1 bit | 예약 비트로, 항상 0으로 설정하고 무시 |
| Stream Identifier | 4 bytes (31bits 사용하고 상위 1bit 예약) | 스트림 ID (31 bits)로 해당 프레임이 어떤 HTTP/2 스트림에 속하는지 표시 |
각 Frame Type 별로 Payload 구조가 다른데 이는 RFC9113에 정리되어 있음

HTTP/1.1 에서 매 요청마다 헤더 전체를 반복 전송 하는 것에 비해
HTTP/2 는 HPACK 방식의 헤더 압축을 적용해서 중복되는 헤더 정보를 줄인다
HTTP/2 에서 헤더 필드의 중복을 제거하고 전송 효율성을 높이기 위해 사용되는 헤더 압축 알고리즘
각 요청마다 전체 헤더 필드를 전송하지 않고 2가지 테이블을 사용한다
HTTP/1.1 의 경우 클라이언트가 필요한 리소스를 직접 요청해야 했으나
HTTP/2 에서는 Server Push 기능으로 서버가 클라이언트가 요청하지 않은 리소스도 미리 전송하여 렌더링 속도를 단축한다
예를들어 서버가 HTML 문서를 보내면서 클라이언트가 곧 필요로 할 JS, CSS 파일을 미리 함께 보낼 수 있음
구글에서 개발한 UDP 기반의 QUIC (Quick UDP Internet Connections) 를 사용하여 통신하는 프로토콜

QUIC은 TCP, TLS, HTTP의 기능을 모두 구현한 프로토콜로
TCP 사용상 문제인 HOLB (Head-of-Line Blocking) 문제를 해결
UDP 사용하므로 443 포트 사용
TLS + TCP 에서는 TCP 연결 생성을 위한 hand-shanking 과정과 TLS를 사용한 암호화 통신까지 총 3 RTT가 필요하다.
QUIC 내에 TLS 인증서를 포함하므로서 최초 연결 설정 한번으로 필요한 인증 정보와 데이터를 함께 전송한다.

최초 연결시에 destination 서버의 Connection ID를 사용해서 생성한 Initial Key를 사용하여 통신을 암호화
한번 연결이 성공하면 그 설정을 캐싱해놓고 다음 연결 때 hand-shanking 없이 0-RTT로 통신을 시작할 수 있다
와이파이 환경에서 셀룰러로 네트워크가 바뀌어도 같은 QUIC Connection ID로 연결을 계속 유지할 수 있음
HTTP/2 의 경우 기존 HTTP/1.1 가 파이프라인으로 하나의 요청에 대해 매번 커넥션을 유지해야하는 점을 보완하여 멀티플렉싱을 통한 요청 처리 방식을 도입했다.
HTTP Application Layer에서의 HOLB는 해소됐지만, TCP 본질적으로 가지는 HOLB 문제가 여전히 존재한다.
HTTP/2 는 하나의 TCP 커넥션으로 데이터 병렬 전송이 가능하다. 다만 여러 프레임들이 섞여서 전송되는 중에 문제가 발생하면 이후에 상관없는 프레임들까지 지연이 발생한다.
QUIC 에서는 Application layer에서 여러개의 독립적인 스트림을 지원함
기본적으로 QUIC 내에 TLS가 포함됨

TLS 1.3 을 프로토콜 자체에 내장 -> 중간 네트워크 장비가 통신 내용을 들여다보거나 조작하는 것을 차단