KR_Net_HTTP - somaz94/DevOps-Engineer GitHub Wiki
HTTP ๋์ ๊ณผ์ :
- โ ํด๋ผ์ด์ธํธ๊ฐ HTTP ์์ฒญ ๋ฉ์์ง ์ ์ก (GET, POST ๋ฑ ๋ฉ์๋ + URI)
- โก ์๋ฒ๊ฐ ์์ฒญ ์ฒ๋ฆฌ ํ HTTP ์๋ต ๋ฉ์์ง ๋ฐํ (์ํ ์ฝ๋ + ์๋ต ๋ณธ๋ฌธ)
- โข ํด๋ผ์ด์ธํธ๊ฐ ์๋ต ํด์ ๋ฐ ์ถ๊ฐ ์์ฒญ ๊ฐ๋ฅ (HTML, CSS, JavaScript ๋ฑ)
- โฃ ํ๋ฌธ ์ ์ก์ผ๋ก ์ค๊ฐ์ ๊ณต๊ฒฉ์ ์ทจ์ฝ
HTTPS ๋์ ๊ณผ์ (TLS Handshake):
- โ ํด๋ผ์ด์ธํธ๊ฐ HTTPS ์๋ฒ์ ์ ์, ClientHello ๋ฉ์์ง ์ ์ก (์ง์ ์ํธํ ์ค์ํธ ๋ชฉ๋ก)
- โก ์๋ฒ๊ฐ ServerHello + SSL/TLS ์ธ์ฆ์ ์ ์ก (๊ณต๊ฐํค ํฌํจ)
- โข ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ์ ๊ฒ์ฆ (CA์ ๊ณต๊ฐํค๋ก ์๋ช ํ์ธ)
- โฃ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ ํค(๋์นญํค) ์์ฑ ํ ์๋ฒ์ ๊ณต๊ฐํค๋ก ์ํธํํ์ฌ ์ ์ก
- โค ์๋ฒ๊ฐ ๋น๊ณต๊ฐํค๋ก ์ธ์ ํค ๋ณตํธํ
- โฅ ์ดํ ์ธ์ ํค๋ฅผ ์ฌ์ฉํ ๋์นญํค ์ํธํ ํต์
- โฆ Finished ๋ฉ์์ง ๊ตํ ํ ์ํธํ๋ ๋ฐ์ดํฐ ์ ์ก
์ฃผ์ ์ฐจ์ด์ :
- HTTP: ํฌํธ 80, ํ๋ฌธ ์ ์ก, ๋น ๋ฆ, ๋ณด์ ์ทจ์ฝ
- HTTPS: ํฌํธ 443, ์ํธํ ์ ์ก, TLS Handshake ์ค๋ฒํค๋, ๊ธฐ๋ฐ์ฑ/๋ฌด๊ฒฐ์ฑ/์ธ์ฆ ๋ณด์ฅ
์์ ํ ๋ฉ์๋ (Safe Methods):
- ์๋ฒ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ์ฝ๊ธฐ ์ ์ฉ ๋ฉ์๋
- GET, HEAD, OPTIONS, TRACE
- ์ฌ๋ฌ ๋ฒ ํธ์ถํด๋ ์๋ฒ ๋ฆฌ์์ค์ ์ํฅ ์์
๋ฉฑ๋ฑํ ๋ฉ์๋ (Idempotent Methods):
- ๋์ผํ ์์ฒญ์ ์ฌ๋ฌ ๋ฒ ์ํํด๋ ๊ฒฐ๊ณผ๊ฐ ๋์ผ
- GET, HEAD, PUT, DELETE, OPTIONS, TRACE
- POST, PATCH๋ ๋น๋ฉฑ๋ฑ์ : ๋งค๋ฒ ์๋ก์ด ๋ฆฌ์์ค ์์ฑ ๋๋ ๋ค๋ฅธ ๊ฒฐ๊ณผ
์ค๋ฌด ์์:
GET /users/123 โ ์์ + ๋ฉฑ๋ฑ (์ฌ๋ฌ ๋ฒ ์กฐํํด๋ ๋์ผ)
POST /users โ ๋น์์ + ๋น๋ฉฑ๋ฑ (๋งค๋ฒ ์ ์ฌ์ฉ์ ์์ฑ)
PUT /users/123 โ ๋น์์ + ๋ฉฑ๋ฑ (๊ฐ์ ๋ด์ฉ์ผ๋ก ๋ฎ์ด์ฐ๊ธฐ)
DELETE /users/123 โ ๋น์์ + ๋ฉฑ๋ฑ (์ด๋ฏธ ์ญ์ ๋ ๋ฆฌ์์ค ์ฌ์ญ์ ์ 404์ง๋ง ์ํ ๋์ผ)
PATCH /users/123 โ ๋น์์ + ๋น๋ฉฑ๋ฑ (์ฆ๊ฐ ์ฐ์ฐ ๋ฑ ๋์ ๊ฐ๋ฅ)
๋คํธ์ํฌ ์ฌ์๋ ์ ๋ต:
- ๋ฉฑ๋ฑํ ๋ฉ์๋๋ ์๋ ์ฌ์๋ ์์
- ๋น๋ฉฑ๋ฑํ ๋ฉ์๋๋ Idempotency Key ์ฌ์ฉ (๊ฒฐ์ API ๋ฑ)
HTTP/1.1 (1997):
- Connection per Request: ์์ฒญ๋ง๋ค ์๋ก์ด TCP ์ฐ๊ฒฐ (Keep-Alive๋ก ์ํ)
- Head-of-Line Blocking: ์ด์ ์์ฒญ ์๋ฃ ์ ๊น์ง ๋๊ธฐ
- ํ ์คํธ ๊ธฐ๋ฐ ํ๋กํ ์ฝ: ํ์ฑ ์ค๋ฒํค๋
- ๊ฐ์ ๋ฐฉ๋ฒ: Pipelining (์ ํ์ ์ง์), Domain Sharding (๋ค์ค ๋๋ฉ์ธ)
HTTP/2 (2015):
- Multiplexing: ํ๋์ TCP ์ฐ๊ฒฐ์์ ์ฌ๋ฌ ์คํธ๋ฆผ ๋์ ์ ์ก
- Header Compression (HPACK): ํค๋ ์ค๋ณต ์ ๊ฑฐ ๋ฐ ์์ถ
- Server Push: ํด๋ผ์ด์ธํธ ์์ฒญ ์ ๋ฆฌ์์ค ์ ์ ์ ์ก
- Binary Framing: ๋ฐ์ด๋๋ฆฌ ํ๋ ์์ผ๋ก ํจ์จ์ ํ์ฑ
- ํ๊ณ: TCP ๋ ๋ฒจ Head-of-Line Blocking ์ฌ์ ํ ์กด์ฌ (ํจํท ์์ค ์ ์ ์ฒด ์คํธ๋ฆผ ๋๊ธฐ)
HTTP/3 (2022):
- QUIC over UDP: TCP ๋์ QUIC ํ๋กํ ์ฝ ์ฌ์ฉ
- Stream-level ๋ ๋ฆฝ์ฑ: ํ๋์ ์คํธ๋ฆผ ํจํท ์์ค์ด ๋ค๋ฅธ ์คํธ๋ฆผ์ ์ํฅ ์์
- 0-RTT Connection: ์ด์ ์ฐ๊ฒฐ ์ ๋ณด ์ฌ์ฌ์ฉ์ผ๋ก Handshake ์๋ต
- Connection Migration: IP ๋ณ๊ฒฝ ์์๋ ์ฐ๊ฒฐ ์ ์ง (๋ชจ๋ฐ์ผ ํ๊ฒฝ)
- ๋ด์ฅ TLS 1.3: ์ํธํ ํ์
์ฑ๋ฅ ๋น๊ต:
HTTP/1.1: 6๊ฐ ๋ณ๋ ฌ ์ฐ๊ฒฐ โ ๋ฆฌ์์ค ๋ก๋ฉ ์ง๋ ฌํ
HTTP/2: ๋จ์ผ ์ฐ๊ฒฐ Multiplexing โ 2~3๋ฐฐ ๋น ๋ฆ
HTTP/3: QUIC ๊ธฐ๋ฐ โ ํจํท ์์ค ํ๊ฒฝ์์ 10~30% ์ถ๊ฐ ๊ฐ์
Full TLS 1.2 Handshake (2-RTT):
Client Server
| |
|-------- ClientHello --------------->| (์ง์ ์ํธํ ์ค์ํธ, ๋๋ค ๊ฐ)
| |
|<------- ServerHello ----------------| (์ ํ ์ํธํ ์ค์ํธ, ์ธ์ฆ์, ๋๋ค ๊ฐ)
|<------- Certificate ----------------| (์๋ฒ ๊ณต๊ฐํค)
|<------- ServerHelloDone ------------|
| |
|-------- ClientKeyExchange --------->| (Pre-Master Secret ์ํธํ ์ ์ก)
|-------- ChangeCipherSpec ---------->|
|-------- Finished ------------------>|
| |
|<------- ChangeCipherSpec -----------|
|<------- Finished -------------------|
| |
|======== Application Data ==========| (์ํธํ๋ HTTP ๋ฐ์ดํฐ)
TLS 1.3 Handshake (1-RTT):
Client Server
|-------- ClientHello + KeyShare ---->| (์ํธํ ํค ๊ตํ ๋์ ์ ์ก)
| |
|<------- ServerHello + KeyShare -----| (์ํธํ ํค + ์ธ์ฆ์)
|<------- {EncryptedExtensions} ------|
|<------- {Certificate} --------------|
|<------- {Finished} -----------------|
| |
|-------- {Finished} ---------------->|
|======== Application Data ==========|
์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ:
1. TLS Session Resumption:
Session ID: ์๋ฒ๊ฐ ์ธ์
์ ๋ณด ์ ์ฅ (๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด)
Session Ticket: ํด๋ผ์ด์ธํธ๊ฐ ์ํธํ๋ ํฐ์ผ ์ ์ฅ (stateless)
2. TLS 1.3 0-RTT (Zero Round Trip Time):
- ์ด์ ์ฐ๊ฒฐ์ PSK(Pre-Shared Key) ์ฌ์ฌ์ฉ
- Handshake ์์ด ๋ฐ๋ก ๋ฐ์ดํฐ ์ ์ก
- ๋ณด์ ํธ๋ ์ด๋์คํ: Replay Attack ์ํ (๋ฉฑ๋ฑํ ์์ฒญ๋ง ์ฌ์ฉ)
3. OCSP Stapling:
- ์๋ฒ๊ฐ ์ธ์ฆ์ ์ํ๋ฅผ ๋ฏธ๋ฆฌ ํ์ธํ์ฌ ์๋ต์ ํฌํจ
- ํด๋ผ์ด์ธํธ์ CA ์กฐํ ์๊ฐ ์ ์ฝ
4. HTTP/3 (QUIC):
- 0-RTT Connection ๊ธฐ๋ณธ ์ง์
- TLS 1.3 ๋ด์ฅ
์ค๋ฌด ์ค์ (Nginx):
ssl_protocols TLSv1.3 TLSv1.2;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets on;
ssl_stapling on;
ssl_stapling_verify on;2xx ์ฑ๊ณต ์๋ต:
- 200 OK: GET ์ฑ๊ณต, ์๋ต ๋ณธ๋ฌธ ํฌํจ
- 201 Created: POST๋ก ๋ฆฌ์์ค ์์ฑ ์ฑ๊ณต, Location ํค๋์ ์ URI
- 204 No Content: ์์ฒญ ์ฑ๊ณตํ์ง๋ง ์๋ต ๋ณธ๋ฌธ ์์ (DELETE, PUT ์ฑ๊ณต ์)
- 206 Partial Content: Range ์์ฒญ์ ๋ํ ๋ถ๋ถ ์๋ต (๋์์ ์คํธ๋ฆฌ๋ฐ)
3xx ๋ฆฌ๋ค์ด๋ ์ :
- 301 Moved Permanently: ์๊ตฌ ์ด๋, ๊ฒ์ ์์ง์ด ์ URL ์ธ๋ฑ์ฑ
- 302 Found: ์์ ์ด๋, ์๋ณธ URL ์ ์ง
- 304 Not Modified: ์บ์๋ ๋ฆฌ์์ค ์ ํจ, ๋ณธ๋ฌธ ์ ์ก ์ ํจ (If-Modified-Since, ETag ํ์ฉ)
- 307 Temporary Redirect: 302์ ์ ์ฌํ์ง๋ง ๋ฉ์๋ ๋ณ๊ฒฝ ๊ธ์ง (POST โ POST)
- 308 Permanent Redirect: 301๊ณผ ์ ์ฌํ์ง๋ง ๋ฉ์๋ ๋ณ๊ฒฝ ๊ธ์ง
4xx ํด๋ผ์ด์ธํธ ์ค๋ฅ:
- 400 Bad Request: ์๋ชป๋ ์์ฒญ ๋ฌธ๋ฒ
- 401 Unauthorized: ์ธ์ฆ ํ์ (WWW-Authenticate ํค๋)
- 403 Forbidden: ์ธ์ฆ๋์์ง๋ง ๊ถํ ์์
- 404 Not Found: ๋ฆฌ์์ค ์กด์ฌํ์ง ์์
- 405 Method Not Allowed: ํ์ฉ๋์ง ์์ ๋ฉ์๋
- 429 Too Many Requests: Rate Limit ์ด๊ณผ (Retry-After ํค๋)
5xx ์๋ฒ ์ค๋ฅ:
- 500 Internal Server Error: ์๋ฒ ๋ด๋ถ ์ค๋ฅ
- 502 Bad Gateway: ๊ฒ์ดํธ์จ์ด/ํ๋ก์ ์ค๋ฅ
- 503 Service Unavailable: ์๋ฒ ๊ณผ๋ถํ ๋๋ ์ ์ง๋ณด์ (Retry-After ํค๋)
- 504 Gateway Timeout: ๊ฒ์ดํธ์จ์ด/ํ๋ก์ ํ์์์
์บ์ฑ ์ ๋ต (Cache-Control):
Cache-Control: public, max-age=31536000, immutable
โ ์ ์ ๋ฆฌ์์ค (CSS, JS), 1๋
์บ์, ๋ธ๋ผ์ฐ์ ์ฌ๊ฒ์ฆ ๋ถํ์
Cache-Control: private, max-age=3600
โ ์ฌ์ฉ์๋ณ ๋ฐ์ดํฐ, 1์๊ฐ ์บ์, CDN ์บ์ ๋ถ๊ฐ
Cache-Control: no-cache
โ ์บ์ ๊ฐ๋ฅํ์ง๋ง ์ฌ์ฉ ์ ์ฌ๊ฒ์ฆ ํ์ (ETag, Last-Modified)
Cache-Control: no-store
โ ์บ์ ๊ธ์ง (๋ฏผ๊ฐํ ์ ๋ณด)
์กฐ๊ฑด๋ถ ์์ฒญ:
Request:
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
If-Modified-Since: Wed, 21 Oct 2023 07:28:00 GMT
Response (์บ์ ์ ํจ):
304 Not Modified
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
(๋ณธ๋ฌธ ์์, ๋์ญํญ ์ ์ฝ)
๐ก ์ฉ์ด ์ค๋ช :
- HTTP/HTTPS ๊ด๋ จ ์ง๋ฌธ๋ค(Q1-Q5)์์ ์ฌ์ฉ๋ ์ฉ์ด๋ค(TLS Handshake, ๋ฉฑ๋ฑ์ฑ, HTTP/2 Multiplexing, Cache-Control, ETag ๋ฑ)์ ๋ํ
- ์์ธํ ์ค๋ช ์ ๋ฌธ์ ์๋จ์ ์ฃผ์ ์ฉ์ด ํตํฉ ์ ๋ฆฌ > ํ๋กํ ์ฝ & ํต์ ์น์ ์ ์ฐธ๊ณ ํ์ธ์.