Cloudflare WAF 실무 스터디 가이드

데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약

#waf #ddos #web-protection 2026.03

1. Cloudflare WAF란?

Cloudflare WAF(Web Application Firewall)는 에지(Edge)에서 동작하는 클라우드 기반 웹 방화벽입니다. 전 세계 330개 이상의 데이터센터에서 트래픽을 검사하여 악성 요청을 차단하고, 정상 트래픽만 오리진 서버로 전달합니다.

🛡️ OWASP Top 10 대응

SQL 인젝션, XSS, CSRF 등 주요 웹 취약점을 사전 정의된 규칙으로 차단합니다. 사용자 정의 규칙도 지원합니다.

⚡ Rate Limiting & DDoS

초당 요청 수를 제한하고, L3/L7 DDoS 공격을 에지에서 흡수하여 오리진을 보호합니다. 자동 임계값 조정 기능 포함.

🧠 AI 기반 위협 인텔리전스

머신러닝 모델이 실시간으로 트래픽 패턴을 분석하여 알려지지 않은 공격(제로데이)도 탐지합니다. Attack Score로 위험도 평가.

2. 왜 써야 하는가?

기존 온프레미스 WAF나 다른 클라우드 WAF 대비 Cloudflare WAF가 가지는 장점을 비교합니다.

항목 Cloudflare WAF 기존 WAF (ModSecurity 등) AWS WAF
배포 방식 DNS 변경만으로 즉시 적용 리버스 프록시 구성 필요 ALB/CloudFront 연동 필요
DDoS 방어 내장 (무제한 완화) 별도 장비 필요 Shield Advanced 필요 (추가 비용)
규칙 업데이트 자동 (Managed Rules) 수동 업데이트 부분 자동
AI/ML 탐지 Attack Score, Bot Management 없음 없음 (WAF 전용)
성능 에지 캐싱 + 최적화 라우팅 오리진 부하 증가 리전 종속

💡 결론: Cloudflare WAF는 운영 부담이 적고, DDoS 방어와 AI 기반 탐지가 통합되어 있어 데이터/AI 엔지니어링 파이프라인을 보호하기에 적합합니다.

3. 핵심 개념

Cloudflare WAF의 동작 방식을 이해하기 위한 아키텍처 다이어그램입니다.

┌─────────────────────────────────────────────────────────────┐ │ Cloudflare Edge (330+ PoPs) │ │ │ │ ┌──────────┐ ┌──────────────┐ ┌──────────────────┐ │ │ │ Client │──▶│ WAF Engine │──▶│ Cache / Origin │ │ │ │ Request │ │ - OWASP │ │ - Rate Limit │ │ │ └──────────┘ │ - AI/ML │ │ - DDoS Mitigate │ │ │ │ - Custom │ └────────┬─────────┘ │ │ └──────────────┘ │ │ │ ▼ │ │ ┌──────────────┐ │ │ │ Origin 서버 │ │ │ │ (Protected) │ │ │ └──────────────┘ │ └─────────────────────────────────────────────────────────────┘ * 모든 트래픽은 WAF Engine을 거쳐 검사됨 * 정상 요청만 오리진에 도달 * 공격 트래픽은 에지에서 차단 (오리진 부하 0)

핵심 구성 요소:

4. 퀵스타트

Python과 Cloudflare API를 사용하여 WAF 규칙을 설정하는 예제입니다. CLI 명령어도 함께 제공합니다.

4.1 사전 준비

Cloudflare 계정과 API 토큰이 필요합니다. (Zone:Read, WAF:Edit 권한)

# 환경 변수 설정 (CLI)
export CF_API_TOKEN="your_api_token_here"
export CF_ZONE_ID="your_zone_id_here"

4.2 Python으로 WAF 규칙 생성

import requests
import os

API_TOKEN = os.environ["CF_API_TOKEN"]
ZONE_ID = os.environ["CF_ZONE_ID"]
HEADERS = {
    "Authorization": f"Bearer {API_TOKEN}",
    "Content-Type": "application/json"
}

# SQL Injection 차단 규칙 (Custom Rule)
rule_payload = {
    "description": "Block SQL Injection - 실무 예제",
    "expression": "(http.request.uri.path contains \"/api/\") and (http.request.body.raw matches \"(?i)(select|union|insert|drop)\")",
    "action": "block",
    "enabled": True
}

response = requests.post(
    f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/rulesets/phases/http_request_firewall_custom/rules",
    headers=HEADERS,
    json=rule_payload
)
print(response.json())

4.3 Rate Limiting 규칙 (CLI + Python)

# CLI: curl로 Rate Limiting 규칙 생성
curl -X POST "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/rate_limits" \
  -H "Authorization: Bearer ${CF_API_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "description": "Rate limit /api - 100 req/min",
    "match": {
      "request": {
        "url": "*/api/*"
      }
    },
    "threshold": 100,
    "period": 60,
    "action": "block",
    "enabled": true
  }'

⚠️ 주의: 실제 운영 환경에서는 규칙을 먼저 "log" 모드로 테스트한 후 "block"으로 전환하세요. Attack Score를 활용하면 더 정교한 탐지가 가능합니다.

5. 핵심 설정 레퍼런스

설정 항목 설명 추천 값 / 예시
Managed Rulesets Cloudflare OWASP, Cloudflare Specials OWASP: paranoia level 3, Specials: 모두 ON
Custom Rules (필터) IP, ASN, URI, 헤더 기반 차단/허용 (ip.src eq 1.2.3.4) and (http.request.uri.path eq "/admin")
Rate Limiting 임계값 초과 시 차단/챌린지 API: 100 req/min, 로그인: 5 req/min
Attack Score AI 기반 위험 점수 (0~100) 차단: score > 60, 로그: score > 30
Bot Management 봇 트래픽 분류 및 차단 Verified Bots: Allow, Malicious: Block
Security Level 챌린지 강도 (Under Attack 모드 포함) Medium (기본), 공격 시 High

6. 실무 팁 & 트러블슈팅

🔴 문제 1: 정상 트래픽이 WAF에 의해 차단됨 (False Positive)

해결책: WAF 로그를 확인하고, 해당 요청의 Attack Score를 분석합니다. 특정 규칙이 오탐지하는 경우 Skip 규칙을 추가하거나 규칙 표현식을 조정합니다. 예를 들어 특정 User-Agent는 검사에서 제외:

# Python: Skip 규칙 예제 (특정 봇 허용)
skip_payload = {
    "description": "Skip WAF for health check bot",
    "expression": "(http.user_agent eq \"HealthChecker/1.0\")",
    "action": "skip",
    "action_parameters": {"rulesets": ["all"]}
}

🔴 문제 2: DDoS 공격 중 오리진이 다운됨

해결책: "Under Attack" 모드를 활성화하면 모든 방문자에게 JS 챌린지가 적용됩니다. 또한 Rate Limiting 임계값을 낮추고, 오리진 IP를 Cloudflare IP로만 제한하세요.

# CLI: Under Attack 모드 활성화
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/settings/security_level" \
  -H "Authorization: Bearer ${CF_API_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{"value": "under_attack"}'

💡 팁: WAF 로그는 Logpush를 통해 S3, GCS, 또는 자신의 데이터 레이크로 스트리밍할 수 있습니다. AI 엔지니어라면 이 데이터를 활용해 이상 탐지 모델을 재학습시킬 수 있습니다.

7. 참고 자료