예상치 못한 요금 폭탄 없이 대중에게 무료 AI를 제공할 수 있는 Cloudflare Worker를 구축했습니다
요약
Cloudflare Worker를 활용하여 API 키 노출 위험 없이 대중에게 무료 AI 기능을 제공할 수 있는 'Free-Tier AI Relay' 구축 방법을 소개합니다. 비용 최적화를 위해 무료 티어 모델을 우선 호출하며, 익명 사용자별 제한과 글로벌 지출 상한선을 통해 요금 폭탄을 방지합니다.
핵심 포인트
- Cloudflare Worker 기반의 경량 AI 중계 시스템 구축
- 비용 절감을 위해 무료 티어 모델(Gemini 등) 우선 호출 설계
- UUID 및 해시된 IP를 활용한 남용 방지 및 사용량 제한
- 설정 파일 하나로 제공업체 및 지출 상한선 관리 가능
- API 키를 서버 측에 유지하여 클라이언트 노출 원천 차단
예상치 못한 요금 폭탄 없이 대중에게 무료 AI를 제공할 수 있는 Cloudflare Worker를 구축했습니다
제 앱에 AI 기능을 추가하고 로그인이나 "카드 정보 입력" 없이 누구나 바로 사용할 수 있게 만들고 싶을 때마다, 저를 가로막는 것은 항상 똑같았습니다. 바로 요금(bill)입니다.
API 키가 대중에게 노출되는 순간, 트래픽 급증이나 for 루프를 돌리는 심심한 누군가, 혹은 키 유출 한 번으로 인해 네 자릿수 금액의 청구서를 받으며 깨어날 위험에 처하게 됩니다. 그래서 대부분의 우리는 두 가지 중 하나를 선택합니다. 무료로 제공하려던 기능에 억지로 로그인 기능을 붙이거나, 아니면 그냥... 출시하지 않는 것이죠.
저는 그런 절충안에 지쳤고, 그래서 부족했던 부분을 직접 만들었습니다.
이것은 무엇인가
Free-Tier AI Relay는 약 20 KB 크기의 Cloudflare Worker와 의존성이 없는(zero-dependency) 브라우저 클라이언트로 구성되어 있으며, 여러분의 앱과 AI 제공업체(AI providers) 사이에서 중계 역할을 합니다. 이를 설치하고 Cloudflare의 무료 플랜(free plan)으로 드래그하면, 여러분의 돈을 무제한으로 써버릴 수 없는 공개 AI 엔드포인트(endpoint)를 갖게 됩니다.
전체 설계는 하나의 아이디어를 중심으로 구축되었습니다: 익명의 낯선 이들에게 무료 허용량을 배분하고, 지출 상한선(spend ceiling)을 보장하는 것입니다.
실제 작동 방식
여러분의 키는 서버 측(server-side)에 유지됩니다. 브라우저는 오직 여러분의 Worker와만 통신하며, 제공업체의 키는 클라이언트에 절대 닿지 않습니다.
제공업체들은 신뢰도 순서가 아닌 비용 순서대로 시도됩니다. 이 부분이 일반적인 게이트웨이(gateway)와 다른 점입니다. 유료 서비스 이전에 가장 저렴한 옵션인 무료 티어(free tiers)를 먼저 호출합니다. 현재 배포된 버전 기준으로, Google Gemini의 무료 티어를 먼저 호출한 다음 OpenRouter의 무료 커뮤니티 모델들을 호출합니다. 유료 모델은 여러분이 의도적으로 주석을 해제할 때만 호출됩니다. 기본 설정 상태에서는 무료 티어만 호출하므로 실행 비용은 0달러입니다.
무료 사용량은 매일 세 가지 방식으로 제한되며, 요청이 통과하려면 이 세 가지 조건을 모두 충족해야 합니다:
익명 장치별(UUID) 소프트 공정성 제한을 적용하여 한 사람이 독점하는 것을 막고,
네트워크별(해시된 IP, 따라서 누구의 원본 주소도 저장하지 않음)로 쉽게 장치를 초기화하는 남용을 방지하며,
실제로 지갑을 보호하는 하드 글로벌 상한선이 있습니다. 앱 전체가 이 한계에 도달하면 그날은 무료 등급이 닫히고 리셋될 때까지 기다려야 합니다. 이 숫자는 감당할 수 있는 예산에서 직접 설정합니다.
모든 것이 하나의 설정 파일 안에 담겨 있습니다. 제공업체, 비용 순서, 제한(caps), 엔드포인트가 모두 단일 파일에 존재합니다. 제공업체를 추가하거나 완전히 새로운 AI 기능을 구현하는 데 코드를 변경할 필요가 전혀 없습니다. 또한 전체 무료 등급을 즉시 일시 중지시키는 토글 스위치가 있어 재배포 과정 없이도 가능합니다.
"그럼 제가 실제로 돈을 내야 하는 적이 있나요?"
아니요, 선택하지 않는 한 그렇지 않습니다. 기본 상태는 오직 무료 제공업체만 호출하도록 설정되어 있습니다. 설정 파일에 있는 단일 유료 폴백(paid-fallback) 라인은 주석 처리되어 있어, 사용자가 이를 주석 해제하기 전까지는 아무런 동작도 하지 않습니다. 그리고 나중에 유료 제공업체를 활성화하더라도(확장함에 따라 더 높은 한도를 얻기 위해), 글로벌 일일 상한선이 지출할 수 있는 금액의 하드 상한선 역할을 합니다. 최악의 경우에도 사전에 지정한 숫자이지, 예상치 못한 비용 폭탄은 아닙니다.
LiteLLM / Portkey / 다른 게이트웨이와 차이점
그것들은 훌륭합니다 — 하지만 목적이 다릅니다. 일반적인 LLM 게이트웨이는 자체 신뢰할 수 있는 백엔드에서 발생하는 유료 트래픽을 안정적이고 관찰 가능하며, 가동 시간에 따라 순서화하는 데 중점을 둡니다. 이들은 사용자가 효율적으로 지출하기를 원한다고 가정합니다.
반면, 이것은 정반대의 문제를 해결합니다: 신뢰할 수 없는 대중에게 무료 할당량을 배분하고, 가격에 따라 순서를 매기며, 보장된 상한선을 두는 것입니다. 이는 키와 트래픽을 특정 서비스로 보내지 않고, 사용자가 소유하고 배포하는 자신의 코드 5분 분량입니다.
제가 이것을 공유하는 이유
저는 처음에 제 자체 앱을 위해 이것을 구축했고, 그러다가 '나를 파산시키지 않는 무료 AI 기능'이라는 문제가 사실 모든 인디 개발자가 직면하는 문제라는 것을 깨달았습니다. 그래서 이를 보일러 플레이트(boilerplate) 형태로 패키징하여 공유합니다.
낚시성 정보로 오해받지 않도록 솔직하게 말씀드립니다: 이것은 오픈 소스가 아닌, 원하는 만큼 지불하는 방식(pay-what-you-want)의 상업용 보일러 플레이트(boilerplate)입니다. 여기서 확인하실 수 있습니다: https://privateapps.gumroad.com/l/xenenx. 해당 페이지에는 약 40초 분량의 데모 영상이 있으며, 무료 스캔 카운터가 0으로 줄어들고 앱이 유료 모델을 호출하는 대신 다음 요청을 깔끔하게 거절하는 모습을 보여줍니다.
하지만 저는 대중에게 공개되는 AI를 구축하는 다른 분들이 이 접근 방식에 대해 어떻게 생각하는지 듣고 싶습니다:
3단계 제한(기기 + IP + 글로벌)이 충분하다고 느껴지시나요, 아니면 네 번째 제어 수단을 추가하시겠습니까?
현재 익명의 트래픽이 무료 티어(free tier)를 고갈시키는 것을 어떻게 방지하고 계신가요? 아니면 단순히 모든 기능을 로그인 뒤로 숨기시나요?
진심으로 궁금합니다. 댓글을 통해 제한 로직(cap logic)이나 제공자 폴백 순서(provider-fallback ordering)에 대해 심도 있게 논의할 준비가 되어 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기