봇 점수 1 차단막으면 안 되는 점수 1부터 뺍니다
한눈에 보기
점수 1은 거의 확실한 자동화일 뿐 나쁜 요청이라는 뜻이 아닙니다. 검색 엔진과 파트너 서버도 받으니 먼저 빼고 막습니다.
점수 1은 무슨 뜻인가요?
«거의 확실한 자동화»입니다. 봇 점수?는 클수록 사람에 가깝습니다.
점수 구간

도메인 › Security › Analytics › Traffic › Bot analysis
| 점수 | 화면 표기 | 뜻 |
|---|---|---|
| 0 | Not computed | 매기지 않음 |
| 1 | Automated | 거의 확실한 자동화 |
| 2~29 | Likely automated | 자동화 가능성 높음 |
| 30~99 | Likely human | 사람 가능성 높음 |
점수 1은 주로 휴리스틱에서 나오며, 누가 보냈는지는 알려 주지 않습니다.
분포는 Pro 이상에서 보이고, 세부 점수 룰은 Enterprise Bot Management에서 씁니다.
막으면 안 되는 점수 1도 있나요?
있습니다. 검색 엔진, 모니터링, 파트너 연동, 사내 자동화도 받습니다.
가르는 값
| 누구 | 무엇으로 가르나 |
|---|---|
| 검색·SEO 렌더링·모니터링 | 검증 봇? 표시 |
| 파트너 서버(출발지 고정) | IP 목록? |
| 사내 자동화 | 사내 IP 목록, IP가 자주 바뀌면 mTLS? |
| 모바일 앱 | 점수 1은 드묾, 필요하면 JWT?나 mTLS |
예외는 오른쪽 열처럼 요청이 바꿀 수 없는 값으로만 만듭니다.
어떤 순서로 켜나요?
Log로 지켜본 뒤 Block으로 바꿉니다.
세 단계
- 봇 분석 화면에서 점수 1의 호스트, 경로, 출발지 상위를 봅니다.
- 예외를 넣은 룰을 Log로 1주 두고, 룰 ID로 걸러 걸리면 안 되는 요청을 찾습니다.
- 이상이 없으면 Block으로 바꾸고 1주 더 지켜봅니다.
Log는 Enterprise 전용이라, 다른 플랜은 짧게 Block으로 올려 이벤트를 바로 봅니다.
API에도 챌린지를 걸면 되나요?
안 됩니다. 앱과 서버는 챌린지를 풀지 못해 API는 Log 다음 바로 Block입니다.
맞는 자리, 아닌 자리
- 맞는 자리: 사람이 브라우저로 여는 로그인, 예약 화면.
- 아닌 자리: 앱이나 서버가 부르는 API.
앱은 mTLS?나 JWT?로 증명하게 합니다.
함정: 흔한 실수: User-Agent로 빼기
User-Agent로 빼면 흉내 낸 봇도 통과합니다.
User-Agent?는 누구나 바꾸는 이름표입니다. 대신 아래 값으로 뺍니다.
- 검증 봇 여부
- IP 목록
- 클라이언트 인증서(mTLS)
- 서명된 토큰(JWT)
파트너용 헤더 값도 새면 누구나 씁니다. 꼭 쓰려면 IP 목록과 함께 겁니다.
한눈에 보기
예외는 차단 룰 안에 and not (예외)로 넣습니다. 앞에 Skip? 룰을 두면 뒤 차단 룰까지 모두 건너뜁니다.
예외로 넣을 조건은 무엇인가요?
다섯 가지를 and not (...) 안에 넣습니다.
예외 조건

도메인 › Security › Settings › 필터 Bot traffic
| 예외 | 조건식 | 메모 |
|---|---|---|
| 검증 봇 | cf.bot_management.verified_bot | «Definitely Bots» 템플릿도 기본 제외 |
| 정적 리소스 | cf.bot_management.static_resource | 이미지·CSS·JS |
| 파트너 서버 | ip.src in $partner_ips | 목록만 고치면 룰은 그대로 |
| 서비스 ASN? | ip.src.asnum eq 64500 | 다른 고객도 같은 번호, 호스트나 경로와 함께 |
| 내부 경로 | starts_with(http.request.uri.path, "/internal/") | 경로로 한정 |
이름, 번호, 경로는 예시입니다. ip.geoip.asnum은 사용 중단 예정이라 ip.src.asnum을 씁니다.
조건식은 어떻게 쓰나요?
점수 조건과 예외를 따로 괄호로 묶습니다. 빠지면 예외가 일부 조건에만 붙습니다.
괄호가 핵심
(http.host eq "api.example.com" and cf.bot_management.score eq 1)
and not (cf.bot_management.verified_bot
or cf.bot_management.static_resource
or ip.src in $partner_ips)- 연산 순서가
not→and→xor→or라A and not B or C는 C만 맞아도 걸립니다. - 호스트를 한정해 이미지 서버나 웹훅 주소가 걸리지 않게 합니다.

