[Network] HTTP ๋ฒ์ ๋ณ ํน์ง: HTTP v0.9 v1.0 v1.1 v2 v3
๐ก ๋ณธ ๋ฌธ์๋ 'HTTP ๋ฒ์ ๋ณ ํน์ง: HTTP v0.9 v1.0 v1.1 v2 v3'์ ๋ํด ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
HTTP๋ ์ฌ๋ฌ ๊ณผ์ ์ ๊ฑฐ์ณ ํ์ฌ์ ์น์ ํ์ค์ผ๋ก ์๋ฆฌ์ก๊ฒ ๋์๋๋ฐ, ํ๋จ์์๋ HTTP์ ์ญ์ฌ์ ํจ๊ป ๋ณ์ฒ๊ณผ์ ์ ๋ํด ์ดํด๋ณด๋ฉฐ HTTP์ ์ ์ฉ๋ ๊ธฐ์ ์ ๋ํด ์ ๋ฆฌํ์์ผ๋ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
1. HTTP ๋?
HTTP๋ Hyper Text Transfer Protocol์ ์ฝ์๋ก, ์๋นํ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ HTML ๋ฌธ์์ ๊ฐ์ ๋ฆฌ์์ค๋ค์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ํด์ฃผ๋ ํ๋กํ ์ฝ์ ๋๋ค. HTTP๋ ์น์์ ์ด๋ฃจ์ด์ง๋ ๋ชจ๋ ๋ฐ์ดํฐ ๊ตํ์ ๊ธฐ์ด์ด๋ฉฐ, ํด๋ผ์ด์ธํธ-์๋ฒ ํ๋กํ ์ฝ์ด๊ธฐ๋ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ-์๋ฒ ํ๋กํ ์ฝ์ด๋ (๋ณดํต ์น๋ธ๋ผ์ฐ์ ์ธ) ์์ ์ ์ธก์ ์ํด ์์ฒญ์ด ์ด๊ธฐํ๋๋ ํ๋กํ ์ฝ์ ์๋ฏธํฉ๋๋ค. ํ๋์ ์์ ํ ๋ฌธ์๋ ํ ์คํธ, ๋ ์ด์์ ์ค๋ช , ์ด๋ฏธ์ง, ๋น๋์ค, ์คํฌ๋ฆฝํธ ๋ฑ ๋ถ๋ฌ์จ(fetched) ํ์ ๋ฌธ์๋ค๋ก ์ฌ๊ตฌ์ฑ๋ฉ๋๋ค.
์ด๋ฌํ HTTP๋ ์ฌ๋ฌ ๊ณผ์ ์ ๊ฑฐ์ณ ํ์ฌ์ ์น์ ํ์ค์ผ๋ก ์๋ฆฌ์ก๊ฒ ๋์๋๋ฐ, ํ๋จ์์๋ HTTP์ ์ญ์ฌ์ ํจ๊ป ๋ณ์ฒ๊ณผ์ ์ ๋ํด ์ดํด๋ณด๋ฉฐ HTTP์ ์ ์ฉ๋ ๊ธฐ์ ์ ๋ํด ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
2. HTTP ๋ฒ์ ๋ณ ํน์ง
2.0 ํต์ ํ๋กํ ์ฝ์ ์ญ์ฌ
HTTP๋ฅผ ํฌํจํ ๋ค์ํ ํต์ ํ๋กํ ์ฝ์ ์ญ์ฌ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
- Socket API (1983, 4.2BSD Unix OS)
- HTTP/0.9 (1991)
- HTTP/1.0 (1996)
- HTTP/1.1 (1997, ํ์ค) : ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ์ค
- RFC2068 (1997) -> RFC2616 (1999) -> RFC7230~7235 (2014)
- ํ์ฌ ํ์ค ์คํ์ ๋ณด๋ ค๋ฉด RFC7230 ์ดํ๋ฅผ ๋ด์ผ ํจ
- ZMQ (2007, Opensource)
- WebRTC (2011, Opensource)
- HTTP/2 (2015, SPDY(ํ์ค)) : HTTP 1.1์ ์ฑ๋ฅ ๊ฐ์ ๋ฐ ํ์ฅ
- gRPC (2016, Opensource)
- HTTP/3 (2021, QUIC(ํ์ค))
HTTP 1.1 ์ด ๋ชจ๋ ๊ฒ์ ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ ์ ์๊ณ ๊ทธ ๋ค์์ 2.0 / 3.0์ ์์๋๋ฉด ์ข์ผ๋ฉฐ, ์ถํ ์ฌ์ฉ๋ HTTP 3.0๋ ์ธ์งํด๋์!
2.1 HTTP/0.9 (One-Line Protocol)
- ์์ฒญ์ ๋จ์ผ ๋ผ์ธ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๋ฆฌ์์ค์ ๋ํ method๋ GET๋ง ์กด์ฌ
- ์๋ต๋ ๊ทน๋๋ก ๋จ์ (ํ์ผ ๋ด์ฉ ์์ฒด๋ก๋ง ๊ตฌ์ฑ)
- HTTPํค๋๊ฐ ์์์ผ๋ฉฐ, HTML ํ์ผ๋ง ์ ์ก ๊ฐ๋ฅ
- ์ํ ํน์ ์ค๋ฅ ์ฝ๋๊ฐ ์์์
/* ์์ฒญ */
GET /mypage.html
/* ์๋ต */
<HTML>
A very simple HTML page
</HTML>
2.2 HTTP/1.0
HTTP/1.0 ํน์ง
- HTTP ํค๋ ๊ฐ๋ ์ ํตํด, ์์ฒญ / ์๋ต ๋ชจ๋ Meta data ์ ์ก์ ํ์ฉํ์ฌ ํ๋กํ ์ฝ์ ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๋๋ก ํจ
- ๋ฒ์ ์ ๋ณด์ ์์ฒญ method๊ฐ ํจ๊ป ์ ์ก๋๊ธฐ ์์
- Response ์์ ๋ถ๋ถ์ ์ํ ์ฝ๋ ๋ผ์ธ์ด ์ถ๊ฐ๋์ด ๋ธ๋ผ์ฐ์ ์์ฒญ์ ์ฑ๊ณต/์คํจ๋ฅผ ํ์
๊ฐ๋ฅ
- ํด๋น ๊ฒฐ๊ณผ์ ๋ํ ๋ก์ปฌ ์บ์ ๊ฐฑ์ ๋ฑ์ ์ฌ์ฉ ๊ฐ๋ฅ
- Content-Type ๋์ ์ผ๋ก HTML ์ด์ธ์ ๋ฌธ์ ์ ์ก ๊ธฐ๋ฅ์ด ๊ฐ๋ฅํด์ง
/* ์์ฒญ */
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
/* ์๋ต */
200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
A page with an image
<IMG SRC="/myimage.gif">
</HTML>
HTTP/1.0 ํ๊ณ
์ปค๋ฅ์ ํ๋๋น ์์ฒญ ํ๋์ ์๋ต ํ๋๋ง ์ฒ๋ฆฌ ๊ฐ๋ฅํ์ฌ, ๋งค์ฐ ๋นํจ์จ์ ์ด๋ฉฐ ์๋ฒ ๋ถํ๋ ๋ฌธ์
2.3 HTTP/1.1 (ํ์ค ํ๋กํ ์ฝ์ ๋ฑ์ฅ)
HTTP/1.1 ํน์ง
- ๋ชจํธํจ์ ๋ช ํํ๊ฒ ํ๊ณ ๋ง์ ๊ฐ์ ์ฌํญ์ ๋์ ํ HTTP์ ์ฒซ๋ฒ์งธ ํ์ค ๋ฒ์
- Persistent Connection
- ์ง์ ํ timemout(Keep-Alive) ๋์์ ์ปค๋ฅ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ํ์ฌ, ๊ธฐ์กด ์ฐ๊ฒฐ์ ๋ํด Handshaking ์๋ต
- Pipelining ์ถ๊ฐ
- ์ ์์ฒญ์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์์ฐจ์ ์ธ ์ฌ๋ฌ ์์ฒญ์ ์ฐ์์ ์ผ๋ก ๋ณด๋ด๊ณ ๊ทธ ์์์ ๋ง์ถฐ ์๋ต์ ๋ฐ๋ ๋ฐฉ์์ด ๋ฑ์ฅ
- ์์ฐจ์ ์ผ๋ก ํ๋์ฉ ์์ฒญ / ์๋ต์ด ์ฒ๋ฆฌ๋๋ ๊ธฐ์กด ๋ฐฉ์์ ๊ฐ์
- ํ๋์ ์ปค๋ฅ์ ์ ์ฌ๋ฌ๊ฐ์ ์์ฒญ์ด ๋ค์ด ์์ ๋ฟ, ๋์์ ์ฌ๋ฌ๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํด ์๋ต์ผ๋ก ๋ณด๋ด์ฃผ๋ ๊ฒ์ ์๋๋ค (multiplexing ๋์ง๋ ์์)
HTTP/1.1 ํ๊ณ: High Latency
- Head Of Line Blocking (HOL)
- ์์๋๋ก ์ฒ๋ฆฌ(์์ฒญ/์๋ต)ํ๋ TCP์ ํน์ฑ์ผ๋ก, ์ฒซ ๋ฒ์งธ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๊ธฐ๊น์ง ๋ค๋ฅธ ์์ฒญ๋ค์ด ๋ชจ๋ ๋๊ธฐํ๊ฒ ๋๋ ๋ฌธ์
- ๊ฒฐ๊ตญ ์ ์์ฒญ์ ์๋ต์ด ๋๋ฌด ์ค๋๊ฑธ๋ฆฌ๋ฉด, ๋ค ์์ฒญ์ Blocking ๋์ด๋ฒ๋ฆผ
- RTT (Round Trip Time)
- ํ๋์ Connection์ ํ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํน์ฑ ์, 3 way handshake ๋ฐ๋ณต ๋ฑ latency๊ฐ ์ฆ๊ฐํ๊ฒ ๋จ
- Fat message headers
- HTTP/1.1 ํค๋์๋ ๋ง์ Meta data๊ฐ ์์
- ๋งค ์์ฒญ ์ ๋ง๋ค ์ค๋ณต๋ Header ๊ฐ์ ์ ์กํ๊ฒ ๋๋ฉฐ (๋ณ๋์ domain sharding์ ํ์ง ์์์ ๊ฒฝ์ฐ), ๋ํ ํด๋น domain์ ์ค ์ ๋ cookie ์ ๋ณด๋ ๋งค ์์ฒญ ์ ๋ง๋ค ํค๋์ ํฌํจ๋์ด ์ ์กํจ
- domain sharding:
- ์ ์กํ๋ ค๋ ๊ฐ๋ณด๋ค ํค๋ ๊ฐ์ด ๋ ํฐ ๊ฒฝ์ฐ๋ ์์ฃผ ๋ฐ์ํจ
- ์ด ์ธ์๋ Limited priorities(์ฐ์ ์์ ์์), Client-driven Transmission(์ ๋ณด ์์ฒญ์ ํด์ผ๋ง ํต์ ๊ฐ๋ฅ)
/* ์์ฒญ */
GET /en-US/docs/Glossary/Simple_header HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header
/* ์๋ต */
200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 20 Jul 2016 10:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
Server: Apache
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
(content)
2.4 HTTP/2
๊ธฐ์กด HTTP 1.X ๋ฒ์ ์ ์ฑ๋ฅ ํฅ์์ ์ด์ ์ ๋ง์ถ ํ๋กํ ์ฝ๋ก ํ์ค(HTTP 1.1)์ ๋์ฒด๊ฐ ์๋ ํ์ฅ๋๋ ๊ฐ๋ ์ผ๋ก ๋ฑ์ฅํ์์ต๋๋ค. HTTP/2๋ฅผ ํ์คํํจ์ ์์ด ์ฐธ๊ณ ๊ท๊ฒฉ์ผ๋ก ๊ตฌ๊ธ์ SPDY(Proprietary Solution)์ ์ฌ์ฉํ์์ต๋๋ค.
2.4.1 Google SPDY (Proprietary Solution)
SDPY ๊ฐ์
- ์น ์ฝํ ์ธ ์ ์ก์ ์ํด ๊ตฌ๊ธ์ด ๊ฐ๋ฐํ ๋นํ์ค ๋คํธ์ํฌ ํ๋กํ ์ฝ
- ์น ํ์ด์ง ์ ์ก ์ง์ฐ๋ฅผ ์ค์ด๊ณ ์น ๋ณด์์ ๊ฐ์ ํ๋ ๋ชฉํ๋ก, ์์ถ, ๋ค์คํ, ์ฐ์ ์์ ์ค์ ๋ฑ์ ํตํ ์ ์ก ์ง์ฐ ๊ฐ์
- SSL/TLS๋ ์ํธํ ๋์ง ์์ ์ฐ๊ฒฐ์ ์ง์ํ์ง ์์
SDPY ์ฐํ
- 2009๋ ๊ตฌ๊ธ์ ๋ด๋ถ ํ๋ก์ ํธ๋ก ๊ณต๊ฐ
- 2010๋ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ ์คํ์์ค ์์ง์ ํ์ฌ
- 2011๋ ๊ตฌ๊ธ์ ๋ชจ๋ ์๋น์ค์ ๋์
- 2012๋ ์ํ์น ์๋ฒ์ฉ ๊ตฌ๊ธ SPDY ํจ์น ์ ๊ณต & Nginx์ ์ง์ ๊ณต๊ฐ 2012๋ IETF ๋จ์ฒด๋ฅผ ํตํ ํ์คํ ์ถ์ง
- 2015๋ HTTP/2๊ฐ RFC 7540 ํ์คํ ๋๋ฉด์, SPDY ์ค๋จ
2.4.2 HTTP/2 ํน์ง
HTTP ๋ฉ์์ง ์ ์ก ๋ฐฉ์์ ์ ํ
๊ธฐ์กด : ์ผ๋ฐ ํ ์คํธ ํ์
๊ฐ์ : ์ถ๊ฐ์ ์ธ Binary Encoding
- Binary Framing ๊ณ์ธต์ ์ถ๊ฐํด์ ๋ณด๋ด๋ ๋ฉ์์ง๋ฅผ ํ๋ ์(frame)์ด๋ผ๋ ๋จ์๋ก ๋ถํ ํ๋ฉฐ ์ถ๊ฐ์ ์ผ๋ก ๋ฐ์ด๋๋ฆฌ๋ก ์ธ์ฝ๋ฉ์ ํ๋ค
- ๋ฐ์ด๋๋ฆฌ ํ์ ์ฌ์ฉ์ผ๋ก ํ์ฑ์๋ ๋ฐ ์ ์ก ์๋๊ฐ ๋น ๋ฅด๊ณ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์์ง
Stream, Message & Frame
HTTP/2 basic terms
- ์คํธ๋ฆผ: ๊ตฌ์ฑ๋ ์ฐ๊ฒฐ ๋ด์์ ์ ๋ฌ๋๋ ๋ฐ์ดํธ์ ์๋ฐฉํฅ ํ๋ฆ์ด๋ฉฐ, ํ๋ ์ด์์ ๋ฉ์์ง๊ฐ ์ ๋ฌ๋ ์ ์์
- ๋ฉ์์ง: ๋ ผ๋ฆฌ์ ์์ฒญ ๋๋ ์๋ต ๋ฉ์์ง์ ๋งคํ๋๋ ํ๋ ์์ ์ ์ฒด ์ํ์ค์
- ํ๋ ์: HTTP/2์์ ํต์ ์ ์ต์ ๋จ์์ด๋ฉฐ ๊ฐ ์ต์ ๋จ์์๋ ํ๋์ ํ๋ ์ ํค๋๊ฐ ํฌํจ๋จ. ์ด ํ๋ ์ ํค๋๋ ์ต์ํ์ผ๋ก ํ๋ ์์ด ์ํ๋ ์คํธ๋ฆผ์ ์๋ณํจ
Relationship between basic terms
- ๋ชจ๋ ํต์ ์ ๋จ์ผ TCP ์ฐ๊ฒฐ์ ํตํด ์ํ๋๋ฉฐ, ์ ๋ฌ๋ ์ ์๋ ์๋ฐฉํฅ ์คํธ๋ฆผ์ ์๋ ์ ํ์ด ์์
- ๊ฐ ์คํธ๋ฆผ์๋ ์๋ฐฉํฅ ๋ฉ์์ง ์ ๋ฌ์ ์ฌ์ฉ๋๋ ๊ณ ์ ์๋ณ์์ ์ฐ์ ์์ ์ ๋ณด(์ ํ ์ฌํญ)๊ฐ ์์
- ๊ฐ ๋ฉ์์ง๋ ํ๋์ ๋ ผ๋ฆฌ์ HTTP ๋ฉ์์ง(์: ์์ฒญ ๋๋ ์๋ต)์ด๋ฉฐ ํ๋ ์ด์์ ํ๋ ์์ผ๋ก ๊ตฌ์ฑ๋จ
- ํ๋ ์์ ํต์ ์ ์ต์ ๋จ์์ด๋ฉฐ ํน์ ์ ํ์ ๋ฐ์ดํฐ(์: HTTP ํค๋, ๋ฉ์์ง ํ์ด๋ก๋ ๋ฑ)๋ฅผ ์ ๋ฌํจ. ๋ค๋ฅธ ์คํธ๋ฆผ๋ค์ ํ๋ ์์ interleavingํ ๋ค์, ๊ฐ ํ๋ ์์ ํค๋์ ์ฝ์ ๋ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ํตํด ์ด ํ๋ ์์ ๋ค์ ์กฐ๋ฆฝํ ์ ์์
Multiplexed Streams
๊ธฐ์กด: HTTP 1.1์ Pipelining ์ผ๋ก ํ๋์ ์ปค๋ฅ์ ์ ์ฌ๋ฌ ์์ฒญ์ด ์์ง๋ง, ๊ฒฐ๊ตญ ๋์์ ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํด ์๋ต์ผ๋ก ์ฃผ์ง๋ ๋ชปํ์์
๊ฐ์ : ๋ณ๋ ฌ ์์ฒญ(Request)์ด ์ด๋ฃจ์ด์ง๋ ๋ค์คํ ํ๋กํ ์ฝ(Multiplexed Streams).
- ๊ตฌ์ฑ๋ ์ฐ๊ฒฐ ๋ด์ ์ ๋ฌ๋๋ ๋ฐ์ดํธ์ ์๋ฐฉํฅ ํ๋ฆ์ ์๋ฏธํ๋ Stream์ผ๋ก ์์ฒญ / ์๋ต์ด ๊ตํ๋จ(ํ๋์ ์ปค๋ฅ์ ์์ ์ฌ๋ฌ๊ฐ์ Stream ์กด์ฌ ๊ฐ๋ฅ)
- ๋ฉ์์ง๊ฐ ์ด์งํ๋ ํ ์คํธ์ธ ํ๋ ์(frame)์ผ๋ก ๋๋์ด ์์ฒญ๋ง๋ค ๊ตฌ๋ถ๋๋ Stream์ ํตํด ์ ๋ฌ
- ์ฆ, ํ๋ ์(frame)์ด ๊ฐ ์์ฒญ์ ์คํธ๋ฆผ(stream)์ ํตํด ์ ๋ฌ๋๋ฉฐ, ํ๋์ ์ปค๋ฅ์
์์ ์ฌ๋ฌ๊ฐ์ ์คํธ๋ฆผ(stream)์ ๊ฐ์ง ์ ์๊ฒ๋์ด ๋์์ ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ค์คํ(multiplexing)๊ฐ ๊ฐ๋ฅํด์ง
- Stream์ ํตํด์ ๊ฐ ์์ฒญ์ ์๋ต์ ์์๊ฐ ์๋ฏธ๊ฐ ์์ด์ ธ์ HOL Blocking์ด ์์ฐ์ค๋ฝ๊ฒ ํด๊ฒฐ๋จ
Stream Prioritization
- ๋ฆฌ์์ค๊ฐ ์ฐ์ ์์๋ฅผ ์ค์ ํ๋ ๊ธฐ๋ฅ์ผ๋ก Stream์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํด์ ์ธํฐ๋ฆฌ๋น๋๊ณ ์ ๋ฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง
- ์ด๋ฅผ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด HTTP/2 ํ์ค์์๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๊ฐ ์คํธ๋ฆผ์ด ์ฐ๊ด๋ ๊ฐ์ค์น(1~256)์ ์ข ์์ฑ์ ๊ฐ๋๋ก ํ์ฉํจ
Flow Control
- ํ๋ฆ ์ ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ํน์ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ํ์ง ์์ผ๋, ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ตฌํํ์ฌ ๋ฆฌ์์ค ์ฌ์ฉ๊ณผ ํ ๋น์ ์ ์ดํ ์ ์์
- ์ข ๋จ๊ฐ ๋ฐฉ์(End-to-End)์ด ์๋ ํ ๋ฐฉ์(Hop-by-Hop)์ด๊ธฐ์, proxy์ ๊ฐ์ ์ค๊ฐ์์ ํ๋ฆ์ ์ด๋ ๊ฐ๋ฅํจ
Server Push
- ๋จ์ผ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฌ๋ฌ ์๋ต์ ๋ณด๋ผ ์ ์๋ ํน์ง์ ํตํด Server์์ client์๊ฒ ํ์ํ ์ถ๊ฐ์ ์ธ ๋ฆฌ์์ค๋ฅผ pushํด์ฃผ๋ ๊ธฐ๋ฅ
- ์์ฒญ์ ์ค๋ณต์ด ์๊ธฐ์ง ์๋๋ก, ๋ชจ๋ ์๋ฒ ํธ์ ์คํธ๋ฆผ์ HTTP ํค๋๋ฅผ ํฌํจํ PUSH_PROMISE ํ๋ ์์ ํตํด ์์๋จ
Header Compression
๊ธฐ์กด: ์ฐ์๋ ์์ฒญ์ ๊ฒฝ์ฐ ๋ง์ ์ค๋ณต๋ ํค๋์ ์ ์ก์ผ๋ก ์ค๋ฒํค๋๊ฐ ๋ง์ด๋ฐ์ํ์
๊ฐ์ : ์์ฒญ๊ณผ ์๋ต์ ํค๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ค๋ณต ์ ๊ฑฐ ๋ฐ ์์ถํด์ ์ค๋ฒํค๋๋ฅผ ๊ฐ์
- ์ ์ก๋๋ ํค๋ ํ๋๋ฅผ static/dynamic table๋ก ์๋ฒ์์ ์ ์ง
- Static table is defined in the specification and provides a list of common HTTP header fields that all connections are likely to use (e.g., valid header names)
- Dynamic table is initially empty and is updated based on exchanged values within a particular connection
- ์ด์ ์ ํ์๋ ํค๋๋ฅผ ์ ์ธํ ํ๋๋ฅผ ํํ๋ง(huffman) ์ธ์ฝ๋ฉ(HPAC ์์ถ)์ ์ํํด์ ๋ฐ์ดํฐ๋ฅผ ์์ถ
- ์ ํํ๋ ์ด์ ์ ํ์๋ฌ๋ ํค๋์ ๊ฒฝ์ฐ static table์ ์ ์ฅ๋์ด ์์ผ๋ฉฐ ํด๋น ์ธ๋ฑ์ค๋ฅผ ์ธ์ฝ๋ฉํ ๋ ๋ฃ์ด์ฃผ์ด ์์ถ
2.4.3 HTTP/2 ํ๊ณ
๊ฐ ์์ฒญ๋ง๋ค Stream์ผ๋ก ๊ตฌ๋ถํด์ ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌํ์ง๋ง, TCP ๊ณ ์ ์ HOL Blocking์ด ์กด์ฌํฉ๋๋ค. ์๋ก ๋ค๋ฅธ Stream์ด ์ ์ก๋๊ณ ์๋๋ผ๋ ํ๋์ Stream์์ ์ ์ค์ด ๋ฐ์๋๊ฑฐ๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๊ฒฐ๊ตญ ๋ค๋ฅธ Stream๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๋ ๊น์ง ์ง์ฐ๋๋ ํ์์ด ๋ฐ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฆ, ์ด๋ฌํ TCP์ ํ์์ ์ธ HOL Blocking์ ํด๊ฒฐํ๊ธฐ ์ํด UDP ๊ธฐ๋ฐ ํ๋กํ ์ฝ์ธ 'QUIC / HTTP3.0'์ด ๋ฑ์ฅ ํ์์ต๋๋ค.
2.5 HTTP/3: QUIC
HTTP 3
QUIC์ ๊ธฐ๋ฐ์ผ๋ก ๋์จ ์๋ก์ด HTTP ๋ฉ์ด์ ๋ฒ์ ์ผ๋ก HTTP ์๋ฉํฑ์ค๋ ์ด์ ๋ฒ์ ๋ค๊ณผ ๋์ผํฉ๋๋ค(Method, Msg Field, Status ... ). ๊ทธ๋ ๋ค๋ฉด QUIC์ด๋ ๋ญ๊น์?
QUIC(Quick UDP Internet Connections)?
QUIC์ TCP๋ฅผ ๋์ฒดํ๋ ๋ฒ์ฉ ๋ชฉ์ ์ ์ ์ก ๊ณ์ธต(Transport Layer) ํต์ ํ๋กํ ์ฝ๋ก์, ๊ตฌ๊ธ์ ์ง ๋ก์คํจ๋๊ฐ ์ฒ์ ์ค๊ณํ์์ต๋๋ค. ์ด๋ ๊ตญ์ ์ธํฐ๋ท ํ์คํ ๊ธฐ๊ตฌ์ ๊ธฐ์ ๋์๊ณ , 2021๋ 5์ IETF RFC9000(+RFC9001/9002/8989)์ผ๋ก ์ ์ ํ์คํ ๋์์ต๋๋ค. ๋ํ ์ด๋ฏธ ๊ตฌ๊ธ ํฌ๋กฌ์์๋ถํฐ ๊ตฌ๊ธ ์๋ฒ์ ์ด๋ฅด๋ ๋ชจ๋ ์ฐ๊ฒฐ์ ์ ๋ฐ ์ด์์ ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ, ํฌ๋กฌ/MS ์ฃ์ง/๋ชจ์ง๋ผ ํ์ด์ดํญ์ค/์ฌ ํ๋ฆฌ์์ ์ง์ํฉ๋๋ค.
QUIC์ UDP์ ๋์ผํ๊ฒ Transport Layer์์ ๊ตฌ๋๋์ง๋ง, UCP ์์ ์๋ก์ด ๊ณ์ธต์ ์ถ๊ฐํจ์ผ๋ก์จ ์ ๋ขฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ์ถ๊ฐ๋ ๊ณ์ธต์ TCP์ ์กด์ฌํ๋ ํจํท ์ฌ์ ์ก, ํผ์ก ์ ์ด, ์๋ ์กฐ์ ๋ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํฉ๋๋ค.
QUIC ํน์ง
UDP based NEW Transport Protocol
- Google์์ TCP์ ๊ตฌ์กฐ์ ๋ฌธ์ ์ธ HOLB๋ก ์ฑ๋ฅ ํฅ์์ด ์ด๋ ต๋ค๊ณ ํ๋จํ์ฌ UDP ๊ธฐ๋ฐ์ ์ ํ
- QUIC์ UDP์ ๋์ผํ๊ฒ Transport Layer์์ ๊ตฌ๋๋์ง๋ง, UCP ์์ ์๋ก์ด ๊ณ์ธต์ ์ถ๊ฐํจ์ผ๋ก์จ ์ ๋ขฐ์ฑ์ ์ ๊ณตํจ
- ์ถ๊ฐ๋ ๊ณ์ธต์ TCP์ ์กด์ฌํ๋ ํจํท ์ฌ์ ์ก, ํผ์ก ์ ์ด, ์๋ ์กฐ์ ๋ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํจ
Connection based Transport: ํ๋์ Stream chain์ผ๋ก ์ฐ๊ฒฐ๋๋ TCP์ ๋ฌ๋ฆฌ, ๊ฐ Stream ๋น ๋ ๋ฆฝ๋ Stream chain์ ๊ตฌ์ฑํ์ฌ TCP HOL Blocking์ ํด๊ฒฐ
- QUIC Connection
- QUIC์ ์ฐ๊ฒฐ ์ค์ ์ ๋ฒ์ ํ์, ์ํธํ, ์ ์ก ํธ๋์์ดํฌ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฏ๋ก ์ฐ๊ฒฐ ์ค์ ์ ์ง์ฐ์๊ฐ์ ์ค์ฌ์ค
- QUIC์ ์ฐ๊ฒฐ์ ํตํด ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ค๋ฉด ํ๋ ์ด์์ ์คํธ๋ฆผ์ ๋ง๋ค์ด์ ์ฌ์ฉํด์ผ ํจ
- QUIC Connection ID
- ๊ฐ ์ฐ๊ฒฐ์ ์ฐ๊ฒฐ ์๋ณ์๋ ์ฐ๊ฒฐ ID๋ฅผ ๊ฐ์ง๋ฏ๋ก ์ด๋ฅผ ํตํด ์ฐ๊ฒฐ์ ์๋ณํจ
- ์๋ํฌ์ธํธ๊ฐ ์์ ๋กญ๊ฒ ์ฐ๊ฒฐ ID๋ฅผ ์ ํํ๋ฉฐ, ๊ฐ ์๋ํฌ์ธํธ๋ ์๋ํฌ์ธํธ์ ํผ์ด๊ฐ ์ฌ์ฉํ ์ฐ๊ฒฐ ID๋ฅผ ์ ํํจ
- ์ฐ๊ฒฐ ID์ ์ฃผ์ ๊ธฐ๋ฅ์ ํ์ ํ๋กํ ์ฝ ๊ณ์ธต(UDP, IP ํน์ ๊ทธ ์ ๋ ๊ณ์ธต)์์ ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ QUIC ์ฐ๊ฒฐ์ ํจํท์ด ์๋ชป๋ ์๋ํฌ์ธํธ๋ก ์ ๋ฌ๋์ง ์๋๋ก ๋ณด์ฅํ๋ ๊ฒ์
- e.g. ์ฌ์ฉ์๊ฐ WiFi์์ ๋ค์ด๋ก๋ํ๋ค๊ฐ ๋๋ ค์ ์ ๋ฃฐ๋ฌ ๋คํธ์ํฌ๋ก ๋ณ๊ฒฝํ๋๋ผ๋ ๊ณ์ ๋ค์ด๋ก๋๋ฅผ ์งํ๊ฐ๋ฅ
Stream based Transport
- ํ๋์ ์ฐ๊ฒฐ๋ก ๋ค์์ ๋ณ๋ ฌ ์คํธ๋ฆผ์ ์ ์กํ๋ฉฐ, ์คํธ๋ฆผ ๊ฐ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ ์กํจ
- ์คํธ๋ฆผ์ 62๋นํธ ์ ์์ ์คํธ๋ฆผ ID ์๋ณ์๋ก ๊ตฌ๋ถํจ
- ์คํธ๋ฆผ์ ์์๋๋ก ์ ๋ฌ๋๊ณ ์ ๋ขฐํ ์ ์์ง๋ง ์๋ก ๋ค๋ฅธ ์คํธ๋ฆผ์ ์์ ์์ด ์ ๋ฌ๋ ์ ์์
- QUIC์ ์ฐ๊ฒฐ๊ณผ ์คํธ๋ฆผ ๋ชจ๋์์ ํ๋ฆ ์ ์ด๋ฅผ ์ ๊ณตํจ
- QUIC์ ์ฌ์ฉํ๋ ์์ ๊ณ์ธต์ ํตํด์ ์คํธ๋ฆผ์ ๋ํ ์ฐ์ ์์๋ฅผ ์์ฒญ๋ฐ์, ์ด๋ฅผ ํ ๋๋ก ์ ๋ณด ๊ตํ์ ํ ์ ์์
Secure Communication
- QUIC์ ์ผ๋ฐ ํ ์คํธ ๋ฒ์ ์ด ์๊ณ , QUIC ์ฐ๊ฒฐ๊ณผ ํ์ํ๋ ค๋ฉด TLS 1.3์ ์ฌ์ฉํด์ ์ํธํ ๋ฐ ๋ณด์์ ์ํํด์ผ ํจ
- ์ด์ ๋ฒ์ ์ TLS์ ๋น๊ตํด์ TLS 1.3์ ๋ช๋ช ์ฅ์ ์ด ์์ง๋ง QUIC์ด TLS 1.3์ ์ฌ์ฉํ ์ฃผ๋ ์ด์ ๋ ํธ๋์์ดํฌ์ ๋ ์ ์ ๋ผ์ด๋ ํธ๋ฆฝ์ด ํ์ํ๋๋ก ๋ฐ๋์๊ธฐ ๋๋ฌธ์ผ๋ก, ํ๋กํ ์ฝ ์ง์ฐ์ ์ค์ฌ์ค
- TLS๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ฏ๋ก, ์น ์ฌ์ฉ์๊ฐ ๊ธฐ๋ํ๊ณ ์ํ๋ HTTPS์ ๋ชจ๋ ๋ณด์ ์์ฑ์ ์ง์ํจ
Reduced {Signaling} Latency
QUIC๋ 0-RTT, 1-RTT ํธ๋์์ดํฌ๋ฅผ ์ ๊ณตํ๋๋ฐ ์ด๋ ์๋ก์ด ์ฐ๊ฒฐ์ ํ์ํ๊ณ ์ค์ ํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ค์ฌ์ค๋๋ค.
- ์ฐธ๊ณ ๋ก RTT๋ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ ๋งํ๋ฉฐ 1-RTT๋ ํ๋ฒ ์ฃผ๊ณ ๋ฐ์์ ์๋ฏธํจ
- ์ฌ๊ธฐ์ TCP๋ 3-way handshake ์ผ๋ก RTT๋ก ํํํ๋ฉด 1.5-RTT(?)๋ผ๊ณ ํํํ ์ ์์
QUIC์ ์ถ๊ฐ๋ก ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋ "early data"๋ฅผ ์ฒ์๋ถํฐ ์ง์ํ์ฌ, ํธ๋์์ดํฌ ๊ณผ์ ์์ TLS ์ฐ๊ฒฐ์ค์ ๋ฐ ํด์ ๋ ๋์์ ์ฒ๋ฆฌํฉ๋๋ค.
๋ํ ๊ธฐ์กด์ ์กด์ฌํ๋ ์ฐ๊ฒฐ์ด ๋๋๊ธฐ๋ฅผ ๋จผ์ ๊ธฐ๋ค๋ฆด ํ์ ์์ด ๊ฐ์ ํธ์คํธ๋ก์ ๋ ๋ค๋ฅธ ๋ ผ๋ฆฌ ์ฐ๊ฒฐ๋ ๋์์ ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค.
- ์๋ก์ด ์ฐ๊ฒฐ์ ์ค์ ํ๋๋ฐ ํ์ํ ์๊ฐ์ ์ค์ด๋ ค๊ณ ์ด์ ์ ์๋ฒ์ ์ฐ๊ฒฐํ๋ ํด๋ผ์ด์ธํธ๋ ํด๋น ์ฐ๊ฒฐ์ ํน์ ํ๋ผ๋ฏธํฐ ๋ฅผ ์บ์ํ ๋ค ์ด์ด์ ์๋ฒ์ 0-RTT ์ฐ๊ฒฐ์ ์ค์ ํ ์ ์์
- ์ด๋ก ์ธํด์ ํด๋ผ์ด์ธํธ๋ ํธ๋์์ดํฌ๊ฐ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์ (0-RTT)
์ฐธ๊ณ
- [๋ชจ์ง๋ผ]: https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
- [Blog] HTTP (1) - version ๋ณ ํน์ง (0.9 / 1.0 / 2.0 / 3.0): https://velog.io/@neity16/HTTP-HTTP-%EB%B2%84%EC%A0%84-%EB%B3%84-%ED%8A%B9%EC%A7%95