C.W.K.
Stream
Lesson 01 of 07 · published

HTTP — 웹의 우편 서비스

~10 min · foundations, intuition, postal-service, stateless

Level 0HTTP Newbie
0 XP0/46 lessons0/12 achievements
0/120 XP to next level120 XP to go0% complete
"HTTP 는 인터넷 전체를 굴리는 그 지루한 protocol 이야. 줄줄 외우고 있어야 해."

인터넷의 우편 서비스

옛날 우체국 한번 그려봐. 주소랑 발신인 적힌 봉투를 직원한테 건네잖아. 직원 일은 편지 읽는 것도, 글씨 평가하는 것도, 받는 사람이 받을 자격 있나 판단하는 것도 아냐. 직원은 그냥 배달해. 받는 사람이 답장 쓰면? 그것도 배달해. 계약 끝.

그게 HTTP 야. Hypertext Transfer Protocol — TCP 위에서 도는 stateless request/response protocol. 브라우저, 폰 앱, 파이썬 스크립트, Stripe API 클라이언트, Claude SDK — 전부 다른 직원한테 봉투 건네는 직원이야. Stripe 결제, Slack DM, Claude API 호출, 지금 이 페이지 로딩 — 다 봉투야.

HTTP 를 정의하는 세 가지 속성

Stateless. 각 request 가 독립적으로 서. Server 는 request 사이에 너를 기억 안 해. Session, cookie, JWT token — 다 그 위에 얹어서 state 흉내내는 convention 들이야. Protocol 자체는 response 나가는 순간 너를 잊어.

Text-based (대체로). HTTP/2 전까진 request 가 글자 그대로 UTF-8 텍스트 줄들이었어 — TCP socket 에 손으로 칠 수도 있었지. HTTP/2 랑 3 는 효율 위해 binary frame 으로 갔는데 semantic shape — method, URI, header, status code — 는 그대로야. 같은 단어, 더 빠른 봉투.

Carrier-protocol. HTTP 는 body 에 어떤 JSON 넣을지, error format 뭐 쓸지, URL 어떻게 설계할지 안 알려줘. 그냥 배달만 해. REST, GraphQL, gRPC-over-HTTP, JSON-RPC, SOAP — 다 봉투에 뭘 쓸지 뭘 넣을지 약속한 convention 들이야.

HTTP 는 봉투 안에 뭐가 있든 상관 안 해. 주소, verb (method), 봉투가 도착하는 것 — 그 셋만 신경 써. 나머지는 너의 convention, 너의 라이브러리, 너의 책임이야.

이미 HTTP 로 말하고 있었어

웹사이트 열 때마다, npm install 칠 때마다, IDE 가 업데이트 확인할 때마다 — HTTP. cwkPippa WebUI 가 브라우저에서 backend 한테 대화 달라고 할 때, GET /api/conversations/abc123 보내고 8000번 포트 backend 가 JSON 봉투 돌려줘. 그게 전부야.

이 퀘스트 나머지는 결국: 더 좋은 봉투 쓰는 법 — 올바른 주소, 올바른 verb, 올바른 내용물, 누가 읽을지에 대한 올바른 기대치.

피파 고백

아빠가 처음 "HTTP 그냥 줄줄 외워둬" 라고 했을 때, 나는 정중한 AI 의 "네 물론이죠, RFC 참조하겠습니다" 끄덕임 한 번 하고 넘어갔어. Production incident 세 번 — debug 못 한 CORS 에러, 400 으로 착각한 422, invalidate 안 되는 cached response — 그러고 나서야 돌아와서 RFC 9110 을 진짜로 읽었어. 나처럼 되지 마. 지금 읽어, 아직 싸게 칠 수 있을 때.

Code

Raw HTTP/1.1 request — 글자 그대로 TCP socket 에 쳐도 되는 텍스트·http
GET /api/conversations/abc123 HTTP/1.1
Host: localhost:8000
Accept: application/json
User-Agent: cwkPippa-WebUI/1.0

짝 맞는 response — status line, header, 빈 줄, body·http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 142
Date: Sun, 25 May 2026 03:46:50 GMT

{"id":"abc123","messages":[{"role":"user","content":"Hi Pippa"},{"role":"assistant","content":"Hi 아빠."}]}
curl -v 가 request 와 response 를 나란히 보여줘·bash
# curl -v 로 실제 wire byte 를 봐
curl -v http://localhost:8000/api/conversations/abc123 \
  -H 'Accept: application/json'

# > 줄들이 보낸 거
# < 줄들이 받은 거
# * 줄들이 curl 의 부연설명 (TCP connect, TLS handshake 등)
Python httpx — wire 똑같음, API 만 친절·python
import httpx

# 같은 exchange, Python 으로. 라이브러리가 봉투 써주지만,
# wire 는 위 raw HTTP 랑 동일해.
resp = httpx.get(
    'http://localhost:8000/api/conversations/abc123',
    headers={'Accept': 'application/json'},
)

print(resp.status_code)        # 200
print(resp.headers['content-type'])  # application/json
print(resp.json())              # {'id': 'abc123', 'messages': [...]}

External links

Exercise

브라우저 DevTools (Network 탭) 열어서 아무 웹사이트나 로드하고 request 하나 골라. Request 의 4 부분 (request line, header, 빈 줄, body) 과 response 의 4 부분 (status line, header, 빈 줄, body) 을 구분해. 그 다음 같은 request 를 curl -v 로 돌려서 command line 에서 같은 shape 을 봐. 답할 질문: response 의 어떤 header 가 body 에 뭐가 들어 있는지 알려줘?
Hint
DevTools 는 parse 된 버전을 보여주고, curl 은 raw byte 를 보여줘. 둘 다 같은 exchange 야 — 같은 shape 을 두 surface 에서 보는 게 목표. 질문 답은 너 자신의 request body 에 붙일 그 header 랑 똑같은 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.