웹방화벽 WAF 도입 2026, 기업 보안팀이 먼저 볼 비용·오탐·우회 기준

웹방화벽 WAF 도입을 검색한 팀은 대개 두 가지 압박을 동시에 받는다. 외부에는 로그인, 결제, 관리자, 공개 API가 열려 있고 내부에서는 “장애 없이 빨리 막아야 한다”는 요구가 온다. 여기서 WAF를 단순 보안 장비처럼 사면 실패하기 쉽다. 관리형 룰을 켜는 일보다 더 어려운 것은 정상 고객 요청을 막지 않으면서 공격 트래픽을 줄이고, 오탐 신고가 들어왔을 때 몇 분 안에 되돌릴 수 있는 운영 기준을 세우는 일이다.
공식 문서만 봐도 WAF의 성격은 조금씩 다르다. Cloudflare WAF는 incoming web/API request를 ruleset으로 평가하고 custom rules, rate limiting, managed rules, security events를 제공한다. AWS WAF는 CloudFront, API Gateway, Application Load Balancer, AppSync, Cognito, App Runner, Verified Access, Amplify 같은 리소스 앞에서 HTTP/HTTPS request를 모니터링하고 allow, block, count 같은 동작을 둔다. Vercel WAF는 firewall 설정 변경이 전역에 빠르게 반영되고 이전 설정으로 rollback할 수 있음을 강조한다. Google Cloud Armor는 DDoS와 XSS, SQLi 같은 애플리케이션 공격을 security policy와 preconfigured WAF rules로 다룬다.
이 차이는 구매표 비교가 아니라 운영 설계로 이어져야 한다. 어떤 제품이든 WAF는 애플리케이션 취약점을 고쳐주지 않는다. 대신 위험한 요청을 먼저 줄이고, 취약한 경로를 찾고, 패치 전 임시 완화책을 제공한다. 그래서 도입 판단은 “막을 수 있나”가 아니라 “무엇을 count로 보고, 무엇을 challenge로 보내고, 무엇을 block으로 승격하며, 누가 예외를 승인할 것인가”로 내려와야 한다. 이 글은 웹방화벽 WAF 도입 전 비용·보안·운영 기준을 실무자가 바로 검토할 수 있게 정리한 것이다.
- WAF는 취약점 패치의 대체재가 아니라 외부 요청을 평가하고 차단·관찰·완화하는 앞단 통제다.
- 초기에는 block보다 count/log 모드로 정상 트래픽과 오탐을 확인한 뒤 high confidence 규칙부터 승격해야 한다.
- 비용은 월 사용료만 보지 말고 요청 수, 관리형 룰, 봇·rate limit, 로그 저장, 장애 대응 인력까지 합쳐 봐야 한다.
- 보안팀, 서비스 owner, SRE가 rule 변경·롤백·예외 만료를 함께 보지 않으면 WAF는 금방 꺼지는 알림 소음이 된다.
이 글이 필요한 사람
- Cloudflare, AWS WAF, Vercel WAF, Cloud Armor, Azure WAF 같은 관리형 WAF를 비교하는 보안·인프라 담당자
- 로그인, 결제, 관리자, API Gateway 앞단에 rate limit과 managed rule을 붙이려는 DevOps 리드
- 오탐 때문에 WAF 차단을 바로 켜지 못하고 count 모드나 challenge 모드를 설계해야 하는 보안팀
- DDoS, SQL injection, XSS, credential stuffing, bot traffic을 한 번에 줄이고 싶은 SaaS 운영팀
- WAF 견적을 받았지만 요청 수, 로그, managed rules, 예외 처리 인력 비용까지 계산하지 못한 구매 담당자
WAF 도입의 첫 질문은 제품명이 아니라 보호 경로다
WAF 도입 회의에서 가장 먼저 나오는 질문은 보통 “어느 회사 제품이 좋은가”다. 이 질문은 순서가 늦다. 먼저 정해야 할 것은 보호할 경로다. 같은 웹 서비스라도 공개 랜딩 페이지, 로그인, 결제, 파일 업로드, 관리자, API, webhook endpoint는 위험과 오탐 비용이 다르다. 예를 들어 로그인 경로는 credential stuffing과 bot rate limit이 중요하고, 파일 업로드는 malicious upload 탐지와 확장자·MIME 검증이 중요하다. 관리자 경로는 IP allowlist나 SSO 뒤로 숨기는 편이 WAF 규칙보다 우선일 수 있다.
Cloudflare 문서의 설명처럼 WAF는 IP 주소, URL path, header, body content 같은 request property를 기준으로 룰을 적용한다. AWS WAF도 IP 주소, query string, 요청 속성 같은 조건으로 allow, block, count 동작을 한다. 즉 WAF는 “웹 앱 전체에 보안막 하나 씌우기”가 아니다. 어느 path와 method, 어떤 header와 payload, 어떤 사용자 흐름에서 어떤 동작을 할지 정교하게 조정해야 한다.
처음부터 전 사이트 block을 켜면 장애와 오탐이 먼저 보인다. 검색 봇, 결제사 callback, 사내 QA, 제휴사 webhook, 이미지 업로드, 마케팅 랜딩의 추적 파라미터가 예상 밖으로 막힐 수 있다. 그래서 첫 단계는 보호 경로를 세 가지로 나누는 것이다. 즉시 차단 후보, 관찰 후보, WAF보다 앱 수정이 먼저인 후보. 이 구분 없이는 어떤 제품을 사도 운영 난이도가 올라간다.
관리형 WAF 비교표: 기능보다 운영 방식으로 본다
| 검토 축 | Cloudflare WAF | AWS WAF | Vercel WAF | Google Cloud Armor |
|---|---|---|---|---|
| 적합한 출발점 | DNS/CDN 앞단에서 웹·API request를 ruleset, custom rules, rate limiting, security events와 함께 보려는 팀 | CloudFront, ALB, API Gateway, AppSync 등 AWS 리소스 앞단을 계정·리소스 단위로 통제하려는 팀 | Vercel 배포 프로젝트의 traffic control, managed rules, custom rules, 즉시 rollback을 중시하는 프런트엔드·웹 플랫폼 팀 | Google Cloud load balancer 뒤 서비스에서 security policy, preconfigured WAF, DDoS 완화를 함께 보려는 팀 |
| 초기 운영 모드 | security events를 보며 managed rules와 custom rules를 단계적으로 조정 | Count action으로 새 rule을 먼저 관찰한 뒤 block 승격 | configuration rollback 전제를 두고 logging, blocking, challenging을 경로별로 분리 | security policy rule priority와 preconfigured WAF rule tuning으로 noisy signature를 조정 |
| 강한 점 | 글로벌 엣지, rules language, rate limit, 보안 이벤트 분석, managed rules 조합 | AWS 서비스와 직접 연결, Firewall Manager로 계정 단위 확장 가능, count 기반 테스트 흐름 | Vercel 프로젝트와 가까운 배포·롤백 경험, 프런트엔드 플랫폼 owner가 관리하기 쉬운 구조 | Load balancer 기반 보안 정책, preconfigured WAF rules, DDoS와 application attack 대응 결합 |
| 주의할 점 | managed rule을 켰다는 사실보다 path별 예외와 false positive 운영이 더 중요 | WCU, 요청량, 로그, 계정 범위, CloudFront/ALB 구조를 함께 계산해야 함 | Vercel 외부 origin·multi-cloud API까지 한 번에 해결하는 범용 WAF로 착각하면 곤란 | policy 우선순위, rule tuning, load balancer 구조를 모르면 의도와 다른 rule이 먼저 적용될 수 있음 |
| 구매 전 질문 | 현재 DNS/CDN 경로를 바꿀 수 있는가. API와 웹을 같은 정책으로 볼 것인가. | 보호 리소스가 무엇인가. Count에서 Block으로 승격할 기준이 문서화됐는가. | Vercel 프로젝트 안에서 rule owner와 rollback 담당자가 명확한가. | Cloud Armor가 붙는 load balancer 구조와 hybrid/multi-cloud 범위를 어디까지 볼 것인가. |
이 표는 순위를 매기기 위한 표가 아니다. WAF 제품은 네트워크 위치, 로그 위치, 배포 owner, 결제 기준이 다르다. 프런트엔드 플랫폼 팀이 Vercel만 운영한다면 Vercel WAF의 rollback 경험이 큰 이점일 수 있다. AWS 계정과 ALB, API Gateway가 중심인 조직은 AWS WAF와 Firewall Manager가 운영상 자연스럽다. 이미 Cloudflare를 DNS/CDN 앞단으로 쓰는 팀은 Cloudflare WAF와 Rate Limiting, Security Events의 결합을 먼저 검토할 수 있다. Google Cloud load balancer 기반 서비스라면 Cloud Armor 정책 구조가 맞다.
도입 순서: Count, Challenge, Block을 나눠야 한다
- 보호 경로 인벤토리를 만든다. /login, /api/auth, /payment/callback, /admin, /upload, /search, /webhook처럼 실패 비용이 다른 경로를 나누고 owner를 붙인다.
- 기존 장애와 공격 로그를 본다. 404·403 급증, 로그인 실패, SQLi/XSS payload, bot user agent, 특정 ASN·IP 대역, 제휴사 callback 실패를 확인한다.
- 관리형 룰은 count/log로 시작한다. AWS WAF의 Count처럼 새 request handling rule을 먼저 관찰하고, Cloudflare·Cloud Armor·Vercel에서도 로그와 이벤트를 보고 정상 트래픽을 분리한다.
- business false positive를 먼저 잡는다. 결제사, 검색 봇, 사내 테스트, API client, 모바일 앱 구버전 요청이 막히지 않는지 확인한다.
- high confidence rule만 승격한다. SQLi, XSS, credential stuffing, malicious upload처럼 재현성과 영향이 큰 항목부터 challenge 또는 block으로 올린다.
- 롤백 경로를 문서화한다. rule ID, 변경자, 변경 시간, 이전 설정, 복구 기준을 남긴다. Vercel 문서가 rollback을 강조하는 이유도 실제 장애 대응에서 이 절차가 중요하기 때문이다.
- 월간 비용과 오탐 비용을 함께 본다. 요청량, managed rules, rate limit, bot 기능, 로그 저장, 알림 처리 인력, 긴급 롤백 호출을 모두 비용표에 넣는다.
이 순서의 장점은 도입 실패를 작게 만든다는 점이다. WAF는 차단 성공보다 정상 흐름을 망가뜨렸을 때 조직 신뢰를 빨리 잃는다. count 모드에서 business false positive를 충분히 찾고, challenge를 거쳐 block으로 승격하면 “보안팀이 갑자기 서비스를 막았다”는 갈등을 줄일 수 있다.
시나리오 1: 결제 페이지가 WAF 오탐으로 막히는 경우
시나리오 A. 쇼핑몰이 관리형 WAF ruleset을 켠 뒤 결제 완료율이 갑자기 떨어졌다. 보안 대시보드에는 차단 수가 늘어 성공처럼 보였지만, 실제로는 결제사 callback URL에 포함된 파라미터가 generic SQLi signature와 충돌했다. 마케팅팀은 매출 하락을 보고하고, 개발팀은 WAF를 끄자고 요구한다.
이 경우 즉시 해야 할 일은 전체 WAF 비활성화가 아니다. 해당 rule과 path를 찾아 count 또는 challenge로 낮추고, 결제사 IP·header·callback path를 분리해 예외를 좁힌다. 예외는 영구 허용이 아니라 만료일과 보완 통제를 둔다. 결제사 문서와 실제 요청 샘플을 기준으로 정상 패턴을 확인하고, 동일 signature가 다른 path에서 실제 공격을 막고 있는지도 봐야 한다.
도입 전 이 상황을 줄이려면 결제·로그인·관리자·webhook 경로를 첫날부터 별도 rollout group으로 묶어야 한다. rule을 켰다가 전체 사이트를 롤백하는 방식은 너무 거칠다. 경로별 owner와 rollback 권한이 있으면 결제 장애는 줄이고, 검색·관리자·업로드 경로의 보호는 유지할 수 있다.
시나리오 2: API Gateway 앞단에서 봇과 정상 앱을 구분해야 하는 경우
시나리오 B. B2B SaaS가 공개 API에 WAF와 rate limit을 붙이려 한다. 공격 트래픽은 줄이고 싶지만, 정상 고객의 배치 작업과 모바일 앱 동기화도 같은 endpoint를 때린다. 단순히 요청 수로만 block하면 큰 고객의 야간 배치가 막힐 수 있다. 반대로 제한을 느슨하게 두면 credential stuffing과 scraping이 계속 들어온다.
이때는 WAF rule과 제품 요금제가 아니라 identity와 route 설계가 먼저다. 고객별 API key, OAuth client, user agent, path, method, response code, 실패율을 함께 봐야 한다. 로그인 실패나 password reset 같은 민감 경로는 더 낮은 threshold와 challenge가 맞고, bulk export처럼 합법적으로 요청량이 큰 경로는 고객별 계약 한도와 별도 rate limit이 필요하다.
보안팀은 봇을 “나쁜 IP”로만 보면 안 된다. 클라우드 NAT, 모바일 통신망, 고객 프록시 뒤에서 정상 요청과 공격 요청이 섞인다. WAF 도입은 IP 차단 목록을 늘리는 프로젝트가 아니라 application context를 rule 조건에 붙이는 프로젝트다. 그래야 고객 장애 없이 공격 비용을 높일 수 있다.
비용 계산: 요청 수보다 운영 항목이 더 오래 간다
WAF 비용은 제품마다 과금 단위가 다르다. 요청 수, rule 수, managed ruleset, bot·rate limiting 기능, 로그, 계정 단위 관리, enterprise support가 붙을 수 있다. 특정 가격을 이 글에서 단정하면 위험하다. 공식 가격표와 계약서를 직접 확인해야 한다. 다만 공통 계산식은 있다. 월 요청 수에 rule 평가 비용과 추가 기능 비용을 더하고, 로그 저장·분석 비용과 triage 인력 시간을 얹는다.
운영 비용은 도입 2주 뒤부터 보인다. 누군가 매일 security events를 보고 noisy rule을 tuning해야 한다. customer support는 정상 고객 차단 신고를 받아야 한다. SRE는 WAF 변경 후 4xx, 5xx, latency, conversion rate를 봐야 한다. 개발팀은 false positive를 재현해야 한다. 이 인력 시간을 비용표에 넣지 않으면 구매 단계에서는 싸 보이고 운영 단계에서는 비싸진다.
비용 절감의 방향도 있다. 모든 path에 같은 managed rule을 같은 강도로 적용하지 않는다. 정적 asset, 공개 랜딩, 인증, 결제, 관리자, API를 나누고, 높은 위험 경로에는 강한 룰을, 정상 트래픽이 많은 경로에는 관찰과 rate limit을 둔다. 로그도 full body 저장보다 필요한 필드 중심으로 줄여야 개인정보와 저장 비용을 함께 낮춘다.
보안 리스크: WAF가 있다고 취약점이 사라지지는 않는다
WAF 도입이 위험한 순간은 조직이 “앞단에서 막았으니 앱 수정은 나중에”라고 생각할 때다. OWASP CRS는 SQL Injection, Cross Site Scripting, Local File Inclusion 같은 common attack category를 탐지하는 규칙 집합을 제공하지만, 모든 비즈니스 로직 취약점과 권한 오류를 잡는 만능 장치가 아니다. 예를 들어 사용자가 다른 고객의 invoice ID를 조회하는 broken access control은 request payload만 봐서는 놓칠 수 있다.
따라서 WAF는 취약점 관리와 연결되어야 한다. 차단 로그에서 반복되는 공격 경로를 찾으면 애플리케이션 validation, 인증·인가, rate limit, API schema, 파일 업로드 검증을 고쳐야 한다. patch 전까지 WAF가 임시 완화책이 될 수는 있지만, 영구 예외나 영구 차단으로 앱 결함을 덮으면 나중에 rule 우회가 나왔을 때 바로 노출된다.
또 하나의 보안 리스크는 로그다. WAF 이벤트에는 IP, path, query string, header, 때로는 request body 일부가 들어갈 수 있다. 개인정보나 토큰이 섞일 가능성이 있다면 저장 필드, 보존 기간, 접근 권한, 마스킹 정책을 먼저 정해야 한다. 보안 로그를 넓게 모으는 것이 항상 안전한 것은 아니다.
운영 리스크: 오탐 처리와 롤백 권한이 없으면 꺼진다
WAF는 한 번 켜면 끝나는 보안 기능이 아니다. 룰셋은 업데이트되고, 앱 path는 바뀌고, 공격 패턴도 변한다. Cloudflare는 managed rules가 업데이트된다고 설명하고, Cloud Armor는 noisy signature를 tune할 수 있다고 설명한다. 이 말은 운영자가 계속 봐야 한다는 뜻이다. 업데이트된 룰이 정상 요청을 막으면 바로 조정해야 하고, 새 기능 배포 전에는 WAF policy와 충돌하지 않는지 확인해야 한다.
롤백 권한도 현실적인 문제다. 보안팀만 WAF를 바꿀 수 있는데 장애는 새벽에 SRE가 받는다면 복구가 늦다. 반대로 누구나 rule을 끌 수 있으면 보안 통제가 무너진다. 좋은 절충안은 emergency rollback 권한을 제한된 그룹에 주고, 모든 변경을 ticket과 감사 로그에 남기며, 다음 영업일에 보안팀이 사후 검토하는 구조다.
오탐 처리는 고객지원팀과도 연결된다. “접속이 안 된다”는 신고가 들어왔을 때 request ID, 시간대, 고객 계정, 경로, 차단 rule을 찾을 수 있어야 한다. 이 연결이 없으면 고객지원은 개발팀에 떠넘기고, 개발팀은 보안팀에 떠넘기고, 결국 WAF를 꺼서 해결하려 한다.
정책 스켈레톤: WAF rollout을 문서로 먼저 고정한다
아래 YAML은 특정 클라우드 제품 설정 파일이 아니라 운영 정책 스켈레톤이다. 목적은 WAF 도입 전 보안팀, SRE, 서비스 owner가 같은 단어를 쓰게 만드는 것이다. 실제 제품 설정은 공식 문서와 사내 변경관리 절차에 맞춰 따로 작성해야 한다.
# waf-rollout-policy.yaml
# 목적: 웹방화벽 WAF 도입 때 탐지, 차단, 오탐 처리, 롤백 기준을 한 파일로 맞춘다.
# 실제 적용 전 클라우드/호스팅 제품의 공식 문서, 사내 변경관리, 개인정보·보안 정책에 맞춰 조정한다.
version: 1
owner: security-platform
review_cycle: biweekly
scope:
applications:
- public-web
- admin-portal
- api-gateway
environments:
dev: count_only
staging: block_high_confidence
production: phased_rollout
rule_sources:
managed_rules:
enabled: true
references:
- owasp_top_10
- provider_managed_ruleset
- bot_or_rate_limit_rules
custom_rules:
owner_required: true
ticket_required: true
rollback_plan_required: true
rollout:
phase_1_count:
duration_days: 7
action: count_or_log
success_conditions:
- false_positive_rate_below: 0.5_percent
- top_blocked_paths_reviewed: true
- business_owner_approved: true
phase_2_challenge:
paths:
- /login
- /api/auth/*
- /admin/*
action: challenge_or_js_challenge
phase_3_block:
action: block
block_when:
- high_confidence_attack_signature
- credential_stuffing_pattern
- verified_sqli_or_xss_payload
exceptions:
max_days: 14
requires:
- service_owner
- security_reviewer
- compensating_control
- expiration_date
metrics:
daily:
- blocked_requests_by_rule
- false_positive_reports
- top_paths
- top_source_asn_or_country_without_public_label
weekly:
- rule_change_count
- rollback_count
- exception_expired_count
이 문서에서 핵심은 count 단계와 block 단계를 분리한 점이다. WAF 도입 초기에는 차단률이 아니라 false positive 비율, rollback 횟수, owner 지정률을 더 중요하게 봐야 한다. 공격을 잘 막아도 결제와 로그인 흐름을 깨면 도입은 실패다.
점검 스크립트 예시: 룰을 승격할지 되돌릴지 판단한다
다음 Python 예시는 WAF 이벤트를 rule 단위로 묶고, 낮은 신뢰도의 block은 rollback 또는 tuning 후보로, 높은 신뢰도의 count는 challenge 또는 block 승격 후보로 분류한다. 실제 환경에서는 각 제공자의 로그 형식, SIEM, BigQuery, CloudWatch, R2/S3, 데이터 보존 정책에 맞춰 파서를 붙여야 한다.
#!/usr/bin/env python3
# waf_rule_audit_example.py
# 목적: WAF 이벤트를 차단, 관찰, 롤백 후보로 나누는 검토 로직 예시다.
# 실제 운영에서는 Cloudflare/AWS/Vercel/Cloud Armor 로그 형식에 맞는 파서를 붙인다.
from collections import defaultdict
sample_events = [
{"rule": "owasp-sqli", "path": "/api/search", "action": "count", "confidence": "high", "status": 200, "owner": "search"},
{"rule": "xss-generic", "path": "/admin/comment", "action": "block", "confidence": "high", "status": 403, "owner": "admin"},
{"rule": "bot-rate-limit", "path": "/login", "action": "challenge", "confidence": "medium", "status": 403, "owner": "identity"},
{"rule": "generic-rfi", "path": "/campaign/landing", "action": "block", "confidence": "low", "status": 403, "owner": "growth"},
]
by_rule = defaultdict(list)
for event in sample_events:
by_rule[event["rule"]].append(event)
for rule, events in by_rule.items():
low_confidence_blocks = [e for e in events if e["action"] == "block" and e["confidence"] == "low"]
high_confidence_counts = [e for e in events if e["action"] == "count" and e["confidence"] == "high"]
if low_confidence_blocks:
print("ROLLBACK_OR_TUNE", rule, [e["path"] for e in low_confidence_blocks])
elif high_confidence_counts:
print("PROMOTE_TO_CHALLENGE_OR_BLOCK", rule, [e["path"] for e in high_confidence_counts])
else:
print("KEEP_AND_MONITOR", rule, len(events))
완성된 코드를 복사해 바로 운영하라는 뜻이 아니다. 중요한 것은 판단 기준이다. 낮은 신뢰도 block은 고객 장애 후보로 보고, 높은 신뢰도 count는 보안 강화 후보로 본다. 이벤트 수만 세면 “많이 막았다”는 착시가 생긴다. path, owner, business impact, rollback 가능성을 함께 봐야 한다.
변경 요청 템플릿: 개인정보와 로그 필드를 같이 본다
WAF 변경 요청에는 보안 목적만 쓰면 부족하다. 어떤 path를 건드리는지, 처음 action은 무엇인지, 승격 기준은 무엇인지, 어떤 로그를 저장하는지, 개인정보가 섞일 가능성은 없는지를 함께 남겨야 한다.
{
"waf_change_request": {
"service": "public-web",
"owner": "security-platform",
"target_paths": ["/login", "/api/*", "/admin/*"],
"initial_action": "count",
"promotion_rule": "7 days without verified business false positives",
"rollback_trigger": "critical customer flow blocked or error rate spike",
"logs_to_review": ["rule_id", "path", "action", "source_asn", "response_code", "request_id"],
"privacy_note": "Do not store full request bodies with personal data unless approved"
}
}
이런 템플릿을 두면 구매·보안·개발·운영팀의 대화가 빨라진다. “왜 이 rule을 막았나”가 아니라 “처음에는 count였고, 7일간 정상 false positive가 없어서 challenge로 올렸으며, 결제 callback은 예외 만료일을 두었다”처럼 설명할 수 있다.
구매 전 체크리스트
| 영역 | 질문 | 좋은 신호 | 위험 신호 |
|---|---|---|---|
| 비용 | 요청 수, managed rules, bot/rate limit, 로그 저장, support, 계정 단위 관리 비용이 분리되어 보이는가. | 월 사용량 export와 path별 rule hit 비용을 볼 수 있다. | 견적은 싸지만 로그·봇·rate limit·오탐 대응 인력 시간이 빠져 있다. |
| 보안 | SQLi/XSS 같은 OWASP Top 10만이 아니라 인증, 권한, API rate, bot, 파일 업로드 경로를 어떻게 나누는가. | high risk path와 business owner가 명확하다. | 전체 사이트에 같은 룰셋을 한 번에 block으로 켠다. |
| 오탐 | Count/log 모드와 challenge 모드를 거쳐 block으로 승격할 수 있는가. | rule별 false positive 신고와 rollback 이력이 남는다. | 오탐이 생기면 WAF 전체를 끄는 절차밖에 없다. |
| 운영 | SRE가 새벽 장애 때 제한적으로 rollback할 수 있고 사후 감사가 남는가. | ticket, change log, request ID, rule ID가 연결된다. | 보안팀 개인 계정으로만 변경하고 알림만 채팅에 남긴다. |
| 개발 | WAF 로그가 애플리케이션 취약점 수정 backlog와 연결되는가. | 반복 공격 path가 validation, authz, schema 수정으로 이어진다. | WAF가 앱 수정의 영구 대체재가 된다. |
이 체크리스트를 통과하지 못하면 제품을 사지 말라는 뜻은 아니다. 다만 PoC 범위를 줄여야 한다. 결제와 로그인처럼 실패 비용이 큰 경로 하나, 공개 API 하나, 관리자 경로 하나만 골라 count부터 시작하는 편이 낫다. 그 작은 범위에서 false positive와 rollback 흐름을 검증하면 전사 확대가 훨씬 안전해진다.
30일 실행 계획
- 1주차: 외부 노출 경로와 owner를 정리한다. 로그인, 결제, 관리자, 파일 업로드, 공개 API, webhook을 별도 그룹으로 나누고 기존 4xx/5xx, 로그인 실패, bot traffic을 확인한다.
- 2주차: managed rules와 custom rules 후보를 count/log로 넣는다. 고객지원, SRE, 보안팀이 false positive 신고 채널과 request ID 조회 방식을 맞춘다.
- 3주차: high confidence SQLi/XSS, credential stuffing, malicious upload, 과도한 bot 요청부터 challenge 또는 block으로 승격한다. 결제·webhook은 예외와 만료일을 둔다.
- 4주차: rollback 훈련을 한 번 한다. rule 변경, 장애 감지, rollback, 사후 리뷰, 앱 수정 ticket 연결까지 걸리는 시간을 재고 비용표를 업데이트한다.
30일 뒤 성공 기준은 차단 건수만으로 잡지 않는다. 정상 고객 오탐이 줄었는지, 공격 path가 애플리케이션 수정 ticket으로 연결됐는지, rule 변경이 감사 가능하게 남는지, 비용이 예측 가능한지 봐야 한다. 웹방화벽 WAF 도입의 성패는 첫 주 차단률이 아니라 셋째 달에도 꺼지지 않고 운영되는 기준에 달려 있다.
함께 보면 좋은 글
자주 묻는 질문
웹방화벽 WAF 도입은 CDN을 쓰면 자동으로 되는 건가요?
아니다. CDN 앞단에 WAF 기능이 붙어 있어도 어떤 경로에 어떤 rule을 어떤 action으로 적용할지는 별도 설계가 필요하다. DNS/CDN 연결보다 count, challenge, block, 예외, rollback 기준이 더 중요하다.
WAF를 켜면 SQL Injection과 XSS가 모두 해결되나요?
그렇게 보면 위험하다. OWASP CRS나 managed rules는 common attack category를 줄이는 데 쓸 수 있지만, 애플리케이션의 validation, authentication, authorization 수정이 여전히 필요하다. WAF는 패치 전 완화책과 탐지 레이어로 봐야 한다.
처음부터 block 모드로 켜면 안 되나요?
위험 경로가 작고 사전 검증이 충분하면 가능하지만 일반적으로는 count/log가 먼저다. 정상 결제, 검색 봇, 제휴사 webhook, 모바일 앱 요청이 막히는지 확인하지 않고 block을 켜면 장애 대응 비용이 커진다.
Cloudflare WAF, AWS WAF, Vercel WAF, Cloud Armor 중 무엇이 제일 좋나요?
서비스 위치와 운영 owner에 따라 다르다. Cloudflare를 엣지 앞단으로 쓰는지, AWS 리소스를 보호하는지, Vercel 프로젝트 중심인지, Google Cloud load balancer 뒤인지가 먼저다. 제품 순위보다 로그, rollback, 가격, owner 구조가 맞는지를 봐야 한다.
WAF 비용은 무엇으로 계산해야 하나요?
요청 수, rule 평가, managed rules, bot/rate limit 기능, 로그 저장, support, 계정 단위 관리, triage 인력 시간을 함께 계산해야 한다. 가격표의 기본 월 요금만 보면 실제 운영비가 빠진다.
오탐 신고가 들어오면 어떤 순서로 처리해야 하나요?
먼저 request ID와 시간, path, rule ID, 고객 영향 범위를 확인한다. 낮은 신뢰도의 block이면 rule을 count나 challenge로 낮추고, 필요한 경우 좁은 예외를 만료일과 함께 둔다. 이후 앱 수정이나 rule tuning ticket으로 닫아야 한다.
출처와 확인일
- Vercel Docs — Vercel WAF (확인일: 2026-06-25)
- Cloudflare Docs — Cloudflare Web Application Firewall (확인일: 2026-06-25)
- AWS Docs — What is AWS WAF? (확인일: 2026-06-25)
- Google Cloud Docs — Cloud Armor overview (확인일: 2026-06-25)
- OWASP — ModSecurity Core Rule Set (확인일: 2026-06-25)
- OWASP — OWASP Top Ten (확인일: 2026-06-25)
이 글은 공개 공식 문서와 기술 자료를 바탕으로 작성한 일반 정보다. WAF 기능, 가격, 지원 리소스, 룰셋, 로그 정책은 제공자와 계약 조건에 따라 달라질 수 있다. 실제 도입 전에는 각 제공자의 최신 공식 문서, 사내 보안 정책, 법무·개인정보 검토, 운영팀 변경관리 절차를 기준으로 최종 판단해야 한다.





댓글
댓글 쓰기