"TCP 한 번도 안 보고 HTTP 코드 쓰면서 평생 일할 수 있어. 연결이 hang 걸리거나, TLS handshake 가 실패하거나, CDN 이 request 중간에 끊는 그 날 전까지는. 그때서야 봤어야 했네 싶을 거야."
Layer cake
모든 HTTP request 는 protocol 스택을 거쳐 가, 각 층이 아래층을 깔끔히 추상화한 척하면서:
- HTTP — 네가 쓰는 메시지 (method, URI, header, body).
- TLS — optional 암호화 wrapper. HTTPS 면 있고 HTTP 면 없음.
- TCP — 신뢰성 있고 순서 있는 byte stream. 패킷 손실, 재전송, 순서 뒤바뀜 다 숨겨.
- IP — host 사이의 best-effort 패킷 배달. 순서 없음, 신뢰성 없음.
- Ethernet / Wi-Fi — wire 위의 bit.
HTTP/3 는 cake 중간을 바꿔: QUIC (TLS 1.3 와 신뢰성을 묶음) 가 UDP 위에서 돌아, TCP 건너뛰어. 위의 HTTP semantics 는 똑같음; 아래 transport 만 완전 달라.
TCP — 신뢰성이라는 거짓말
IP 패킷은 잃어버려지고, 순서가 뒤바뀌고, 중복되고, 떨어져. TCP 의 일은 그런 일 안 일어나는 척하는 거야. Three-way handshake (SYN → SYN-ACK → ACK) 로 연결 열고, byte 에 sequence number 매기고, 잃어버린 거 재전송하고, 깨끗한 stream 을 읽는 사람한테 배달해.
비용: TCP 연결 setup 만 해도 1 round trip, 첫 HTTP byte 보내기도 전에. 서울에서 미국 동부 서버까지면 ~150ms 가 그냥 날아가. HTTP/1.1 은 request 마다 새 TCP 연결 열었어 — 옛날 웹페이지가 끈적하게 느렸던 이유. Keep-Alive (Track 5) 랑 HTTP/2 multiplexing 이 한 연결을 여러 request 로 재사용해서 고친 거야.
TLS — 암호화 wrapper
HTTPS 는 HTTP 를 TLS 로 감싼 거야. 처음 연결할 때 TLS 가 cipher suite negotiate 하고, key 교환하고, server 의 certificate 검증해. 그 다음엔 모든 HTTP byte 가 나갈 때 암호화되고 들어올 때 복호화돼. HTTP 코드는 차이 못 봐; http:// 대신 https:// 만 부르면 끝.
비용: TLS 1.2 면 2 round trip (handshake + key exchange), TLS 1.3 면 1 round trip (handshake 와 key 합침). TLS 1.3 는 재방문 시 0-RTT 재개도 지원해. API client 가 첫 request 만 느리고 그 다음은 빠르면 TLS handshake 가 보통 범인.
openssl s_client, tcpdump, curl -v 로 추상화 너머를 들여다보는 법 배워.HTTPS = 443 포트; HTTP = 80 포트
관례야. HTTP 는 명시 안 하면 TCP 80 으로 가; HTTPS 는 TCP 443 으로 가. cwkPippa 는 :8000 (FastAPI backend) 과 :5173 (Vite frontend) 에서 plain HTTP 로 돌아, Tailscale 뒤 로컬 전용이라서. 공개 인터넷에 TLS 없이 노출하는 순간 너와 사용자 사이 모든 라우터가 그걸 읽을 수 있어.
HTTP/3 와 QUIC
HTTP/3 는 TCP 를 버리고 QUIC 위에 타. QUIC 은 UDP 기반 protocol 인데 신뢰성 + 순서 + 암호화를 한 번에 묶어. 이득: 더 빠른 handshake (TLS 와 합침), transport 층 head-of-line blocking 없음, 연결 migration (폰이 Wi-Fi 에서 LTE 로 바뀌어도 세션 안 끊김). 단점: HTTP/2 보다 보급이 덜 되어 있고 전통적 도구로 debug 하기 어려워.
피파 고백
lsof -i :8000 먼저 돌리는 거 배웠어.