본문 바로가기
C.W.K.
Stream
Lesson 03 of 05 · published

Session ID 와 Statefulness

~20 min · session, mcp-session-id, stateful, stateless

Level 0호기심 많은 독자
0 XP0/48 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

Streamable HTTP 는 stateful server 도 stateless server 도 다 받아줘. Protocol 이 대신 골라주지 않아 — 설계할 때 네가 정하고, Mcp-Session-Id header 로 그 결정을 알리는 거야.

Stateful server 는 initialize 때 session id 를 발급해서 Mcp-Session-Id 로 돌려줘. 이후 요청은 그 id 를 header 에 실어 보내고, server 는 id 로 session 별 상태를 찾아 — 열려 있는 구독, 페이지를 넘기던 cursor, 아직 돌고 있는 긴 작업 같은 것들. 정리도 명시적이야. Client 가 다 쓰면 session id 를 담아 endpoint 에 HTTP DELETE 를 보내고, server 가 상태를 치워.

Stateless server 는 session id 를 아예 안 줘. 모든 요청이 서로 독립이고, 호출 하나에 필요한 일을 그 자리에서 하고 버려. 그래서 부하 분산기 뒤의 어느 노드가 어느 요청을 받아도 되고, 조율 없이 옆으로 늘릴 수 있어. 대신 구독도, 호출 사이를 잇는 cursor 페이지 넘기기도, '이 client 한테 마지막으로 뭐라고 했더라' 를 기억하는 기능도 못 줘.

선택은 결국 운영 문제야. Stateful 이 짜기는 쉬운데 늘리기가 어려워 (같은 곳으로 붙여주는 라우팅이나 공유 저장소가 필요하거든). Stateless 는 늘리기 쉬운데, 상태를 요청 안으로 밀어 넣어야 해 (cursor 를 불투명한 token 으로 만든다든지). 실제 production 배포는 대체로 stateless 로 가면서 Redis 같은 데 공유 상태를 두는 쪽으로 정착해. Stateless 의 단순한 배관과 stateful 의 표현력을 같이 가져가는 거지.

Code

Stateful — header 의 session id·text
POST /mcp  →  HTTP/1.1 200 OK
                 Mcp-Session-Id: sess_abc123

POST /mcp  Mcp-Session-Id: sess_abc123  →  ...
DELETE /mcp Mcp-Session-Id: sess_abc123  →  HTTP/1.1 204 No Content
Stateless — 모든 호출 fresh·text
POST /mcp  →  HTTP/1.1 200 OK
                 (Mcp-Session-Id 발급 안 됨)

# 각 request 가 독립적으로 처리될 만큼 state 를 carry.
# Cursor / opaque token 은 params 에 — server memory에는 두지 마.

External links

Exercise

네가 짠 server 를 놓고 물어봐. 정말로 session 단위 상태가 필요한 tool 이 있나? 답이 '없다' 면 session-id 기계장치를 걷어내고 stateless 로 내보내. 직접 짠 server 는 대부분 처음 생각보다 상태가 덜 필요했어.

Progress

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

댓글 0

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

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