괄호는 Edit expression과 API에서만 쓰고 칸 빌더에는 없습니다.
잘 도는 기존 룰은 넓히지 말고 새 룰로 만듭니다. 예외 추가처럼 좁히기는 바로 해도 됩니다.
IP 목록은 어떻게 만드나요?
계정의 Lists 화면에서 만듭니다. 여러 존이 같이 쓰고 IP가 바뀌면 목록만 고칩니다.
만들기와 제한
계정 › Manage account › Configurations › Lists › Create list (IP)
- 이름은 소문자, 숫자, 밑줄로 50자 이하이며, 만든 뒤 이름과 종류는 못 바꿉니다.
- 룰에서는
ip.src in $목록이름으로 씁니다.
| 플랜 | 목록 수 | 전체 항목 수 |
|---|---|---|
| Free | 1 | 10,000 |
| Pro · Business | 10 | 10,000 |
| Enterprise | 1,000 | 500,000 |
룰이 참조 중인 목록은 지울 수 없습니다.
지켜볼 때는 무엇을 보나요?
룰 ID로 이벤트를 걸러 출발지, 경로, User-Agent 상위를 봅니다.
이벤트 확인

도메인 › Security › Analytics › Events · 필터 «Rule ID»
- 상위에 파트너나 사내 IP가 있으면 예외 목록에 넣습니다.
- 검증 봇이 보이면
verified_bot예외가 빠졌는지 확인합니다. - 화면은 30일까지라 더 길게는 Logpush로 내보냅니다.
함정: Skip은 «일부만» 건너뛰지 못합니다
앞의 Skip 룰로 빼면 뒤의 다른 커스텀 룰까지 전부 건너뜁니다.
점수 1 룰만 빼려 해도 뒤의 다른 차단 룰(폐기한 API 차단, 국가 제한 등)까지 피합니다.
- 예외는 차단 룰 안에
and not (...)으로 넣습니다. - Skip이 꼭 필요하면 호스트, 경로, IP 목록으로 아주 좁히고, 빠지는 룰을 순서로 확인합니다.
한눈에 보기
점수는 이유를 알려 주지 않습니다. 그래서 흉내 내기 어려운 신호로 판단하고, 쉬운 신호 하나로는 단정하지 않습니다.
점수는 무엇으로 정해지나요?
휴리스틱, 머신러닝, JavaScript 탐지를 합칩니다. 점수 1은 주로 휴리스틱이 주고, 어느 것인지는 탐지 ID?로 봅니다.
세 엔진
- 휴리스틱: 알려진 자동화 지문이면 1.
- 머신러닝: 대부분의 요청에 2~99.
- JavaScript 탐지: 헤드리스 브라우저 등.
cf.bot_management.detection_ids로 특정 휴리스틱만 막거나 뺍니다. 아래는 문서 예시 번호라 실제 번호는 분석 화면에서 찾습니다.
any(cf.bot_management.detection_ids[*] eq 33554817)사람인지 어떻게 가리나요? (JA4)
UA가 같아도 브라우저와 스크립트는 TLS 접속 방식이 다릅니다. 점수 1의 JA4?를 점수 30 이상(사람 쪽)과 견줍니다.
JA4 비교
- 점수 30 이상에서 흔한 JA4를 «사람 지문»으로 잡습니다.
- 점수 1이 사람 지문과 거의 겹치지 않으면 사람이 아닐 가능성이 높습니다.
- 겹치면 브라우저 자동화일 수 있으니 출발지, 시간대, 경로를 더 봅니다.
«JA4 몇 종 이상이면 봇» 같은 고정 기준은 무리마다 틀립니다. 늘 같은 기간의 사람 쪽과 비교합니다.
차단 영향은 어떻게 재나요?
두 질문을 따로 답합니다. 고객 피해는 «사람이 막히나» 쪽입니다.
두 질문을 따로
| 질문 | 보는 것 |
|---|---|
| 막힌 무리 중 사람 비율 | 막힌 요청의 JA4, 탐지 ID, 출발지 소유를 사람 쪽과 비교 |
| 사람 중 막히는 비율 | 사람 지문(점수 30 이상에서 흔한 JA4)이 차단되는 비율 |
- 막힌 무리가 대부분 봇이어도 사람 쪽 차단률은 0이 아닐 수 있습니다.
- 막힌 뒤 로그인, 예약이 없는 것은 막힌 결과일 뿐 근거가 아닙니다.
앱과 연동은 무엇으로 예외를 주나요?
증명으로 줍니다. 고정 IP는 IP 목록, 바뀌는 IP는 mTLS?, 앱은 JWT? 검증입니다.
증명 방식 고르기
| 상황 | 방식 | 조건에서 쓰는 값 |
|---|---|---|
| 출발지가 고정된 서버 | IP 목록 | ip.src in $목록 |
| 출발지가 바뀌는 사내 도구·장비 | mTLS | cf.tls_client_auth.cert_verified |
| 모바일·웹 앱 API | JWT 검증(API Shield) | 토큰 검증 결과 필드 |
- mTLS는 인증서 배포 운영이 필요해 대상이 적고 오래 쓰는 연동에 맞습니다.
- JWT는 기존 로그인 토큰의 서명을 검증하니 추가 배포가 적습니다.
함정: 높은 점수 = 사람, 낮은 점수 = 악성이 아닙니다
점수 30 이상이면 사람이라는 단정은 틀립니다.
브라우저 자동화나 가정용 회선을 쓰는 무리는 점수가 높을 수 있고, 점수 1이 전부 악성도 아닙니다.
아래는 흉내 낼 수 있어 근거가 아닙니다.
- IP 하나당 요청이 적다
- 국내 IP 다
- 브라우저 UA 다
판단은 흉내 내기 어려운 신호 두 개 이상(JA4 비교, 탐지 ID, 출발지 소유)으로 합니다.
이 문서의 용어
- 검증 봇
- Verified Bot · Cloudflare 가 역방향 DNS·ASN 등으로 출처를 확인한 좋은 봇. 검색 엔진·모니터링 서비스가 여기에 듭니다.
- 봇 점수
- Bot Score · 요청마다 매기는 1~99 점수. 1은 거의 확실한 자동화, 30 이상은 사람일 가능성이 높다는 뜻입니다. 세부 점수는 Enterprise Bot Management 에서 룰에 쓸 수 있습니다.
- 탐지 ID
- Detection ID · 어떤 휴리스틱으로 봇이라 봤는지 나타내는 번호. Enterprise Bot Management 에서 룰·분석에 씁니다.
- ASN
- Autonomous System Number(자율 시스템 번호) · 인터넷 회선·클라우드 사업자를 가리키는 번호. 같은 클라우드의 다른 고객도 같은 번호를 씁니다.
- IP 목록
- IP List · 계정 단위로 관리하는 IP 모음. 룰을 고치지 않고 목록만 바꿔 예외를 갱신합니다.
- JA4
- JA4 fingerprint(지문) · TLS 접속 방식으로 클라이언트 종류를 알아보는 값. 이름표(User-Agent)가 같아도 실제 브라우저와 스크립트가 갈립니다.
- JWT
- JSON Web Token · 서명된 토큰. 서명을 검증하면 우리 앱이 보낸 요청인지 가릴 수 있습니다.
- mTLS
- mutual TLS(상호 TLS) · 클라이언트도 인증서로 자신을 증명하는 연결. 인증서가 없는 요청과 확실히 갈립니다.
- Skip
- Skip(건너뛰기) · 조건에 맞는 요청이 뒤의 커스텀 룰이나 지정한 기능을 건너뛰게 하는 액션.
- User-Agent
- User-Agent(사용자 에이전트) · 요청이 스스로 밝히는 클라이언트 이름. 누구나 마음대로 바꿀 수 있습니다.