diff --git a/Http/Https.md b/Http/Https.md new file mode 100644 index 0000000..0f9bfa9 --- /dev/null +++ b/Http/Https.md @@ -0,0 +1,446 @@ +# ๐ŸŒ HTTP / HTTPS ์™„์ „ ์ •๋ณต ์Šคํ„ฐ๋”” ์ž๋ฃŒ + +> ์ทจ์—… ๋ฉด์ ‘ ๋Œ€๋น„ | ๊ธฐ์ดˆ โ†’ ์ค‘๊ธ‰ โ†’ ์‹ฌํ™” ์ˆœ์„œ๋กœ ๊ตฌ์„ฑ + +--- + +## ๐Ÿ“‹ ๋ชฉ์ฐจ + +1. [HTTP ๊ตฌ์กฐ โ€” ๋ฉ”์„œ๋“œ, ์ƒํƒœ์ฝ”๋“œ, ํ—ค๋”](#1-http-๊ตฌ์กฐ) +2. [HTTP 1.1 โ†’ 2 โ†’ 3 ์ง„ํ™” ์ด์œ ](#2-http-๋ฒ„์ „-์ง„ํ™”) +3. [HTTPS์™€ TLS Handshake ์ „์ฒด ํ๋ฆ„](#3-https์™€-tls-handshake) +4. [๋ฉด์ ‘ ๋‹จ๊ณจ ์งˆ๋ฌธ & ๋ชจ๋ฒ” ๋‹ต๋ณ€](#4-๋ฉด์ ‘-์งˆ๋ฌธ) + +--- + +## 1. HTTP ๊ตฌ์กฐ + +### 1-1. HTTP๋ž€? + +**HTTP (HyperText Transfer Protocol)**๋Š” ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์™€ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต ํ”„๋กœํ† ์ฝœ**์ด๋‹ค. + +- ๊ธฐ๋ฐ˜ ์ „์†ก ํ”„๋กœํ† ์ฝœ: **TCP** (HTTP/3์€ QUIC ์‚ฌ์šฉ) +- ๊ธฐ๋ณธ ํฌํŠธ: **80๋ฒˆ** (HTTPS๋Š” 443๋ฒˆ) +- ํ•ต์‹ฌ ํŠน์„ฑ: **Stateless (๋ฌด์ƒํƒœ)** โ€” ์š”์ฒญ ๊ฐ„์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์Œ + +> ๐Ÿ’ก Stateless๋ž€? +> ์„œ๋ฒ„๋Š” ์ด์ „ ์š”์ฒญ์„ ๊ธฐ์–ตํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋งค ์š”์ฒญ์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. +> โ†’ ์ด ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ํ‚ค/์„ธ์…˜/JWT๊ฐ€ ๋“ฑ์žฅํ•จ + +--- + +### 1-2. HTTP ๋ฉ”์„œ๋“œ (Method) + +HTTP ์š”์ฒญ ์‹œ **์–ด๋–ค ํ–‰๋™์„ ์›ํ•˜๋Š”์ง€** ๋ช…์‹œํ•˜๋Š” ๋™์‚ฌ. + +| ๋ฉ”์„œ๋“œ | ์šฉ๋„ | ๋ฉฑ๋“ฑ์„ฑ | ์•ˆ์ „์„ฑ | +|--------|------|--------|--------| +| `GET` | ๋ฆฌ์†Œ์Šค ์กฐํšŒ | โœ… | โœ… | +| `POST` | ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ | โŒ | โŒ | +| `PUT` | ๋ฆฌ์†Œ์Šค ์ „์ฒด ์ˆ˜์ • | โœ… | โŒ | +| `PATCH` | ๋ฆฌ์†Œ์Šค ์ผ๋ถ€ ์ˆ˜์ • | โŒ | โŒ | +| `DELETE` | ๋ฆฌ์†Œ์Šค ์‚ญ์ œ | โœ… | โŒ | +| `HEAD` | GET๊ณผ ๋™์ผํ•˜๋‚˜ body ์—†์Œ | โœ… | โœ… | +| `OPTIONS` | ์„œ๋ฒ„๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ ํ™•์ธ | โœ… | โœ… | + +> ๐Ÿ’ก **๋ฉฑ๋“ฑ์„ฑ(Idempotent)**: ๊ฐ™์€ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์Œ +> ๐Ÿ’ก **์•ˆ์ „์„ฑ(Safe)**: ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ +> โ†’ ๋ฉด์ ‘์—์„œ "PUT vs PATCH ์ฐจ์ด"๋Š” ๋‹จ๊ณจ ์งˆ๋ฌธ! + +--- + +### 1-3. HTTP ์ƒํƒœ์ฝ”๋“œ (Status Code) + +์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ **3์ž๋ฆฌ ์ˆซ์ž**๋กœ ๋‚˜ํƒ€๋ƒ„. + +#### 1xx โ€” ์ •๋ณด +| ์ฝ”๋“œ | ์˜๋ฏธ | +|------|------| +| `100 Continue` | ์š”์ฒญ ๊ณ„์† ์ง„ํ–‰ํ•ด๋„ ๋จ | + +#### 2xx โ€” ์„ฑ๊ณต +| ์ฝ”๋“œ | ์˜๋ฏธ | +|------|------| +| `200 OK` | ์š”์ฒญ ์„ฑ๊ณต | +| `201 Created` | ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์„ฑ๊ณต | +| `204 No Content` | ์„ฑ๊ณต, ๋ฐ˜ํ™˜ํ•  ๋ณธ๋ฌธ ์—†์Œ | + +#### 3xx โ€” ๋ฆฌ๋‹ค์ด๋ ‰์…˜ +| ์ฝ”๋“œ | ์˜๋ฏธ | +|------|------| +| `301 Moved Permanently` | ์˜๊ตฌ ์ด๋™ (URL ๋ณ€๊ฒฝ๋จ) | +| `302 Found` | ์ž„์‹œ ์ด๋™ | +| `304 Not Modified` | ์บ์‹œ๋œ ๋ฆฌ์†Œ์Šค ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ | + +#### 4xx โ€” ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜ +| ์ฝ”๋“œ | ์˜๋ฏธ | +|------|------| +| `400 Bad Request` | ์ž˜๋ชป๋œ ์š”์ฒญ ๋ฌธ๋ฒ• | +| `401 Unauthorized` | ์ธ์ฆ ํ•„์š” | +| `403 Forbidden` | ๊ถŒํ•œ ์—†์Œ (์ธ์ฆ์€ ๋์ง€๋งŒ ์ธ๊ฐ€ X) | +| `404 Not Found` | ๋ฆฌ์†Œ์Šค ์—†์Œ | +| `429 Too Many Requests` | ์š”์ฒญ ํšŸ์ˆ˜ ์ดˆ๊ณผ | + +#### 5xx โ€” ์„œ๋ฒ„ ์˜ค๋ฅ˜ +| ์ฝ”๋“œ | ์˜๋ฏธ | +|------|------| +| `500 Internal Server Error` | ์„œ๋ฒ„ ๋‚ด๋ถ€ ์˜ค๋ฅ˜ | +| `502 Bad Gateway` | ๊ฒŒ์ดํŠธ์›จ์ด/ํ”„๋ก์‹œ ์˜ค๋ฅ˜ | +| `503 Service Unavailable` | ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜ ๋˜๋Š” ์ ๊ฒ€ ์ค‘ | + +> ๐Ÿ’ก **401 vs 403 ์ž์ฃผ ํ—ท๊ฐˆ๋ฆผ** +> - 401: ๋กœ๊ทธ์ธ ์ž์ฒด๋ฅผ ์•ˆ ํ•œ ์ƒํƒœ (์ธ์ฆ ์‹คํŒจ) +> - 403: ๋กœ๊ทธ์ธ์€ ํ–ˆ์ง€๋งŒ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†๋Š” ์ƒํƒœ (์ธ๊ฐ€ ์‹คํŒจ) + +--- + +### 1-4. HTTP ํ—ค๋” (Header) + +์š”์ฒญ/์‘๋‹ต์— **์ถ”๊ฐ€์ ์ธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ**๋ฅผ ๋‹ด๋Š” ์˜์—ญ. `Key: Value` ํ˜•ํƒœ. + +#### ์š”์ฒญ(Request) ํ—ค๋” ์ฃผ์š” ํ•ญ๋ชฉ +``` +GET /index.html HTTP/1.1 +Host: www.example.com +Accept: text/html +Accept-Encoding: gzip, deflate +Authorization: Bearer +User-Agent: Mozilla/5.0 ... +Content-Type: application/json +``` + +| ํ—ค๋” | ์„ค๋ช… | +|------|------| +| `Host` | ์š”์ฒญ ๋Œ€์ƒ ์„œ๋ฒ„ ๋„๋ฉ”์ธ | +| `Accept` | ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฏธ๋””์–ด ํƒ€์ž… | +| `Authorization` | ์ธ์ฆ ํ† ํฐ (Bearer, Basic ๋“ฑ) | +| `Content-Type` | ์š”์ฒญ ๋ณธ๋ฌธ์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹ | +| `Cookie` | ์ €์žฅ๋œ ์ฟ ํ‚ค ์ „์†ก | + +#### ์‘๋‹ต(Response) ํ—ค๋” ์ฃผ์š” ํ•ญ๋ชฉ +``` +HTTP/1.1 200 OK +Content-Type: text/html; charset=UTF-8 +Content-Length: 3423 +Set-Cookie: sessionId=abc123; HttpOnly +Cache-Control: max-age=3600 +``` + +| ํ—ค๋” | ์„ค๋ช… | +|------|------| +| `Content-Type` | ์‘๋‹ต ๋ณธ๋ฌธ์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹ | +| `Set-Cookie` | ๋ธŒ๋ผ์šฐ์ €์— ์ฟ ํ‚ค ์ €์žฅ ์ง€์‹œ | +| `Cache-Control` | ์บ์‹œ ์ •์ฑ… ์ง€์ • | +| `Location` | ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๋Œ€์ƒ URL | + +--- + +## 2. HTTP ๋ฒ„์ „ ์ง„ํ™” + +### 2-1. HTTP/1.0 โ€” ์—ฐ๊ฒฐ์˜ ๋น„ํšจ์œจ + +- ์š”์ฒญ๋งˆ๋‹ค **TCP ์—ฐ๊ฒฐ์„ ์ƒˆ๋กœ ๋งบ๊ณ  ๋Š์Œ** +- 1 ์š”์ฒญ = 1 TCP ์—ฐ๊ฒฐ โ†’ ์˜ค๋ฒ„ํ—ค๋“œ ์—„์ฒญ๋‚จ +- ์ด๋ฏธ์ง€ 10๊ฐœ ์žˆ์œผ๋ฉด TCP Handshake๋ฅผ 10๋ฒˆ ๋ฐ˜๋ณต + +``` +[ํด๋ผ์ด์–ธํŠธ] [์„œ๋ฒ„] + |--- TCP ์—ฐ๊ฒฐ ----->| + |--- GET /img1 ---->| + |<-- ์‘๋‹ต ----------| + |--- TCP ์ข…๋ฃŒ ----->| + |--- TCP ์—ฐ๊ฒฐ ----->| โ† ๋‹ค์‹œ ์—ฐ๊ฒฐ! + |--- GET /img2 ---->| + ... +``` + +--- + +### 2-2. HTTP/1.1 โ€” Keep-Alive์™€ ํŒŒ์ดํ”„๋ผ์ด๋‹ + +#### Keep-Alive (์ง€์† ์—ฐ๊ฒฐ) +- TCP ์—ฐ๊ฒฐ์„ **์žฌ์‚ฌ์šฉ** โ†’ ์—ฐ๊ฒฐ ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ์†Œ +- `Connection: keep-alive` ํ—ค๋”๋กœ ํ™œ์„ฑํ™” (HTTP/1.1 ๊ธฐ๋ณธ๊ฐ’) + +``` +[ํด๋ผ์ด์–ธํŠธ] [์„œ๋ฒ„] + |--- TCP ์—ฐ๊ฒฐ ----->| + |--- GET /img1 ---->| + |<-- ์‘๋‹ต ----------| + |--- GET /img2 ---->| โ† TCP ์žฌ์‚ฌ์šฉ! + |<-- ์‘๋‹ต ----------| + |--- TCP ์ข…๋ฃŒ ----->| +``` + +#### ํŒŒ์ดํ”„๋ผ์ด๋‹ (Pipelining) +- ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  **์š”์ฒญ์„ ์—ฐ์†์œผ๋กœ ์ „์†ก** +- ์ด๋ก ์ƒ ๋น ๋ฅด์ง€๋งŒ **HOL Blocking** ๋ฌธ์ œ ๋ฐœ์ƒ + +#### HOL Blocking (Head-of-Line Blocking) +``` +์š”์ฒญ: [A] [B] [C] +์‘๋‹ต: A๊ฐ€ ๋А๋ฆฌ๋ฉด... [A ๋Œ€๊ธฐ์ค‘] [B ๋Œ€๊ธฐ] [C ๋Œ€๊ธฐ] + โ†’ B, C๊ฐ€ ๋จผ์ € ์ค€๋น„๋ผ๋„ A๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•จ! +``` + +> ๐Ÿ’ก **HOL Blocking** = ์•ž์„  ์š”์ฒญ์ด ๋ง‰ํžˆ๋ฉด ๋’ค ์š”์ฒญ๋„ ์ „๋ถ€ ๋ง‰ํžˆ๋Š” ํ˜„์ƒ +> HTTP/1.1์˜ ๊ฐ€์žฅ ํฐ ํ•œ๊ณ„ โ†’ HTTP/2์—์„œ ํ•ด๊ฒฐํ•˜๋ ค ํ•จ + +--- + +### 2-3. HTTP/2 โ€” ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ + +#### ํ•ต์‹ฌ ๊ฐœ๋…: ์ŠคํŠธ๋ฆผ(Stream) & ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ + +- ํ•˜๋‚˜์˜ TCP ์—ฐ๊ฒฐ ์œ„์— **์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆผ์„ ๋™์‹œ์—** ์šด๋ฐ˜ +- ์š”์ฒญ/์‘๋‹ต์ด **ํ”„๋ ˆ์ž„(Frame)** ๋‹จ์œ„๋กœ ๋ถ„ํ• ๋˜์–ด ์ „์†ก +- ์ˆœ์„œ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋„์ฐฉ โ†’ HOL Blocking ํ•ด๊ฒฐ (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ) + +``` +HTTP/1.1: [์š”์ฒญA] โ†’ [์‘๋‹ตA] โ†’ [์š”์ฒญB] โ†’ [์‘๋‹ตB] (์ˆœ์ฐจ์ ) + +HTTP/2: Stream 1: [A ํ”„๋ ˆ์ž„] [A ํ”„๋ ˆ์ž„] [A ํ”„๋ ˆ์ž„] + Stream 2: [B ํ”„๋ ˆ์ž„] [B ํ”„๋ ˆ์ž„] + Stream 3: [C ํ”„๋ ˆ์ž„] + โ†’ ํ•˜๋‚˜์˜ TCP์—์„œ ๋™์‹œ์—! +``` + +#### HTTP/2 ์ฃผ์š” ๊ธฐ๋Šฅ + +| ๊ธฐ๋Šฅ | ์„ค๋ช… | +|------|------| +| **๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ** | ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋กœ ์—ฌ๋Ÿฌ ์š”์ฒญ/์‘๋‹ต ๋™์‹œ ์ฒ˜๋ฆฌ | +| **ํ—ค๋” ์••์ถ• (HPACK)** | ์ค‘๋ณต ํ—ค๋”๋ฅผ ์••์ถ•ํ•ด์„œ ์ „์†ก | +| **์„œ๋ฒ„ ํ‘ธ์‹œ** | ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ „์— ์„œ๋ฒ„๊ฐ€ ๋จผ์ € ๋ฆฌ์†Œ์Šค ์ „์†ก | +| **๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋ ˆ์ด๋ฐ** | ํ…์ŠคํŠธ โ†’ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ํŒŒ์‹ฑ ํšจ์œจ ํ–ฅ์ƒ | + +#### ํ•œ๊ณ„: TCP ๋ ˆ๋ฒจ HOL Blocking +- TCP๋Š” **ํŒจํ‚ท ์†์‹ค ์‹œ ์žฌ์ „์†ก์„ ๊ธฐ๋‹ค๋ฆผ** +- ํ•˜๋‚˜์˜ ํŒจํ‚ท์ด ์†์‹ค๋˜๋ฉด ๊ทธ ์—ฐ๊ฒฐ์˜ **๋ชจ๋“  ์ŠคํŠธ๋ฆผ์ด ๋Œ€๊ธฐ** +- โ†’ HTTP/3์—์„œ ๊ทผ๋ณธ์  ํ•ด๊ฒฐ ์‹œ๋„ + +--- + +### 2-4. HTTP/3 โ€” QUIC ๊ธฐ๋ฐ˜ + +#### QUIC์ด๋ž€? +- Google์ด ๊ฐœ๋ฐœํ•œ **UDP ๊ธฐ๋ฐ˜** ์ „์†ก ํ”„๋กœํ† ์ฝœ +- TCP์˜ ์‹ ๋ขฐ์„ฑ์„ **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ**์—์„œ ๊ตฌํ˜„ +- TLS 1.3์ด **๊ธฐ๋ณธ ๋‚ด์žฅ** โ†’ ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ์ด ๋” ๋น ๋ฆ„ + +#### TCP vs QUIC ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ ๋น„๊ต +``` +TCP + TLS 1.2: + 1. TCP SYN + 2. TCP SYN-ACK + 3. TCP ACK + 4. TLS ClientHello + 5. TLS ServerHello + 6. TLS ํ‚ค ๊ตํ™˜ ... + โ†’ ์ตœ์†Œ 2~3 RTT ํ•„์š” + +QUIC: + 1. Initial Packet (์—ฐ๊ฒฐ + ์•”ํ˜ธํ™” ๋™์‹œ) + โ†’ ์ตœ์ดˆ: 1 RTT / ์žฌ์—ฐ๊ฒฐ: 0 RTT ๊ฐ€๋Šฅ! +``` + +#### HTTP/3 ์žฅ์  ์š”์•ฝ +| ํ•ญ๋ชฉ | HTTP/2 (TCP) | HTTP/3 (QUIC) | +|------|-------------|--------------| +| ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ | TCP | UDP + QUIC | +| HOL Blocking | TCP ๋ ˆ๋ฒจ์—์„œ ๋ฐœ์ƒ | ์ŠคํŠธ๋ฆผ๋ณ„ ๋…๋ฆฝ โ†’ ํ•ด๊ฒฐ | +| ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ | 2-3 RTT | 0-1 RTT | +| ์ด๋™์„ฑ (๋ชจ๋ฐ”์ผ) | IP ๋ฐ”๋€Œ๋ฉด ์žฌ์—ฐ๊ฒฐ | Connection ID๋กœ ์œ ์ง€ | + +> ๐Ÿ’ก **์™œ UDP๋ฅผ ์“ฐ๋Š”๋ฐ ์‹ ๋ขฐ์„ฑ์ด ์žˆ๋‚˜?** +> QUIC์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ์žฌ์ „์†ก, ์ˆœ์„œ ๋ณด์žฅ ๋“ฑ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ. +> TCP๊ฐ€ OS ์ปค๋„์—์„œ ํ•˜๋˜ ์ผ์„ QUIC์ด ์•ฑ ๋ ˆ์ด์–ด์—์„œ ํ•จ. + +--- + +## 3. HTTPS์™€ TLS Handshake + +### 3-1. HTTPS๋ž€? + +**HTTPS = HTTP + TLS (Transport Layer Security)** + +- HTTP ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†ก ์ „์— **์•”ํ˜ธํ™”** +- ๊ธฐ๋ณธ ํฌํŠธ: **443** +- ์ œ๊ณตํ•˜๋Š” ๋ณด์•ˆ: + - **๊ธฐ๋ฐ€์„ฑ**: ๋‚ด์šฉ์„ ์ œ3์ž๊ฐ€ ์ฝ์„ ์ˆ˜ ์—†์Œ + - **๋ฌด๊ฒฐ์„ฑ**: ์ „์†ก ์ค‘ ๋‚ด์šฉ์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์Œ + - **์ธ์ฆ**: ๋‚ด๊ฐ€ ์ ‘์†ํ•œ ์„œ๋ฒ„๊ฐ€ ์ง„์งœ์ธ์ง€ ํ™•์ธ + +--- + +### 3-2. ๋Œ€์นญํ‚ค vs ๋น„๋Œ€์นญํ‚ค + +| ๊ตฌ๋ถ„ | ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” | ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” | +|------|-------------|---------------| +| ํ‚ค ๊ฐœ์ˆ˜ | 1๊ฐœ (๊ฐ™์€ ํ‚ค๋กœ ์•”/๋ณตํ˜ธํ™”) | 2๊ฐœ (๊ณต๊ฐœํ‚ค + ๊ฐœ์ธํ‚ค) | +| ์†๋„ | ๋น ๋ฆ„ | ๋А๋ฆผ | +| ๋ฌธ์ œ์  | ํ‚ค ์ „๋‹ฌ ๊ณผ์ •์ด ์ทจ์•ฝ | ๋А๋ฆฐ ์†๋„ | +| ๋Œ€ํ‘œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ | AES | RSA, ECC | +| TLS์—์„œ ์—ญํ•  | ์‹ค์ œ ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” | ๋Œ€์นญํ‚ค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ตํ™˜ | + +> ๐Ÿ’ก **TLS๋Š” ๋‘ ๋ฐฉ์‹์„ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉ** +> ๋น„๋Œ€์นญํ‚ค๋กœ ๋Œ€์นญํ‚ค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ตํ™˜ โ†’ ์ดํ›„ ๋Œ€์นญํ‚ค๋กœ ๋น ๋ฅด๊ฒŒ ํ†ต์‹  + +--- + +### 3-3. TLS Handshake ์ „์ฒด ํ๋ฆ„ (TLS 1.2 ๊ธฐ์ค€) + +``` +ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ + | | + |------- ClientHello --------------->| + | (TLS ๋ฒ„์ „, ์ง€์› ์•”ํ˜ธํ™” ๋ชฉ๋ก, | + | ๋žœ๋ค๊ฐ’ A) | + | | + |<------ ServerHello ----------------| + | (์„ ํƒ๋œ ์•”ํ˜ธํ™” ๋ฐฉ์‹, ๋žœ๋ค๊ฐ’ B) | + | | + |<------ Certificate ----------------| + | (์„œ๋ฒ„์˜ ๊ณต๊ฐœํ‚ค ํฌํ•จ ์ธ์ฆ์„œ) | + | | + |<------ ServerHelloDone ------------| + | | + | [ํด๋ผ์ด์–ธํŠธ: ์ธ์ฆ์„œ ๊ฒ€์ฆ] | + | [Pre-Master Secret ์ƒ์„ฑ] | + | | + |------- ClientKeyExchange --------->| + | (Pre-Master Secret, ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”) | + | | + | [์–‘์ชฝ์—์„œ Master Secret ์ƒ์„ฑ] | + | [์„ธ์…˜ ํ‚ค(๋Œ€์นญํ‚ค) ๋„์ถœ] | + | | + |------- ChangeCipherSpec ---------->| + |------- Finished ------------------>| + | | + |<------ ChangeCipherSpec -----------| + |<------ Finished -------------------| + | | + |====== ์•”ํ˜ธํ™”๋œ HTTP ํ†ต์‹  ์‹œ์ž‘ ========| +``` + +#### ๊ฐ ๋‹จ๊ณ„ ์„ค๋ช… + +**โ‘  ClientHello** +- ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง€์›ํ•˜๋Š” TLS ๋ฒ„์ „, ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ชฉ๋ก(Cipher Suite) ์ „์†ก +- ๋žœ๋ค๊ฐ’ A (Client Random) ํฌํ•จ + +**โ‘ก ServerHello** +- ์„œ๋ฒ„๊ฐ€ ์•”ํ˜ธํ™” ๋ฐฉ์‹ ์„ ํƒ ํ›„ ์‘๋‹ต +- ๋žœ๋ค๊ฐ’ B (Server Random) ํฌํ•จ + +**โ‘ข Certificate** +- ์„œ๋ฒ„๊ฐ€ **๊ณต๊ฐœํ‚ค๊ฐ€ ๋‹ด๊ธด ์ธ์ฆ์„œ** ์ „์†ก +- ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ์ธ์ฆ์„œ๊ฐ€ **CA(์ธ์ฆ๊ธฐ๊ด€)**์—์„œ ์„œ๋ช…ํ•œ ๊ฒƒ์ธ์ง€ ๊ฒ€์ฆ + +**โ‘ฃ ์ธ์ฆ์„œ ๊ฒ€์ฆ** +- ๋ธŒ๋ผ์šฐ์ €์—๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” **Root CA ๋ชฉ๋ก**์ด ๋‚ด์žฅ๋จ +- ์ธ์ฆ์„œ ์ฒด์ธ์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ Root CA๊นŒ์ง€ ์‹ ๋ขฐ ํ™•์ธ + +**โ‘ค ClientKeyExchange** +- Pre-Master Secret ์ƒ์„ฑ +- ์„œ๋ฒ„์˜ ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•ด์„œ ์ „์†ก โ†’ ์„œ๋ฒ„๋งŒ ๊ฐœ์ธํ‚ค๋กœ ๋ณตํ˜ธํ™” ๊ฐ€๋Šฅ + +**โ‘ฅ ์„ธ์…˜ ํ‚ค ์ƒ์„ฑ** +- ์–‘์ชฝ์—์„œ `Client Random + Server Random + Pre-Master Secret` ์กฐํ•ฉ +- ๋™์ผํ•œ **์„ธ์…˜ ํ‚ค(๋Œ€์นญํ‚ค)** ๋„์ถœ + +**โ‘ฆ ChangeCipherSpec + Finished** +- "์ด์ œ๋ถ€ํ„ฐ ์•”ํ˜ธํ™” ํ†ต์‹  ์‹œ์ž‘" ์‹ ํ˜ธ +- Finished ๋ฉ”์‹œ์ง€๋กœ Handshake ์™„๋ฃŒ ํ™•์ธ + +--- + +### 3-4. TLS 1.3 โ€” ๋” ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ + +TLS 1.2์˜ ๋‹จ์ ์„ ๊ฐœ์„ ํ•œ ๋ฒ„์ „ (2018๋…„ ํ‘œ์ค€ํ™”) + +| ํ•ญ๋ชฉ | TLS 1.2 | TLS 1.3 | +|------|---------|---------| +| Handshake RTT | 2 RTT | **1 RTT** | +| ์ทจ์•ฝํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ | RSA ํ‚ค ๊ตํ™˜ ๋“ฑ ์ง€์› | ์ œ๊ฑฐ (Forward Secrecy ๊ฐ•์ œ) | +| 0-RTT | ์—†์Œ | ์žฌ์—ฐ๊ฒฐ ์‹œ ์ง€์› | + +> ๐Ÿ’ก **Forward Secrecy (์ „๋ฐฉ ๋น„๋ฐ€์„ฑ)** +> ์„ธ์…˜ ํ‚ค๊ฐ€ ๋‚˜์ค‘์— ์œ ์ถœ๋˜์–ด๋„ ๊ณผ๊ฑฐ ํ†ต์‹  ๋‚ด์šฉ์€ ๋ณตํ˜ธํ™” ๋ถˆ๊ฐ€. +> ๋งค ์„ธ์…˜๋งˆ๋‹ค ์ž„์‹œ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ. + +--- + +### 3-5. SSL vs TLS ์šฉ์–ด ์ •๋ฆฌ + +> ๐Ÿ’ก ์‹ค๋ฌด์—์„œ "SSL ์ธ์ฆ์„œ"๋ผ๊ณ  ๋ถ€๋ฅด์ง€๋งŒ, ํ˜„์žฌ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด **TLS** +> SSL์€ ๊ตฌ๋ฒ„์ „์ด๊ณ  ๋ณด์•ˆ ์ทจ์•ฝ์ ์œผ๋กœ ์ธํ•ด ์‚ฌ์šฉ ์ค‘๋‹จ๋จ +> TLS 1.0, 1.1๋„ deprecated โ†’ ํ˜„์žฌ ํ‘œ์ค€์€ **TLS 1.2 / 1.3** + +--- + +## 4. ๋ฉด์ ‘ ์งˆ๋ฌธ + +### Q1. HTTP์™€ HTTPS์˜ ์ฐจ์ด์ ์€? + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> HTTP๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ „์†กํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๊ณ , HTTPS๋Š” TLS๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์•”ํ˜ธํ™”, ๋ฌด๊ฒฐ์„ฑ, ์ธ์ฆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. HTTPS๋Š” 443 ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์„œ๋ฒ„ ์ธ์ฆ์„œ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +--- + +### Q2. ์™œ TCP 3-way Handshake๋ฅผ ํ•˜๋‚˜์š”? + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> TCP๋Š” ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์—ฐ๊ฒฐ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด 3-way Handshake๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. SYN์œผ๋กœ ์—ฐ๊ฒฐ ์š”์ฒญ โ†’ SYN-ACK์œผ๋กœ ์ˆ˜๋ฝ โ†’ ACK์œผ๋กœ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์„ ํ†ตํ•ด ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๊ณ , ์‹œํ€€์Šค ๋ฒˆํ˜ธ๋ฅผ ๋™๊ธฐํ™”ํ•˜์—ฌ ํŒจํ‚ท ์ˆœ์„œ์™€ ์†์‹ค ๊ฐ์ง€๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +### Q3. HTTP/2์˜ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ์ด ๋ฌด์—‡์ธ๊ฐ€์š”? + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> HTTP/1.1์€ ํ•˜๋‚˜์˜ TCP ์—ฐ๊ฒฐ์—์„œ ์š”์ฒญ-์‘๋‹ต์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. HTTP/2๋Š” ํ•˜๋‚˜์˜ TCP ์—ฐ๊ฒฐ ์œ„์— ์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆผ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์šด๋ฐ˜ํ•˜๋Š” ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ์„ ๋„์ž…ํ•˜์—ฌ, ์—ฌ๋Ÿฌ ์š”์ฒญ/์‘๋‹ต์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด HOL Blocking์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. + +--- + +### Q4. TLS Handshake ๊ณผ์ •์„ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”. + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> ํด๋ผ์ด์–ธํŠธ๊ฐ€ ClientHello๋ฅผ ๋ณด๋‚ด ์ง€์›ํ•˜๋Š” ์•”ํ˜ธํ™” ๋ฐฉ์‹์„ ์•Œ๋ฆฌ๊ณ , ์„œ๋ฒ„๋Š” ์ธ์ฆ์„œ(๊ณต๊ฐœํ‚ค ํฌํ•จ)๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ธ์ฆ์„œ๋ฅผ CA๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆํ•œ ํ›„, Pre-Master Secret์„ ์„œ๋ฒ„์˜ ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•ด ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์–‘์ธก์€ ์ด๋ฅผ ์ด์šฉํ•ด ๋™์ผํ•œ ์„ธ์…˜ ํ‚ค(๋Œ€์นญํ‚ค)๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ดํ›„ ํ†ต์‹ ์€ ์ด ๋Œ€์นญํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค. + +--- + +### Q5. HTTPS์ธ๋ฐ ์™œ ํŒจํ‚ท ์Šค๋‹ˆํ•‘์ด ์•ˆ ๋˜๋‚˜์š”? + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> TLS๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํŒจํ‚ท์„ ๊ฐ€๋กœ์ฑ„๋”๋ผ๋„ ์„ธ์…˜ ํ‚ค ์—†์ด๋Š” ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„ธ์…˜ ํ‚ค๋Š” TLS Handshake ๊ณผ์ •์—์„œ ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”๋ฅผ ํ†ตํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ๊ตํ™˜๋˜๋ฏ€๋กœ, ์ค‘๊ฐ„์—์„œ ํƒˆ์ทจํ•ด๋„ ๋‚ด์šฉ์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. + +--- + +### Q6. HTTP/3๋Š” ์™œ UDP๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜์š”? + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> TCP๋Š” ์ปค๋„ ๋ ˆ๋ฒจ์—์„œ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด ์ˆ˜์ •์ด ์–ด๋ ต๊ณ , ํŒจํ‚ท ์†์‹ค ์‹œ TCP ๋ ˆ๋ฒจ์˜ HOL Blocking์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. HTTP/3๋Š” UDP ๊ธฐ๋ฐ˜์˜ QUIC ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ ๋ขฐ์„ฑ ๋ณด์žฅ ๋กœ์ง์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ์ง์ ‘ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ŠคํŠธ๋ฆผ๋ณ„ ๋…๋ฆฝ์ ์ธ ํŒจํ‚ท ์†์‹ค ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ ์‹œ๊ฐ„๋„ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค. + +--- + +### Q7. 401๊ณผ 403์˜ ์ฐจ์ด๋Š”? + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> 401 Unauthorized๋Š” ์ธ์ฆ์ด ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ, ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. 403 Forbidden์€ ์ธ์ฆ์€ ๋์ง€๋งŒ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ์—†๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋ฉด 403์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. + +--- + +## ๐Ÿ“Œ ํ•ต์‹ฌ ์š”์•ฝ ์นด๋“œ + +``` +HTTP = ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํ† ์ฝœ, Stateless +HTTPS = HTTP + TLS ์•”ํ˜ธํ™” (๊ธฐ๋ฐ€์„ฑ + ๋ฌด๊ฒฐ์„ฑ + ์ธ์ฆ) +HTTP/1.1 = Keep-Alive, ํŒŒ์ดํ”„๋ผ์ด๋‹, HOL Blocking ๋ฌธ์ œ +HTTP/2 = ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ, ํ—ค๋”์••์ถ•, ๋ฐ”์ด๋„ˆ๋ฆฌ, TCP HOL์€ ์—ฌ์ „ํžˆ ์กด์žฌ +HTTP/3 = QUIC(UDP ๊ธฐ๋ฐ˜), 0-1 RTT, ์ŠคํŠธ๋ฆผ๋ณ„ ๋…๋ฆฝ ์ฒ˜๋ฆฌ +TLS = ๋น„๋Œ€์นญํ‚ค๋กœ ๋Œ€์นญํ‚ค ๊ตํ™˜ โ†’ ๋Œ€์นญํ‚ค๋กœ ์‹ค์ œ ํ†ต์‹  +``` + +--- + +*์ฐธ๊ณ : Foundations of Python Network Programming (fopnp) | ๋ฉด์ ‘ ์Šคํ„ฐ๋””์šฉ*