Streamable HTTP는 기존 HTTP 위에서 동작하면서도, 요청·응답을 스트리밍 형태로 주고받을 수 있게 확장한 전송 방식입니다. MCP(Modal Context Protocol) 같은 AI 프로토콜에서 기존 HTTP+SSE(Server-Sent Events)의 한계를 보완하기 위해 도입되었습니다.
기존의 HTTP와 SSE에는 아래와 같은 문제점이 있었습니다.
HTTP + SSE의 한계
Streamable HTTP가 해결할 수 있는 것
HTTP는 유지하되, WebSocket과 같은 실시간성 경험"을 만들기 위한 새로운 방식이 Streamable HTTP입니다
표준 HTTP 위에서 동작하는 스트리밍 응답 패턴이다.
예: AI에게 긴 보고서 요약을 요청했을 때, 기존 HTTP는 요약이 끝난 뒤 전체 텍스트를 한 번에 내려준다. Streamable HTTP에서는 “문단 단위” 혹은 “토큰 단위”로 결과가 생성되는 즉시 클라이언트로 흘려보낼 수 있다.
/message 같은 하나의 URL로 다음을 모두 처리한다.Session-Id 헤더나 토큰 등을 클라이언트가 함께 보내고,| 항목 | HTTP + SSE | Streamable HTTP |
|---|---|---|
| 통신 방향 | SSE는 서버→클라이언트 단방향 스트림, 요청은 별도 HTTP | GET/POST 기반으로 양방향 상호작용 구성 가능 |
| 엔드포인트 구조 | REST API 엔드포인트 + SSE 엔드포인트를 별도로 운영 | /message 같은 단일 엔드포인트에서 요청·스트림 처리 |
| 연결 방식 | 긴-lived 연결 유지, 서버 리소스 점유 큼 | 필요 시에만 스트리밍, 짧은 HTTP 연결 조합도 가능 |
| 서버 상태 | 상태 유지 구조에 의존하는 경우가 많음 | 상태 비저장 서버 아키텍처에 잘 맞음 |
| 인프라 호환성 | 일부 프록시/게이트웨이에서 SSE 제한 | 표준 HTTP라 CDN·LB·API Gateway와 자연스럽게 호환 |
| 재시도/재개 | 끊어지면 전체 스트림을 처음부터 재시작 | 메시지 ID/offset 기반 재개 설계 용이 |
MCP(Modal Context Protocol)에서 Streamable HTTP를 사용하는 시나리오를 예로 들면 다음과 같습니다.
/message 엔드포인트로 POST 요청을 보낸다.POST /message HTTP/1.1
Host: api.example.com
Authorization: Bearer <token>
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": "123",
"method": "chat.send",
"params": {
"message": "요약 좀 해줘",
"stream": true
}
}
위 방식대로 호출하면 아래 방식처럼 api를 요청할 수 있습니다.
const response = await fetch("/message", {
method: "POST",
headers: {
"Content-Type": "application/json",
// Authorization 등 필요한 헤더...
},
body: JSON.stringify({
jsonrpc: "2.0",
id: "123",
method: "chat.send",
params: { message: "요약 좀 해줘", stream: true }
})
});
const reader = response.body?.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value, { stream: true });
// chunk에는 여러 JSON 라인이 섞여 있을 수 있으므로,
// 줄바꿈 기준 split 후 개별 JSON 파싱 등의 처리가 필요.
console.log(chunk);
}
오늘은 Streamable에 대해 알아보았습니다. 아직 현업에서 SSE를 사용하지만 고도화가 진행될 때 Streamable HTTP를 도입하자고 제안할 계획이기에 매우 유익했던 학습이었습니다. 오늘도 긴 글 읽어주셔서 감사합니다!