새 룰은 Log 로 시작합니다지켜본 뒤 Block·Challenge 로 바꾸는 순서
한눈에 보기
새 룰은 바로 막지 않습니다. 먼저 Log? 로 누가 걸리는지 기록만 하고, 지켜본 뒤 Block? 이나 Managed Challenge? 로 바꿉니다.
Log 로 걸면 요청이 막히나요?
막히지 않습니다. Security Events? 에 기록만 하고 통과시킵니다.
Log·Block·챌린지는 어떻게 다른가
| 액션 | 요청은 | 뒤 룰 평가 |
|---|---|---|
| Log? | 기록하고 통과 | 계속 |
| Block? | 거절(기본 403) | 멈춤 |
| Managed Challenge? | 확인 화면 통과 후 진행 | 멈춤 |
Log 는 통과시키므로 같은 요청이 뒤의 요청 수 제한이나 관리형 룰에서 막힐 수는 있습니다.
Log 는 모든 플랜에서 쓸 수 있나요?
Enterprise 에서만 됩니다. 다른 플랜은 Managed Challenge 로 시작해 이벤트를 본 뒤 Block 으로 바꿉니다.
플랜별 첫 단계
| 플랜 | 첫 액션 | 지켜볼 것 |
|---|---|---|
| Enterprise | Log | 걸린 요청 목록 |
| Free · Pro · Business | Managed Challenge | 걸린 요청과 CSR? |
챌린지가 안 맞는 API 경로라면 룰을 걸기 전에 Security Analytics? 에서 같은 조건으로 «걸릴 요청»부터 셉니다.
도메인 › Security › Analytics › Traffic 탭 › Filter

Free 플랜의 Events 탭은 표본 로그(Sampled logs)만 보여 줍니다.
1주 동안 무엇을 보나요?
룰 ID? 로 이벤트를 걸러 «걸리면 안 되는 요청»이 섞였는지 봅니다.
관찰 체크리스트
도메인 › Security › Analytics › Events 탭 › Add filter › Rule ID › Sampled logs 한 줄 펼치기
| 값 | 확인할 점 |
|---|---|
| 출발지 IP·ASN? | 파트너, 사내망, 모니터링인가 |
| 경로 | 로그인 콜백, 결제 알림 같은 정상 기능인가 |
| User-Agent | 우리 앱이나 알려진 도구인가 |
| 국가 | 실제 고객이 있는 지역인가 |
섞였다면 중급의 «정상 요청은 어떻게 빼나요?»로 넘어갑니다.
왜 1주일인가요? Cloudflare 도 새 관리형 룰을 첫 주엔 Log 로 돌립니다. 평일과 주말도 한 번씩 거칩니다.
Block 과 챌린지 중 무엇을 거나요?
웹 페이지에는 Managed Challenge, 앱이나 서버가 부르는 API 에는 Block 을 겁니다. API 는 챌린지를 풀지 못합니다.
어디에 무엇을 거나
| 대상 | 액션 | 이유 |
|---|---|---|
| 로그인·예약 페이지 | Managed Challenge | 사람은 대부분 클릭 없이 통과 |
| 앱·서버 연동 API | Block | 챌린지는 HTML 이라 앱이 처리 못 함 |
Cloudflare 는 대부분의 WAF? 룰에 Managed Challenge 를 권합니다. 페이지 안 AJAX 호출은 챌린지가 실패하므로 Turnstile? 사전 통과를 씁니다.
curl 같은 명령줄 도구와 Selenium 같은 자동화 브라우저는 운영 환경의 챌린지를 풀지 못합니다.
함정: 가장 흔한 실수: Log 로 둔 채 끝내기
Log 로 둔 채 잊으면 룰은 아무것도 막지 않습니다.
- 룰 이름에 관찰을 끝낼 날짜를 적어 둡니다.
- 막은 건수가 0 이면 아직 Log 인지부터 봅니다. «Mitigated by WAF» 수치에는 Log 건이 빠집니다.
한눈에 보기
관찰의 목표는 조건을 좁히는 것입니다. 정상 요청을 and not (...) 으로 빼고, 남은 요청을 다 막아도 될 때 액션만 바꿉니다.
한 룰에 걸린 요청만 어떻게 보나요?
Events 탭을 룰 ID? 하나로 거릅니다. 오탐을 찾을 때는 기간을 짧게 자릅니다.
이벤트 화면 다루기
도메인 › Security › Analytics › Events 탭 › Add filter › Rule ID equals (룰 ID)
- 값에 마우스를 올려 Filter, Exclude 로 바로 좁히거나 뺍니다.
- Events summary 는 Action, Host, Country 별로 건수를 묶습니다.
- 필터를 건 URL 을 보내면 동료도 같은 화면을 엽니다.
필터 값엔 따옴표와 와일드카드를 쓰지 않고, ASN 은 숫자만 넣습니다(예: 64500).
그래프가 최근 며칠을 비워 보이면 기간을 바꾸거나 표, API 로 다시 셉니다. 2026-10-15 랩 존도 그래프는 10-10 이후 비었지만 GraphQL 에는 매일 이벤트가 있었습니다.
정상 요청은 어떻게 빼나요?
룰을 지우지 않고 조건에서 뺍니다. 기준은 요청이 스스로 바꾸기 어려운 값입니다.
좁히는 순서 — and not (...)
(http.host eq "www.example.com" and starts_with(http.request.uri.path, "/login"))
and not (ip.src in $monitoring_ips or cf.client.bot)- 호스트와 경로로 범위부터 줄입니다. 존 전체 룰은 이미지 서버나 웹훅 주소까지 건드립니다.
- 고정 출발지의 연동과 모니터링은 IP 목록으로 뺍니다(
$monitoring_ips는 예시). - 검색 엔진 같은 좋은 봇은
cf.client.bot으로 뺍니다.

