데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약
Cloudflare WAF(Web Application Firewall)는 에지(Edge)에서 동작하는 클라우드 기반 웹 방화벽입니다. 전 세계 330개 이상의 데이터센터에서 트래픽을 검사하여 악성 요청을 차단하고, 정상 트래픽만 오리진 서버로 전달합니다.
SQL 인젝션, XSS, CSRF 등 주요 웹 취약점을 사전 정의된 규칙으로 차단합니다. 사용자 정의 규칙도 지원합니다.
초당 요청 수를 제한하고, L3/L7 DDoS 공격을 에지에서 흡수하여 오리진을 보호합니다. 자동 임계값 조정 기능 포함.
머신러닝 모델이 실시간으로 트래픽 패턴을 분석하여 알려지지 않은 공격(제로데이)도 탐지합니다. Attack Score로 위험도 평가.
기존 온프레미스 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 엔지니어링 파이프라인을 보호하기에 적합합니다.
Cloudflare WAF의 동작 방식을 이해하기 위한 아키텍처 다이어그램입니다.
핵심 구성 요소:
Python과 Cloudflare API를 사용하여 WAF 규칙을 설정하는 예제입니다. CLI 명령어도 함께 제공합니다.
Cloudflare 계정과 API 토큰이 필요합니다. (Zone:Read, WAF:Edit 권한)
# 환경 변수 설정 (CLI)
export CF_API_TOKEN="your_api_token_here"
export CF_ZONE_ID="your_zone_id_here"
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())
# 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를 활용하면 더 정교한 탐지가 가능합니다.
| 설정 항목 | 설명 | 추천 값 / 예시 |
|---|---|---|
| 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 |
🔴 문제 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 엔지니어라면 이 데이터를 활용해 이상 탐지 모델을 재학습시킬 수 있습니다.