Cloudflare Workers AI: 백엔드 없이 정적 사이트에 무료 LLM 추가하기
요약
Cloudflare Workers AI를 사용하여 백엔드 서버나 API 키 없이 정적 사이트에 LLM 기능을 통합하는 방법을 소개합니다. Llama 3.3 70B 모델을 활용해 실제 서비스에 적용한 사례와 뉴런(neuron) 단위의 비용 및 성능 측정 수치를 상세히 다룹니다.
핵심 포인트
- 백엔드 서버나 API 키 관리 없이 정적 사이트에 AI 기능 구현 가능
- Cloudflare Workers AI의 env.AI 바인딩을 통한 간편한 모델 연결
- Llama 3.3 70B 모델을 활용한 실제 PRD 생성 서비스 구축 사례
- 뉴런(neuron) 단위의 과금 체계 및 실제 사용량/지연 시간 데이터 제공
빠른 답변: Cloudflare 뒤에 있는 정적 사이트는 백엔드 없이, 그리고 API 키를 저장하지 않고도 AI를 사용할 수 있습니다. Workers AI는 단 두 줄의
env.AI설정 바인딩(binding)을 통해 Llama 3.3 70B와 같은 모델을 사용자의 워커(worker)에 연결합니다. 무료 티어는 하루에 10,000 뉴런(neurons)을 제공합니다. 실제로 측정했을 때, 이는 답변당 약 124 뉴런과 약 15초가 소요된다고 가정할 때 하루에 약 80개의 답변을 생성할 수 있는 양입니다.
이 모든 일은 단 하루 만에 일어났습니다. 오전에는 우리의 PRD 컨설팅 랜딩 페이지가 텍스트, 이미지, mailto 버튼만 있는 평범한 정적 사이트였습니다. 하지만 오후가 되자, 동일한 페이지에 독자가 자신의 앱 아이디어를 붙여넣으면 위험 요소가 명시된 8개 섹션의 PRD 스켈레톤(skeleton)을 약 15초 만에 받아볼 수 있는 박스가 생겼습니다.
우리가 추가하지 않은 것: 서버입니다. 여전히 우리만의 백엔드도, VM(가상 머신)도, 컨테이너도 없으며, 코드 어디에도 단 하나의 API 키도 존재하지 않습니다. 사이트 자체는 여전히 단순한 정적 HTML입니다.
이것을 가능하게 만드는 한 가지는 바로 Cloudflare Workers AI입니다. 이 포스트는 이것이 어떻게 작동하는지 설명하며, 이와 유사한 포스트들이 보통 생략하는 부분인 실제 측정된 수치를 함께 다룹니다. 답변당 뉴런 사용량, 지연 시간(latency), 그리고 글을 쓰기 직전에 새로 확인한 실제 비용에 대해 설명합니다.
사용된 용어 정리:
- Worker (워커) — 사용자의 사이트 앞단인 Cloudflare 네트워크에서 실행되는 작은 코드 조각입니다. 모든 요청은 먼저 이를 통과합니다.
- Workers AI — 동일한 네트워크에서 AI 모델을 실행하는 서비스로, 워커에서 직접 호출할 수 있습니다.
- binding (바인딩) — 설정을 통해 서비스를 워커에 연결하는 것입니다. 코드는 이를
env.AI와 같은 변수로 인식하며, 별도의 키가 필요하지 않습니다. - neuron (뉴런) — Workers AI의 과금 단위입니다. 모든 모델 사용량은 뉴런으로 변환됩니다.
- rate limit (속도 제한) — 허용되는 호출 횟수의 상한선으로, 스팸과 과도한 요금 청구로부터 사용자를 보호합니다.
파트 1 — 방금 출시된 실제 사례: 랜딩 페이지의 AI 박스
우리의 목표는 구체적이었습니다. 이 랜딩 페이지는 제품 요구사항 컨설팅 (product-requirement consulting)을 판매하며, 우리는 독자들이 직접 문의하기 전에 사고 과정을 경험해 보기를 원했습니다. 그래서 우리는 두 가지를 만들었습니다. 첫 번째는 요구사항이 얼마나 준비되었는지 점수를 매기는 7개 질문의 퀴즈입니다. 이것은 순수 JavaScript로 작성되었으며 AI는 사용하지 않습니다. 두 번째는 이 포스트의 주인공입니다: 아이디어를 입력하면 PRD (제품 요구사항 문서) 스켈레톤을 답변으로 돌려주는 박스입니다. 독자가 몇 문장으로 자신의 아이디어를 설명하면, 시스템은 문제와 사용자부터 범위(scope)와 수락 기준(acceptance criteria)에 이르기까지 8개 섹션의 개요를 반환하며, AI에게 구축을 명령하기 전에 답변할 가치가 있는 리스크(risks)를 제시하며 마무리합니다.
답변을 생성하는 모델은 Cloudflare의 네트워크에서 실행되는 Llama 3.3 70B (instruct fp8 fast 변체)이며, 우리의 머신이 아닌 Cloudflare에서 돌아갑니다.
Browser (static page + fetch)
-> Cloudflare Worker (이메일 게이트 확인, KV에서 rate limits 카운트)
-> env.AI.run() -> Workers AI (Llama 3.3 70B)
질문 하나의 경로: 모든 것이 우리의 서버가 아닌 Cloudflare의 네트워크에 존재합니다.
파트 2 — 왜 백엔드와 API 키가 필요 없는가
이와 같은 사이트들은 보통 한 가지 문제에 봉착합니다: AI가 어디에 위치하는가? 페이지에서 모델을 직접 호출하면 HTML에 API 키를 임베드해야 하며, 이는 키를 전 인터넷에 넘겨주는 것을 의미합니다. 이를 피하려면 중간에 백엔드 (backend)가 필요한데, 이는 실행하고 유지 관리하며 매달 비용을 지불해야 하는 머신이 필요함을 의미합니다. 가볍게 유지하고 싶은 정적 사이트 (static site)에게 두 옵션 모두 매력적이지 않습니다.
Workers AI는 한 가지 아이디어로 이 매듭을 풉니다: 모델은 워커 (worker)가 있는 곳에 존재하며, 액세스는 키가 아닌 계정에 귀속된다는 것입니다. 만약 당신의 사이트가 이미 Cloudflare Worker를 통해 서비스되고 있다면 (우리의 경우 이미 리버스 프록시 (reverse proxy) 및 멤버십 게이트로 사용 중이었습니다), wrangler.toml에 두 줄의 바인딩 (binding)을 추가하는 것만으로 AI를 추가할 수 있습니다:
[ai]
binding = "AI"
이를 통해 워커(worker) 코드에는 직접 호출할 수 있는 env.AI 변수가 생성됩니다. 단 하나의 엔드포인트와 env.AI.run("@cf/meta/llama-3.3-70b-instruct-fp8-fast", ...) 호출 한 번이면 답변이 반환됩니다. 저장해야 할 키가 없다는 것은 유출될 키도 없다는 것을 의미하며, 교체(rotate)할 필요도, 비밀 관리자(secret manager)를 설정할 필요도 없습니다. 페이지 측면에서는 본인 도메인의 엔드포인트로 단순한 fetch 요청을 보내기만 하면 됩니다.
나머지 작업은 AI 작업이 전혀 아니며, 기존의 일반적인 웹 작업과 동일합니다: 입력값 검증, 사용량 제한, 그리고 원하는 방식으로 답변하도록 시스템 프롬프트(system prompt)를 작성하는 것입니다. 저희는 실제 컨설팅 프로젝트에서 사용하는 8개 섹션의 PRD(제품 요구 사항 문서) 템플릿에서 이를 추출했으며, 모든 이들에게 권장하고 싶은 한 가지 규칙을 포함했습니다: 사용자가 제공하지 않은 세부 사항을 절대 지어내지 마십시오. 정보가 누락된 경우, 추측하는 대신 무엇이 누락되었는지 말하십시오. 그렇지 않으면 모델은 아무도 말하지 않은 내용을 기꺼이 채워 넣을 것입니다.
파트 3 — 측정된 수치: 뉴런, 속도, 그리고 비용
Workers AI는 Cloudflare에서 뉴런(neuron)이라고 부르는 단위로 과금됩니다. 모든 계정은 매일 10,000개의 무료 뉴런을 받으며, 이를 초과하면 1,000 뉴런당 $0.011가 부과됩니다. 문서에서 알려주지 않는 것은 _당신의 답변 하나가 실제로 몇 뉴런의 비용을 소모하는가_입니다. 그래서 저희는 Cloudflare 자체 분석 데이터에서 오늘의 실제 사용량을 추출했습니다.
| 5회의 실제 호출 데이터 (2026년 7월 4일) | 측정된 값 |
|---|---|
| 총 뉴런 | 621.5 (평균 호출당 ~124개) |
| ... |
이 수치들은 교차 검증도 가능합니다. 가격 페이지에는 Llama 3.3 70B fast 모델이 입력 토큰 100만 개당 26,668 뉴런, 출력 토큰 100만 개당 204,805 뉴런으로 기재되어 있습니다. 역산해 보면: 입력 토큰 2,202개는 58.7을 생성하고, 여기에 출력 토큰 2,748개를 더하면 562.8이 되어 총 621.5가 됩니다. 이는 대시보드에 보고된 수치와 정확히 일치합니다.
이 두 수치에는 숨겨진 교훈이 있습니다: 출력 속도가 입력 속도보다 거의 8배 빠르기 때문에, 거의 모든 비용은 출력 토큰(621.5 중 562.8)에서 발생합니다. 비용을 제어하고 싶다면, 프롬프트를 압축하려고 애쓰기 전에 max_tokens를 사용하여 답변 길이를 제한하십시오.
속도에 관해서라면: 약 550토큰(token) 분량의 답변에 거의 10초가 소요된다는 것은, 이 서비스가 아이디어를 문서 개요로 변환하는 것과 같이 사람들이 기다릴 용의가 있는 긴 답변에 적합함을 의미합니다. 사람들이 12초 내의 답변을 기대하는 짧고 빠른 채팅에는 적합하지 않습니다. 페이지에 기대치를 올바르게 설정하십시오. 저희 페이지에는 1020초 정도 걸릴 것이라고 명확하게 명시되어 있습니다.
OpenRouter와 같은 다른 무료 옵션은 어떤가요?
저희가 제품을 출시한 직후에 마주했던 질문은 이것입니다:
- 사용 전 이메일 게이트 (An email gate before use). 독자가 퀴즈를 풀고 이메일을 남기면 AI 박스가 잠금 해제됩니다. 서버는 서명된 쿠키 (signed cookie)를 검증합니다. 단순히 JavaScript로 버튼을 숨기는 방식이 아닙니다. 엔드포인트 (endpoint)는 언제든 직접 호출될 수 있기 때문입니다. 쿠키가 없으면 401 에러가 발생합니다.
- IP당 일일 제한 (A per-IP daily cap). 저희는 5회로 설정했습니다. 이는 진정으로 체험해 보기에는 충분하지만, 하루 종일 계속해서 찔러보기에는 부족한 수치입니다.
- 시스템 전체에 대한 글로벌 일일 제한 (A global daily cap for the whole system). 저희는 60회로 설정했으며, 이는 무료 티어 (free tier)가 커버하는 약 80회보다 여유 있게 낮은 수치입니다. 이 계층은 수천 개의 IP로부터 공격을 받더라도 청구 금액이 0원으로 유지됨을 보장하는 장치입니다.
카운터 (counters)는 KV (Cloudflare의 키-값 저장소)에 저장되며, 여기에는 알아둘 만한 한 가지 특징이 있습니다. 바로 최종 일관성 (eventually consistent) 모델을 사용한다는 점입니다. 따라서 읽어온 값이 실제 상황보다 수십 초 정도 뒤처질 수 있습니다. 이로 인해 카운터는 매우 빠른 속도로 요청이 들어올 경우 약간의 오차가 발생할 수 있는 소프트 캡 (soft cap) 역할을 하게 됩니다. 저희도 지연 시간 (latency) 테스트 중에 이를 확인했습니다. 저희 자신의 IP 카운터를 삭제하고 즉시 다시 요청을 보냈을 때, 시스템이 여전히 오래된 (stale) 숫자를 보고 있어 저희 스스로에게 429 에러를 반환했습니다. 이는 사실 두 가지 측면에서 좋은 소식입니다. 첫째, 제한기 (limiter)가 프로덕션 환경에서 제대로 작동함을 증명했고, 둘째, 그 느슨함이 초과 요청을 허용하기보다는 조기에 차단하는 방향으로 작동한다는 점입니다. 글로벌 캡 (global cap)이 어차피 무료 할당량보다 한 단계 아래에 위치하므로, 예산 보호 측면에서는 이러한 느슨함이 적절합니다.
Part 5 — 직접 해보기, 단계별 가이드
이미 사이트가 Cloudflare를 사용 중이거나 (또는 DNS를 이전할 수 있다면), 전체 과정은 다음과 같습니다:
- 바인딩 선언 (Declare the binding). 사이트를 서비스하는 워커(Worker)의
wrangler.toml파일에[ai]+binding = "AI"를 추가합니다. - 엔드포인트 하나 추가. JSON POST 요청을 수락하고, 입력 길이를 검증한 뒤, 답변 구조를 정의하고 세부 사항을 지어내는 것을 금지하는 시스템 프롬프트(System prompt)와 함께
env.AI.run()으로 전달합니다. - 모델 앞에 게이트 설치. 게이트(이메일, 로그인 등 적절한 방식)를 확인한 다음, KV에서 IP당 제한(per-IP cap)과 전체 제한(global cap)을 카운트합니다. 전체 제한은 항상 무료 할당량(free quota) 미만으로 유지하세요. 나중에 정확한 카운팅이 필요하다면 Durable Objects로 전환하십시오.
- 페이지 구성: 하나의
textarea, 하나의 버튼, 하나의fetch를 만듭니다. 대기 시간이 약 10초 정도 걸리므로 명확한 "생각 중(thinking)" 상태를 보여주세요. - 말하기 전에 측정하기. 5번의 실제 호출을 실행하고, 분석(analytics)을 열어 답변 하나가 뉴런(neurons) 단위로 얼마의 비용을 소모하는지 확인한 다음, 무료 티어(free tier)가 트래픽을 감당할 수 있는지 계산해 보세요.
가장 짧은 요약
정적 사이트(Static site) + Cloudflare Worker +
env.AI바인딩 = 서버도, 키(key)도 필요 없는 AI 기능이 탑재된 사이트. 그리고 일일 전체 제한이 무료 할당량 아래에 있다면, 비용은 희망 사항이 아니라 증명된 대로 0원입니다.
출처: 2026년 7월 4일, 5번의 실제 호출에 대해 당사의 Cloudflare 계정 분석(GraphQL 데이터셋 aiInferenceAdaptiveGroups)을 통해 측정한 뉴런(neurons), 토큰(tokens) 및 추론 시간(inference time); curl로 측정한 엔드-투-엔드 지연 시간(end-to-end latency). 가격 및 무료 티어는 Workers AI Pricing (Cloudflare Docs)에서 확인하였으며, 2026년 7월 4일 기준입니다.
원문 게시지: productize.life/blog/cloudflare-workers-ai. 홍보가 아닌 실제 작업 과정으로부터 작성되었습니다. 대안을 고민 중이라면, 저희는 OpenRouter의 23개 무료 모델도 모두 측정해 보았습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기