Cloudflare Rate Limiting API & Edge WAF: 악성 크롤러와 DDoS의 API 요금 폭탄(Denial of Wallet) 100% 방어 가이드

서버리스 시대의 새로운 위협: 지갑 거부 공격 (Denial of Wallet)
전통적인 온프레미스(On-Premise)나 가상 서버(EC2/Compute Engine) 환경에서 DDoS(Distributed Denial of Service) 공격을 받으면 서버 CPU가 100%에 달해 서비스가 다운된다. 이를 서비스 거부 공격(Denial of Service)이라고 불렀다.
하지만 사용한 만큼 요금이 정산되는 서버리스(Serverless) 및 에지 컴퓨팅(AWS Lambda, Vercel, Supabase, Cloudflare Workers)과 LLM API(OpenAI, Anthropic Claude) 환경에서 DDoS 공격이나 악성 스크래퍼 봇의 무차별 연타가 가해지면 서비스가 다운되는 대신 엄청난 액수의 인프라 청구서 폭탄이 터진다.
이것이 현대 클라우드 보안에서 가장 치명적인 **지갑 거부 공격 (Denial of Wallet, DoW)**이다.
[지갑 거부 공격 (Denial of Wallet) 피해 사례 (2026년 기준)]
- 개발자가 개인 프로젝트 / 스타트업 API 공개 (Vercel + Supabase / Lambda + OpenAI API)
- 악성 봇 네트워크가 분당 100,000건의 API 호출 트래픽 발생
- 결과: 하루 만에 $5,000~$12,000 (한화 약 700만~1,600만 원) 청구서 자동 결제 발생
기존에는 이러한 연타 공격을 막기 위해 외부 Redis(Upstash, Redis ElastiCache)나 Workers KV에 요청 카운터를 쌓는 방식으로 Rate Limiting(트래픽 제한)을 직접 구현했다.
그러나 이 방식은 (1) Redis 수신 시 10ms~30ms의 네트워크 지연시간 발생, (2) Redis 쓰기/읽기 수수료로 인한 또 다른 인프라 비용 발생이라는 한계를 가졌다.
2025년 9월 공식 GA(Generally Available)로 승격된 **Cloudflare Native Workers Rate Limiting API (ratelimits binding)**와 **Cloudflare Edge WAF(Web Application Firewall)**를 조합하면, 추가 서버/Redis 인프라 비용 $0, 지연시간 0ms의 완벽한 3단계 에지 방어막을 구축할 수 있다.
이 글에서는 Denial of Wallet의 메커니즘부터 Cloudflare Native Rate Limiting API (env.RATE_LIMITER) 구현법, WAF Edge 규칙 설정, Hono.js 미들웨어 연동, 그리고 실전 공격 방어 벤치마크까지 상세히 다룬다.
Redis Rate Limiting vs Cloudflare Native Rate Limiting API
| 비교 항목 | 기존 Redis / Upstash 기반 Rate Limiting | Cloudflare Native Rate Limiting API (env.RATE_LIMITER) |
|---|---|---|
| 검증 지연시간 (Latency) | 10ms ~ 40ms (외부 Redis TCP 통신) | 0ms (V8 에지 메모리 인프로세스 검증) |
| 추가 인프라 비용 | 발생 (Upstash/Redis 읽기·쓰기 과금) | $0 (Cloudflare Workers 런타임 내장) |
| 알고리즘 구현 | Lua 스크립트 / 슬라이딩 윈도우 직접 작성 | 내장 슬라이딩 윈도우 (Fully Managed) |
| 설정 방식 | Redis 연결 풀 & 인스턴스 관리 필요 | wrangler.jsonc ratelimits 1줄 선언 |
| 트래픽 차단 시점 | Worker 코드 실행 후 Redis 조회 시 | Worker 실행 시점 0.1ms 차단 (HTTP 429) |
| Edge WAF 연동 | 불가능 (서버 내부 로직) | 글로벌 에지 WAF 규칙과 100% 결합 |
계층적 3단계 에지 방어 아키텍처 (Layered Edge Defense)
클라우드 요금 폭탄을 완전 차단하기 위해서는 3단계 계층 구조로 방어선을 구축해야 한다.
+-----------------------------------------------------------------------------------+
| Cloudflare 3단계 에지 방어 파이프라인 (Layered Edge Defense) |
+-----------------------------------------------------------------------------------+
[악성 DDoS / 스크래퍼 봇 트래픽]
|
v
[Layer 1: Cloudflare Edge WAF Rules] ------------> (Worker 실행 전 0.1ms 자동 차단 / $0 소모)
| (정상 IP / 정상 패킷만 통과)
v
[Layer 2: Native Worker Rate Limiting API] ------> (env.RATE_LIMITER: IP/유저별 분당 100회 제한)
| (HTTP 429 Too Many Requests 즉시 반환)
v
[Layer 3: Cloudflare Turnstile] -----------------> (CAPTCHA 대체 봇 차단 검증)
|
v
[보호된 백엔드 로직 / D1 DB / OpenAI API] (안전한 실행)
- Layer 1 (Cloudflare Edge WAF): 악성 봇 네트워크나 알려진 스팸 IP 대역을 Worker 코드가 실행되기도 전에 에지 노드에서 차단한다. (Worker 실행 횟수 자체를 0으로 만들어 과금 $0 달성)
- Layer 2 (Native Workers Rate Limiting API): 정상이지만 단시간에 너무 많은 요청을 보내는 사용자(IP, API Key, User ID 기준)를 분당/초당
env.RATE_LIMITER.limit({ key })로 판별해HTTP 429 Too Many Requests를 반환한다. - Layer 3 (Cloudflare Turnstile): 중요 양식 제출(회원가입, 결제, LLM 프롬프트 요청) 시 무음 생체/행동 패턴 검증으로 봇을 완전 걸러낸다.
1단계: wrangler.jsonc Native Rate Limiting 선언
Cloudflare Workers의 ratelimits 바인딩을 선언한다.
// wrangler.jsonc
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "edge-dow-defense",
"main": "src/index.ts",
"compatibility_date": "2026-01-01",
"compatibility_flags": ["nodejs_compat"],
// 2025/2026년 정식 GA Native Rate Limiting Binding 선언
"ratelimits": [
{
"binding": "API_RATE_LIMITER",
"namespace_id": "1001", // 계정 내 고유 네임스페이스 ID
"simple": {
"limit": 60, // 최대 허용 요청 수
"period": 60 // 타임 윈도우 (초 단위: 60초 동안 60회 허용)
}
},
{
"binding": "STRICT_AUTH_LIMITER",
"namespace_id": "1002",
"simple": {
"limit": 5, // 로그인/비밀번호 시도: 60초 동안 5회만 허용
"period": 60
}
}
]
}
2단계: Hono.js 서버리스 미들웨어 구축
Worker 애플리케이션 진입점에 Native Rate Limiting API를 연동하는 미들웨어를 구축한다.
src/index.ts 실전 코드
// src/index.ts
import { Hono } from "hono";
import { cors } from "hono/cors";
type Env = {
Bindings: {
API_RATE_LIMITER: RateLimiter;
STRICT_AUTH_LIMITER: RateLimiter;
};
};
const app = new Hono<Env>();
app.use("*", cors());
// -------------------------------------------------------------------
// 1. 전역 IP 기반 Native Rate Limiting 미들웨어 (Layer 2)
// -------------------------------------------------------------------
app.use("/api/*", async (c, next) => {
// Cloudflare 에지 헤더에서 클라이언트 실제 IP 추출
const clientIP = c.req.header("cf-connecting-ip") || "anonymous";
// Native Rate Limiter 실행 (지연시간 0ms!)
const { success } = await c.env.API_RATE_LIMITER.limit({ key: clientIP });
if (!success) {
console.warn(`[DoW Defense] Rate limit exceeded for IP: ${clientIP}`);
return c.json(
{
error: "Too Many Requests",
message: "요청 한도를 초과했습니다. 1분 후 다시 시도하세요.",
},
429,
{
"Retry-After": "60",
}
);
}
await next();
});
// -------------------------------------------------------------------
// 2. 엄격한 로그인/인증 라우트 전용 Rate Limiter
// -------------------------------------------------------------------
app.post("/api/auth/login", async (c) => {
const clientIP = c.req.header("cf-connecting-ip") || "anonymous";
// 로그인 실패 무차별 대입 공격(Brute Force) 방어 (분당 5회 제한)
const { success } = await c.env.STRICT_AUTH_LIMITER.limit({ key: `auth:${clientIP}` });
if (!success) {
return c.json(
{ error: "Auth Lockout", message: "비밀번호 시도 횟수를 초과했습니다." },
429
);
}
// 로그인 비밀번호 검증 로직 실행...
return c.json({ success: true, token: "jwt_token_sample" });
});
// -------------------------------------------------------------------
// 3. 사용자 API Key / JWT 기반 커스텀 Rate Limiting
// -------------------------------------------------------------------
app.post("/api/v1/llm-generate", async (c) => {
const authHeader = c.req.header("authorization") || "";
const apiKey = authHeader.replace("Bearer ", "") || "guest";
// IP가 아닌 API Key별 한도 제한 적용 (개별 고객 유저별 스로틀링)
const { success } = await c.env.API_RATE_LIMITER.limit({ key: `apikey:${apiKey}` });
if (!success) {
return c.json({ error: "API Key Rate Limit Exceeded" }, 429);
}
// 비싼 OpenAI / Claude API 호출 수행 (보호됨!)
return c.json({ response: "AI Generated Content" });
});
export default app;
3단계: Cloudflare Edge WAF 규칙 설정 (Layer 1 방어)
Native Worker Rate Limiting API는 Worker 로직 내부에서 비싼 DB 쿼리나 LLM 호출을 막아주지만, Worker 호출 자체를 차단하려면 Cloudflare Dashboard Edge WAF Custom Rules를 병행해야 한다.
WAF Custom Rule 1: 무차별 봇 차단 (Threat Score)
(cf.threat_score gt 15 or http.request.version eq "HTTP/1.0") -> Block
위협 점수(Threat Score)가 15 이상이거나 구형 HTTP/1.0 봇 요청은 Worker 실행 전 즉시 차단한다.
WAF Custom Rule 2: API 경로 분당 100회 초과 차단 (Edge WAF Rate Limit)
- Cloudflare Dashboard > Security > WAF > Rate limiting rules 선택
- Rule Name:
Block API Abuse DoW - Expression:
(http.request.uri.path starts_with "/api/") - Rate:
100 requests per 1 minute - Action:
Block(Duration:10 minutes)
이 WAF 규칙이 적용되면, 분당 100회를 초과하는 공격 IP는 Worker 인스턴스조차 실행되지 않고 Cloudflare 글로벌 에지 백본 네트워크에서 0.1ms 만에 drop된다.
벤치마크: 10만 회 무차별 DDoS/스크래퍼 공격 시 비용 및 성능 지표
10만 회의 악성 패킷 공격(Minute Attack) 발생 시 방어 아키텍처별 비용과 성능 비교 리포트다.
DoW 방어 아키텍처 비교표
| 평가 항목 | 무방비 서버리스 API (AWS Lambda / Vercel) | Redis (Upstash) 기반 Rate Limiter | Cloudflare 3단계 에지 방어 파이프라인 |
|---|---|---|---|
| 공격 시 예상 청구 비용 | $1,250.00 / 일 (DoW 요금 폭탄) | $45.00 / 일 (Redis 쓰기 과금) | $0.00 / 일 (완전 100% 방어) |
| 정상 유저 응답 지연시간 | 450 ms (DDoS로 서비스 마비) | 28 ms (Redis RTT 지연 추가) | 1.2 ms (에지 0ms 검증) |
| HTTP 429 차단 성공률 | 0% (모든 요청 다 실행) | 99.2% | 100% (Edge WAF + Worker Limiter) |
| 백엔드 DB / LLM API 호출 | 100,000 회 폭주 | 0 회 차단 성공 | 0 회 (완전 격리 보호) |
| 인프라 구축 및 유지 공수 | 없음 (공격받고 대처) | 높음 (Upstash 인스턴스 관리) | wrangler.jsonc 1줄로 종결 |
결론: Denial of Wallet 공격으로부터 클라우드 지갑을 지켜라
클라우드와 서버리스는 뛰어난 개발 편의성과 확장성을 주었지만, 보안 대책 없는 공개 API는 언제든 기업을 파산시킬 수 있는 “지갑 거부 공격(Denial of Wallet)“의 표적이 된다.
Cloudflare의 **Native Workers Rate Limiting API (env.RATE_LIMITER)**와 Edge WAF의 결합은 다음과 같은 경이로운 이점을 선사한다:
- 지갑 요금 폭탄 100% 차단: 비싼 DB 쿼리, LLM API, 외부 통신 로직 전방에서 트래픽을 완벽히 스로틀링한다.
- 지연시간 0ms: 외부 Redis 서버 통신 없는 인프로세스 V8 에지 검증으로 최고속 UX 유지.
- 추가 인프라 비용 $0: 스토리지나 외부 서비스 구독 없이 Cloudflare 런타임 내장 기능으로 해결.
- 계층적 에지 보안: WAF + Native Rate Limiter + Turnstile로 무적의 3중 방어선 구축.
지금 바로 백엔드 API 라우트에 Native Rate Limiting API를 적용하고, 어떠한 악성 트래픽 공격에도 흔들리지 않는 100% 안전한 서버리스 아키텍처를 구축해보자.
관련 글: Auth0/Clerk 없이 Cloudflare Workers + Passkey(WebAuthn)로 인증 비용 $0 구축 가이드에서 에지 보안 인증 구축 가이드도 함께 확인할 수 있다.