브라우저에서 Sume API 호출 시 CORS 오류: 해결 방법
브라우저는 내 사이트에서 api.sume.com으로 직접 보내는 호출을 차단하며, API 키는 프론트엔드 코드에 절대 넣으면 안 됩니다. 서버에서 Sume를 호출해 프록시하세요.

CORS 오류가 나는 이유는 내 도메인의 웹 페이지가 api.sume.com을 직접 호출할 수 없기 때문입니다. Sume API는 현재 Sume 자체 웹 오리진에만 CORS 헤더를 보내므로 브라우저가 호출을 차단합니다. 해결책은 Sume 문서가 어차피 요구하는 방식입니다. API 키는 서버에 두고, 브라우저가 백엔드나 서버리스 함수를 호출하게 하고, 그 코드가 Sume를 호출하게 하세요.
아래 CORS 동작은 API 서버 코드에서 읽은 것으로, 현재 동작을 설명합니다. 키 관련 규칙은 2026-09-27에 확인한 Sume 인증 페이지에서 가져왔습니다. 키, 스코프, 호스트가 동작하는 방식은 Sume API 키 동작 방식에서 다룹니다.
브라우저는 왜 Sume API 호출을 차단하나요?
CORS는 브라우저의 규칙입니다. 페이지는 다른 오리진의 응답을, 그 서버의 Access-Control-Allow-Origin 헤더가 페이지의 오리진을 허용할 때만 읽을 수 있습니다. Sume 호출에는 Authorization이나 x-api-key 헤더가 실리므로, 브라우저는 먼저 OPTIONS 프리플라이트 요청을 보내고 프리플라이트가 허용할 때만 실제 요청을 보냅니다.
현재 코드에서 Sume API는 요청마다 Origin 헤더를 Sume 자체 웹 오리진의 허용 목록과 대조합니다. 그 밖의 오리진에는 CORS 헤더를 붙이지 않으므로 프리플라이트 요청이 실패하고, 내 코드는 상태 코드도 본문도 전혀 받지 못합니다. CORS는 브라우저가 강제하고 서버는 강제하지 않으므로, 같은 요청을 백엔드에서 보내면 통과합니다.
Sume API는 어디에서 호출할 수 있나요?
키를 비밀로 지킬 수 있는 곳이라면 어디서든 호출할 수 있습니다. CORS보다 먼저 문서의 안전 규칙이 이를 정합니다.
| 호출하는 곳 | Sume 직접 호출 | 이유 |
|---|---|---|
| 내 사이트의 프론트엔드 JavaScript | 아니요 | 프론트엔드 JavaScript에 키를 두면 안 되며, API가 내 오리진에는 CORS 헤더를 보내지 않음 |
| 모바일 앱 | 아니요 | 모바일 앱에 키를 두면 안 됨. 대신 백엔드를 호출 |
| 내 백엔드나 서버리스 함수 | 예 | 신뢰할 수 있는 서버가 키를 보관하고 요청마다 붙임 |
| CI 작업과 로컬 스크립트 | 예 | CI 시크릿 저장소와 로컬 개발 머신은 키를 두어도 되는 곳으로 문서에 나와 있음 |
서버 쪽 프록시로 어떻게 해결하나요?
문서에 이 패턴이 나와 있습니다. 브라우저와 모바일 클라이언트는 백엔드를 호출하고, 백엔드가 서버 쪽 환경 변수에서 Sume 키를 가져와 붙입니다. 아래 라우트 핸들러는 요청을 아바타 생성으로 전달합니다.
export async function POST(request: Request) {
const body = await request.json();
const response = await fetch("https://api.sume.com/v1/avatar-1.0/generate", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SUME_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify(body),
});
return new Response(await response.text(), {
status: response.status,
headers: { "Content-Type": "application/json" },
});
}프록시는 요청을 전달하기 전에 무엇을 확인해야 하나요?
어떤 요청이든 전달하는 프록시는 누구나 내 키로 비용을 쓸 수 있게 만듭니다. 프록시를 자체 API처럼 다루세요.
- Sume로 요청을 전달하기 전에 사용자 입력을 검증하고 자체 인가를 적용하세요.
- 키 헤더는 정확히 하나만 보내세요. 이미
x-api-key를 보내는 클라이언트 위에Authorization을 덧붙이는 게이트웨이는401 unauthorized를 받습니다. - 요청 본문에
workspace_id,owner_user_id,user_id를 넣지 마세요. Sume는 이 값들을 키에서 알아냅니다. - 이제 모든 방문자가 키의 분당 요청 예산(읽기 예산과 쓰기 예산은 별도)을 함께 쓰므로,
ratelimit-remaining과retry-after헤더를 보고 요청 속도를 조절하세요. - 영상이 렌더링되는 동안 브라우저 요청을 열어 두지 마세요. 서버리스 타임아웃과 AI 영상에서 설명하듯 비동기로 제출한 뒤 폴링하거나 웹훅을 받으세요.
- 브라우저 번들, 로그, 채팅 기록 등으로 키가 노출되면 대시보드에서 교체하세요.
대신 브라우저에서 TypeScript SDK를 쓸 수 있나요?
쓸 수 없습니다. @sume-com/sdk 클라이언트는 API 키로 만들기 때문에 클라이언트 코드가 아니라 백엔드 라우트에 두어야 합니다. 문서에 나온 런타임은 Node 18+, Bun, Deno, Cloudflare Workers입니다. 백엔드 흐름 전체는 제품에 AI 영상 생성 임베드하기에서 보여 줍니다.
출처
관련 글
개발자 카테고리의 다른 글
- Sume API 엔드포인트 목록: 경로, 스코프, 멱등성
Sume API의 공개 경로를 계열별로 정리한 색인입니다. 키가 필요 없는 경로, 계열별 스코프, Idempotency-Key 적용 위치, 계열별 설명 글을 담았습니다.
- Sume API 오류 코드 총정리: 표면별 색인과 다음 조치
Sume API 오류 코드를 표면별로 정리했습니다. 공통 코드, 유료 생성, Format, Scheduled 실행, Agent Completions, 미디어 도구, 호스팅 MCP를 다룹니다.
- Sume API 용어집: Format 실행, 지출 상한, 멱등성 키
Sume API 용어를 한두 문장씩 설명합니다. Format, 실행, Job, 지출 상한, 멱등성 키, 지갑, 에이전트 수수료, 웹훅, 아티팩트 등을 관련 글 링크와 함께 정리했습니다.
- Sume API 헤더: 인증, 멱등성 키, If-Match, 요청 한도
Sume API가 읽거나 보내는 모든 HTTP 헤더를 정리했습니다. API 키, Content-Type, Idempotency-Key, If-Match, 요청 ID, 요청 한도, 웹훅 서명을 다룹니다.
작성자 Sume