"HTTP header 가 수백 개야. 외우지 마; 분류해. Header 가 어느 category 에 속하는지 알면 언제 expect 할지, 뭘 하는지 대충 알아."
95% 를 커버하는 다섯 category
IANA registry 에 수백 개 header 있고, 셀 수 없는 custom 도 있어. 목록 외우지 마. Category 를 외워 — 만나는 모든 header 가 이 다섯 양동이 중 하나에 들어가고, 양동이가 그게 뭘 하는지 알려줘:
- Request control — client 가 server 한테 이 request 처리 방식 control 하려고 보냄.
Host,Authorization,Accept,Accept-Encoding,Accept-Language,User-Agent,Cookie,Origin,Referer. - Response control — server 가 response 자체나 향후 request 에 대해 보냄.
Server,Set-Cookie,WWW-Authenticate,Location,Vary,Allow,Retry-After. - Representation metadata — body 를 describe (request 든 response 든).
Content-Type,Content-Length,Content-Encoding,Content-Language,Last-Modified,ETag. Body 와 같이 다님. - Caching & conditional — Request 와 response 를 bridge 해서 cache coordinate.
Cache-Control,Expires,ETag(그래 ETag 가 두 category 에서 놀아),If-None-Match,If-Modified-Since,Vary. Track 5 가 여기 살아. - Connection & transport — Message 가 아니라 TCP 연결에 대한 것.
Connection,Keep-Alive,Transfer-Encoding,Upgrade(WebSocket 으로 전환). HTTP/2 와 3 는 binary framing 으로 불필요해져서 대부분 떨궈.
실제 exchange 를 category 로 읽기
Category 가 머리에 들어오면 raw HTTP exchange 가 스스로 decode 돼. Request 보고 모든 header 분류하면 문서 안 읽고도 server 가 뭘 할지 예측 가능. Response 도 마찬가지 — 어떤 게 body-metadata 인지, cache 지시인지, session state 인지 알아.
Header 는 client 와 server 가 body 안 건드리고 negotiate 하는 방식이야. Content type, language, encoding, freshness, auth, session — 다 header 로 운반해서 body 는 실제 데이터에 자유. 이 중 뭐든 body 에 넣으려는 거 ("requested_language" 라는 JSON 필드) 는 protocol 과 싸우는 거야.
Custom header — X- 접두사는 잊어
수십 년 동안 custom header 가 X- 접두사를 달았어 (X-Request-ID, X-Forwarded-For). RFC 6648 (2012) 가 공식적으로 이 관례 은퇴시켰어. 오늘: 원하는 이름 골라, 단 descriptive 하게 (Pippa-Request-ID, Stripe-Signature, cf-ray). 많은 legacy X- header 가 여전히 현역 — X-Forwarded-For 가 어디나 있어 — 제거하면 client 깨지니까. 기존 거 rename 마; 그냥 자기 API 에 새 X- 추가하지 마.
cwkPippa 의 header 현실
전형적 cwkPippa request 는 category 1 에서 header 다섯 운반:
Host: localhost:8000, Authorization: Bearer ..., Accept: application/json, Content-Type: application/json (POST 에), User-Agent. Response 는 representation metadata (Content-Type: application/json, Content-Length), connection control (Connection: keep-alive), 가끔 static asset 엔 Cache-Control 추가. SSE response 는 Content-Type: text/event-stream 에 Transfer-Encoding: chunked — type 이 브라우저한테 EventSource parser 쓰라 알려주고; encoding 이 body 가 고정 길이 없음을 알려줘.