User-Agent 처럼 요청이 밝히는 값은 바꿔 보내기 쉬워 기준으로 맞지 않습니다.
잘 도는 룰의 조건은 넓히지 않습니다. 넓혀야 하면 새 룰로 Log 부터 다시 합니다.
액션은 어디서 바꾸나요?
Security rules 에서 룰을 열고 Choose action 만 바꿔 저장합니다. 조건식은 그대로 둡니다.
화면 경로와 확인할 것
도메인 › Security › Security rules › 룰 이름 › Choose action › 저장

- Block 은 Pro 이상에서 응답 형식과 상태 코드(400~499, 기본 403)를 바꿀 수 있습니다.
- 식 오류나 플랜에 없는 기능이면 대시보드가 저장을 막습니다.
- 변경 기록은 계정 Audit logs 에 남습니다.
바꾼 뒤 같은 룰 ID 로 Log 대신 Block(또는 챌린지)이 찍히는지 보고, 1주 더 지켜봅니다.
챌린지로 시작했다면 무엇을 보나요?
챌린지 통과율(CSR?)을 봅니다. 높으면 실제 방문자가 걸린 것이니 조건부터 좁힙니다.
CSR 읽는 법
CSR = 풀린 챌린지 수 ÷ 낸 챌린지 수도메인 › Security › Security rules › 해당 룰의 CSR
| CSR | 뜻 | 다음 할 일 |
|---|---|---|
| 높음 | 실제 방문자가 많이 풀었다 | 조건 좁히기 |
| 낮음 | 대부분 풀지 않고 떠났다 | 자동화를 거르는 신호, Block 검토 |
자동화는 대개 챌린지를 보자마자 떠나므로 실패 건수가 큰 것은 이상하지 않습니다.
Events 탭의 challengeSolved 는 앞서 낸 챌린지를 풀었다는 기록이라 룰 조건과 달라 보여도 정상입니다.
함정: 액션과 조건은 따로 바꿉니다
액션과 조건을 한 번에 바꾸면 1주 동안 본 결과가 쓸모없어집니다.
1주 동안 본 것은 «그 조건»의 요청입니다. 조건까지 넓히면 아무도 본 적 없는 요청이 바로 막힙니다.
- 넓힐 때는 새 룰을 Log(다른 플랜은 Managed Challenge)로 다시 시작합니다.
- 좁히는 수정(예외 추가)은 관찰 중인 룰에 바로 해도 됩니다.
한눈에 보기
API 로 바꿀 때는 PATCH 본문에 룰 정의 전체를 넣고, 바꾸기 전 룰셋 버전? 번호를 적어 둡니다. 이벤트 화면이 표본?이라는 점도 계산에 넣습니다.
API 로 액션 하나만 바꾸려면?
Rulesets API? 의 PATCH 를 씁니다. 바꾸지 않는 필드도 본문에 넣어야 남습니다.
룰 하나 고치기 — 본문은 «정의 전체»
GET /zones/{zone_id}/rulesets/phases/http_request_firewall_custom/entrypoint응답의 id 가 룰셋 ID, rules 에 각 룰의 ID 와 정의가 있습니다.
PATCH /zones/{zone_id}/rulesets/{ruleset_id}/rules/{rule_id}
{"action": "block", "expression": "(지금 식)", "description": "(지금 설명)", "enabled": true}- 호출마다 룰셋의 새 버전이 생깁니다.
같은 룰셋을 동시에 여러 요청으로 고치면 속도 제한에 걸릴 수 있어, 여러 룰은 룰셋 전체를 한 번에 갱신합니다.
되돌리려면 무엇이 필요한가요?
바꾸기 전의 룰셋 버전? 번호입니다. 번호로 그때의 룰 목록을 다시 꺼냅니다.
버전 조회와 복구
GET /zones/{zone_id}/rulesets/phases/http_request_firewall_custom/entrypoint/versions
GET /zones/{zone_id}/rulesets/phases/http_request_firewall_custom/entrypoint/versions/{version}- 버전 목록에서 바꾸기 전 번호를 찾습니다(목록에는 룰이 없음).
- 그 번호로 조회해 그 버전의 룰 정의를 꺼냅니다.
- 꺼낸 정의로 룰셋을 갱신(PUT)합니다. 먼저
dry_run=true로 검사할 수 있습니다.
PUT 은 본문에 없는 룰을 지우니 지금 버전도 먼저 따로 저장해 둡니다.
이벤트 화면의 건수는 정확한가요?
추정값입니다. 요청이 많으면 일부만 골라 보여 주는 표본?이라 드문 오탐은 안 보일 수 있습니다.
표본 추출과 보관 기간
- 요청이 많을수록 더 적은 비율만 봅니다(적응형 표본 추출).
- 기간을 좁히면 표본이 줄거나 사라지니 오탐은 하루나 한 시간 단위로 찾습니다.
- 목록은 한 번에 500건까지 내보냅니다(Business 이상).
| 화면 | 보관 기간 | 한 번에 조회 |
|---|---|---|
| Security Events | 31일 | 30일 (Enterprise 31일) |
| Security Analytics | 31일 (Enterprise 90일) | 30일 (Business·Enterprise 31일) |
전체 기록은 Logpush? 나 유료 Log Explorer 로 받습니다. Logpush 는 2026-09-30 부터 모든 플랜에서 되며 데이터셋은 제품마다 다릅니다.
dry run 은 무엇을 검사하나요?
설정만 검사하고 바꾸지 않습니다. dry run?(dry_run=true)은 «트래픽에 무엇이 걸릴지»를 보지 않습니다.
dry run 이 검사하는 것
PATCH /zones/{zone_id}/rulesets/{ruleset_id}/rules/{rule_id}?dry_run=true- 식 문법과 필드·함수·연산자 사용 가능 여부
- 액션과 파라미터, 단계(phase) 호환
- 권한, 플랜 기능, 룰 개수 한도
- 룰이 참조하는 자원(목록 등)
만들기, 고치기, 지우기에 모두 붙고, 성공하면 평소 200 인 요청이 result: null 을 줍니다.
통과가 «정상 사용자를 막지 않는다»는 뜻은 아니며, 그 판단은 Log 관찰이 맡습니다.
함정: PUT 과 PATCH 를 헷갈리면 룰이 사라집니다
룰 하나를 고치려고 PUT 을 쓰면 본문에 없는 나머지 룰이 전부 사라집니다.
PUT(룰셋 갱신)은 본문의 룰 목록으로 룰셋 전체를 바꿔, 한 룰만 담으면 나머지가 사라집니다.
- 룰 하나는 PATCH, 여러 룰을 한꺼번에 바꿀 때만 PUT 에 전체 목록을 담습니다.
- 어느 쪽이든
dry_run=true검사와 버전 번호 기록을 먼저 합니다.
이 문서의 용어
- 룰 ID
- Rule ID(룰 식별자) · 룰마다 붙는 고유 값. 이벤트 화면에서 이 값으로 한 룰의 기록만 골라 봅니다.
- 룰셋 버전
- Ruleset version(룰셋 버전) · 룰셋을 고칠 때마다 1씩 오르는 번호. 지난 번호로 그때의 룰 목록을 다시 조회합니다.
- 표본
- Sampling(표본 추출) · 요청이 많을 때 일부만 골라 보여 주고 전체 건수는 추정하는 방식. 드문 요청은 목록에 안 보일 수 있습니다.
- ASN
- Autonomous System Number(자율 시스템 번호) · 회선·클라우드 사업자를 가리키는 번호. 같은 사업자를 쓰는 다른 사람도 같은 번호입니다.
- Block
- Block(차단) 액션 · 요청을 거절합니다. 대부분의 보안 기능은 403, 요청 수 제한 룰은 429 를 돌려줍니다.
- CSR
- Challenge Solve Rate(챌린지 통과율) · 낸 챌린지 가운데 풀린 비율. 높을수록 실제 방문자가 많이 걸렸다는 뜻입니다.
- dry run
- Dry run(시험 실행) · API 요청에 `dry_run=true` 를 붙여 검사만 하고 실제로는 바꾸지 않는 방식.
- Log
- Log(기록) 액션 · 조건에 맞는 요청을 기록만 하고 그대로 통과시킵니다. Enterprise 플랜에서만 고를 수 있습니다.
- Logpush
- Logpush(로그 내보내기) · Cloudflare 로그를 우리 저장소나 SIEM 으로 보내는 기능.
- Managed Challenge
- Managed Challenge(관리형 챌린지) · 브라우저에 확인 화면을 띄워 사람인지 가립니다. 사람은 대부분 클릭 없이 자동으로 통과합니다.
- Rulesets API
- Rulesets API(룰셋 API) · 룰을 코드로 읽고 바꾸는 Cloudflare API. 존의 커스텀 룰은 `http_request_firewall_custom` 단계의 룰셋에 들어 있습니다.
- Security Analytics
- Security Analytics(보안 분석) · Cloudflare 가 손대지 않은 요청까지 모든 요청을 보여 주는 화면. 룰을 걸기 전에 «걸릴 요청»을 미리 봅니다.
- Security Events
- Security Events(보안 이벤트) · Cloudflare 보안 기능이 막거나 기록한 요청만 모아 보는 화면. Security › Analytics 의 Events 탭에 있습니다.
- Turnstile
- Turnstile(사람 확인 위젯) · 페이지에 넣는 Cloudflare 확인 위젯. 사전 통과(Pre-clearance)를 켜면 통과한 방문자에게 `cf_clearance` 쿠키를 주어, 같은 존의 API 호출이 챌린지 없이 지나갑니다.
- WAF
- Web Application Firewall(웹 애플리케이션 방화벽) · 웹 요청을 룰로 검사해 공격을 막거나 기록하는 Cloudflare 기능.