IP 를 바꿔 가며 오는 매크로같은 상대를 무엇으로 알아보나
한눈에 보기
IP 수백 개로 나눠 보내면 IP로 세는 제한은 보지 못합니다. 같은 프로그램, 같은 세션임을 드러내는 값으로 셉니다.
IP로 세면 왜 놓치나요?
요청 수 제한?은 카운팅 기준? 값마다 따로 셉니다. IP 300개가 3건씩 보내면 어느 카운터도 한도에 못 닿습니다.
카운터는 값마다 하나

도메인 › Security › Security rules › Create rule › Rate limiting rules
| 보내는 쪽 | IP 기준 카운터 | 결과 |
|---|---|---|
| IP 1개가 900건 | 1개가 900 | 한도를 넘어 걸림 |
| IP 300개가 3건씩 | 300개가 각각 3 | 모두 통과 |
IP를 하나씩 막아도 새 IP는 처음 보는 상대가 됩니다.
IP 한도를 무작정 낮추면 매크로보다 정상 사용자가 먼저 걸립니다.
IP 대신 무엇으로 묶나요?
세션 값이나 JA4? 같은 접속 방식 값으로 묶습니다. 값마다 빈틈이 달라 둘 이상 겹쳐 씁니다.
묶는 값과 빈틈
| 묶는 값 | 잘 맞는 곳 | 빈틈 |
|---|---|---|
| 세션 쿠키 | 로그인 뒤 화면 | 지우거나 바꾸면 새 상대 |
| 인증 헤더·토큰 | 로그인한 API | 로그인 전 요청은 못 묶음 |
| JA4 지문 | 쿠키 없는 요청 | 같은 브라우저 사용자와 겹침 |
| 탐지 ID? | 대량 수집(스크래핑) | 계속 다시 계산, 고정 목록 아님 |
쿠키, 헤더, JA4로 세려면 Enterprise Advanced Rate Limiting?이, JA4는 Bot Management도 필요합니다.
값 하나만 믿으면 그 빈틈이 우회로가 됩니다.
새 기준으로 바로 막아도 되나요?
아닙니다. Log?로 먼저 걸어 정상 사용자가 섞였는지 본 뒤 차단으로 바꿉니다.
재는 순서
- Security Analytics?에서 대상 경로의 한산한 시간대 요청 속도를 보고, 한도를 그보다 높게 잡습니다.
- Log로 배포합니다. Log가 없는 플랜은 Managed Challenge?로 시작합니다.
- Events 탭에서 Service를 Rate limiting으로 걸러 걸린 상대를 확인합니다.
- 이상이 없으면 Block으로 바꾸고 계속 지켜봅니다.
카운터 갱신에 몇 초가 걸려 한도를 조금 넘는 요청이 오리진에 닿기도 합니다.
같은 IP를 여럿이 쓰면 어떻게 되나요?
한꺼번에 막힐 수 있습니다. NAT? 뒤 사용자는 공인 IP 하나를 함께 씁니다.
NAT 뒤 사용자 지키기
사무실 공유기나 통신사 CGNAT? 뒤의 여러 사람은 같은 IP로 들어옵니다.
- Business 이상은 «IP with NAT support»(
cf.unique_visitor_id)로 같은 IP 뒤 방문자를 쿠키_cfuvid로 나눠 셉니다. - 쿠키를 지우거나 안 받는 방문자는 한 묶음이라 큰 NAT에서는 한도에 걸릴 수 있습니다.
- 로그인, 결제 같은 중요 경로는 경로나 헤더 기준을 함께 겁니다.
IP와 IP with NAT support는 한 룰에 같이 고를 수 없습니다.
함정: 대역이나 ASN을 통째로 막지 않습니다
IP 대역이나 ASN을 통째로 막으면 같은 통신사나 클라우드의 정상 사용자도 막힙니다.
- ASN?은 관찰하고 범위를 좁히는 데 쓰고, 차단은 지문, 세션, 탐지 ID와 함께 겁니다.
- 막기 전에 같은 조건으로 Security Analytics에서 정상 요청 비율을 셉니다.
한눈에 보기
카운팅 기준?은 플랜마다 다르고, 쿠키나 JA4는 Enterprise Advanced Rate Limiting?에서 씁니다. JA4는 경로와 묶어 커스텀 룰로도 겁니다.
플랜마다 무엇으로 셀 수 있나요?
Free와 Pro는 IP, Business는 NAT 지원 IP까지이고, 나머지는 Enterprise Advanced Rate Limiting에서 씁니다.
플랜별 차이
| 플랜 | 카운팅 기준 | 룰 수 | 세는 기간 |
|---|---|---|---|
| Free | IP | 1 | 10초 |
| Pro | IP | 2 | 1분까지 |
| Business | IP, NAT 지원 IP | 5 | 10분까지 |
| Enterprise | IP, NAT 지원 IP | 계약에 따름 | 65,535초까지 |
| Enterprise + Advanced Rate Limiting | 위에 더해 쿠키·헤더·JA4 등 | 100 | 65,535초까지 |
- JA3/JA4 기준은 Bot Management도 있어야 합니다.
- custom counting expression(셈 조건 따로 두기)은 Business 이상이며, 401, 403이 난 로그인 시도만 셀 때 씁니다.
세션 쿠키로는 어떻게 세나요?
세션 쿠키를 카운팅 기준으로 고르면, IP가 달라도 같은 세션은 한 카운터에 모입니다.
쿠키 기준 예시

| 설정 | 값(예시) |
|---|---|
| 조건 | http.request.uri.path eq "/reserve" and http.request.method eq "POST" |
| 카운팅 기준 | Cookie value of › session_id |
| 한도 | 1분에 10건 |
| 액션 | Log로 시작, 확인 뒤 Managed Challenge 또는 Block |
쿠키 값은 요청이 바꿀 수 있습니다. 문서는 값이 여럿인 요청을 막는 룰과 무거운 작업 전 오리진 검증을 권합니다.
JA4를 룰 조건으로 쓰려면?
이벤트에서 확인한 JA4를 경로 조건과 묶은 커스텀 룰로 겁니다.
JA4 + 경로 조건
(http.request.uri.path eq "/api/reserve" and cf.bot_management.ja4 in {"(확인한 JA4 값)"})
and not cf.bot_management.verified_bot
cf.bot_management.ja4는 Bot Management를 켠 Enterprise에서 씁니다.- 같은 브라우저 사용자와 겹칠 수 있어 경로를 꼭 함께 겁니다.
- 평문 HTTP나 TLS 세션을 재사용한 연결은 JA4가 비기도 합니다.
JA4 하나로만 막지 않습니다(전문가 탭 함정).
대량 수집(스크래핑)은 무엇으로 잡나요?
Bot Management의 스크래핑 탐지 ID? 두 개로 잡습니다. 요청 패턴은 계속 다시 계산합니다.
Scraping detections
| 탐지 ID | 보는 것 |
|---|---|
| 50331648 | ASN별 요청 패턴 |
| 50331649 | JA4 지문별 요청 패턴 |
(any(cf.bot_management.detection_ids[*] in {50331648 50331649})
and not cf.bot_management.verified_bot)도메인 › Security › Security rules › Create rule › Custom rules › 필드 Bot Detection IDs
- 문서는 Managed Challenge를 권하며, 챌린지를 걸 때는 API 경로를 뺍니다.
- 지문이 영구히 찍히지 않고, 의심 행동을 이어 갈 때만 걸립니다.
Enterprise Bot Management 전용입니다.
함정: 쿠키 기준의 빈틈
쿠키 기준으로 셀 때 쿠키 없는 요청은 한 카운터에 모입니다.
기준 쿠키나 헤더가 없는 요청은 «값 없음» 카운터 하나로 세며, 빈 문자열 값과도 따로 셉니다.
- 로그인 전 화면처럼 쿠키 없는 사람이 많으면 이 카운터가 금방 차 정상 사용자가 걸립니다.
- 쿠키 없는 요청은 IP 기준 같은 다른 룰로 셉니다.
- 값이 있을 때만 세려면 셈 조건에 아래를 넣습니다(
x-session은 기준 헤더 이름).
and len(http.request.headers["x-session"]) > 0한눈에 보기
카운터는 데이터센터마다 따로 셉니다. IP를 뺀 기준일수록 이 점이 커지니 흐름(순서)과 기기 신호로도 봅니다.
카운터는 네트워크 전체를 합쳐 세나요?
아닙니다. 요청이 여러 데이터센터로 흩어지면 각 카운터는 그만큼 적게 셉니다.
데이터센터별 카운터
- 모든 룰에 데이터센터 ID(
cf.colo.id)가 숨은 기준으로 들어가며, API로 만들 때는 직접 넣습니다. - 같은 지역에 묶인 데이터센터끼리는 카운터를 함께 씁니다.
cf.colo.id는 예고 없이 바뀌기도 해 조건식에 쓰지 않습니다.
호출 순서로 막을 수 있나요?
로그인 사용자의 API라면 됩니다. 조회 없이 예약 API만 부르는 세션을 순서 강제? 룰로 막습니다.
Sequence mitigation
- 세션 식별자?로 묶은 사용자마다 최근 엔드포인트 10개(지금 것과 이전 9개)를 기억합니다.
- 요청 사이가 10분을 넘으면 새 흐름입니다.
- 긍정 모델은 정한 순서를 벗어난 흐름을, 부정 모델은 알려진 악성 순서를 막습니다.
- 대상 엔드포인트는 Endpoint Management에 있어야 합니다.
IP를 바꿔도 같은 세션이면 한 흐름입니다.
Enterprise 전용 비공개 베타라 계정 팀에 신청합니다.
같은 기기를 이어 볼 수 있나요?
Turnstile?을 붙인 가입, 로그인 폼이면 됩니다. Ephemeral ID?로 IP를 바꾸는 같은 기기를 이어 봅니다.
Ephemeral ID로 묶기
- 풀이마다 만들어 며칠 안에 만료되고, 쿠키나 저장소 없이 동작합니다.
- 값은 Siteverify API 응답의
metadata.ephemeral_id입니다. WAF? 룰 필드가 아니라 같은 ID로 몰리는 요청은 우리 서버가 세어 막습니다. - 계정 안에서만 쓰여 개인 식별에는 못 씁니다.
Enterprise Bot Management의 Enterprise Turnstile 애드온이나 별도 Enterprise Turnstile이 있어야 하며, 계정 팀이 켜 줍니다.
한도 숫자는 어떻게 정하나요?
Enterprise는 Request rate analysis 탭에서 상위 50개 상대의 속도를 IP나 JA4별로 보고 정합니다. 한도는 Log로 먼저 겁니다.
Request rate analysis

도메인 › Security › Analytics › Traffic(대상 경로 필터) › Request rate analysis 탭
| 묶는 기준 | 필요한 것 |
|---|---|
| IP | Enterprise |
| JA3, JA4, IP+JA3, IP+JA4 | Enterprise + Bot Management |
- 기간(1분, 5분, 1시간)을 고르고 가로선을 옮기며 몇 명이 걸릴지 봅니다.
- 공격 기간으로 다시 재서 그때만 걸리는지 확인합니다.
- 화면에서 룰을 만들면 필터, 기준, 한도가 채워져 열리니 Log로 배포합니다.
Enterprise가 아니면 예상 트래픽으로 한도를 잡고 이벤트를 보며 고칩니다.
함정: 지문 하나로 막지 않습니다
JA4 하나로 막으면 같은 브라우저의 정상 사용자도 막힙니다.
JA4는 최신 브라우저 지문 종류를 줄인 값이라 많은 사용자가 같은 값을 냅니다. 묶는 신호는 네 층이며, 아래일수록 좁게 묶지만 쓸 곳이 줄어듭니다.
| 신호 | 특징 |
|---|---|
| IP · ASN | 바뀌거나 너무 넓음 |
| JA4 지문 | 같은 브라우저끼리 겹침 |
| 탐지 ID | 행동을 보고 계속 다시 계산 |
| 세션 · 호출 순서 | 로그인 뒤에만 씀 |
- 한 층만 믿지 말고, 지문은 경로, 탐지 ID, 세션과 겹쳐 겁니다.
- 막기 전에 같은 JA4를 Security Analytics에서 봇 점수 높은(사람 쪽) 요청과 견줍니다.
- JA4 Signals Intelligence(지난 1시간 IP 수 순위 등)는 분석 화면과 Workers에서만 보이고 룰 조건식에는 못 씁니다.
이 문서의 용어
- 세션 식별자
- Session identifier(세션 식별자) · 로그인한 사용자를 가리키는 헤더나 쿠키 값(예: 인증 토큰). API Shield 가 사용자별 흐름을 묶을 때 씁니다.
- 순서 강제
- Sequence mitigation(순서 강제) · 정해진 순서를 벗어난 API 호출 흐름을 막는 API Shield 기능.
- 요청 수 제한
- Rate limiting rule(요청 수 제한 룰) · 정한 기간 동안 같은 값으로 묶인 요청 수를 세어, 한도를 넘으면 막거나 챌린지를 냅니다.
- 카운팅 기준
- Counting characteristics(카운팅 기준) · 요청을 «누구 것»으로 묶어 셀지 정하는 값. 값 조합마다 카운터가 따로 생깁니다.
- 탐지 ID
- Detection ID(탐지 번호) · Cloudflare 가 어떤 방법으로 봇이라 판단했는지 나타내는 번호. Enterprise Bot Management 에서 룰에 씁니다.
- Advanced Rate Limiting
- Advanced Rate Limiting(고급 요청 수 제한) · IP 외의 값(쿠키·헤더·JA4 등)으로 셀 수 있게 하는 Enterprise 기능.
- ASN
- Autonomous System Number(자율 시스템 번호) · 회선·클라우드 사업자를 가리키는 번호. 같은 사업자를 쓰는 다른 사람도 같은 번호입니다.
- CGNAT
- Carrier-Grade NAT(통신사급 NAT) · 통신사 규모로 운영하는 NAT. 그 뒤의 가입자들은 공인 IP 를 나눠 씁니다.
- Ephemeral ID
- Ephemeral ID(임시 기기 ID) · Turnstile 이 풀이마다 만드는 짧은 수명의 기기 식별값. IP 를 바꿔도 같은 기기의 행동을 이어 봅니다.
- JA4
- JA4 fingerprint(TLS 지문) · 클라이언트가 TLS 연결을 시작하는 방식으로 만든 값. 출발지 IP 가 아니라 프로그램의 접속 방식에 따라 정해집니다.
- Log
- Log(기록) 액션 · 조건에 맞는 요청을 기록만 하고 통과시킵니다. Enterprise 플랜에서 고를 수 있습니다.
- Managed Challenge
- Managed Challenge(관리형 챌린지) · 브라우저에 확인 화면을 띄워 사람인지 가립니다. 사람은 대부분 자동으로 통과합니다.
- NAT
- Network Address Translation(주소 변환) · 여러 기기가 공인 IP 하나를 함께 쓰게 하는 방식. 그 뒤의 사용자는 Cloudflare 에서 같은 IP 로 보입니다.
- Security Analytics
- Security Analytics(보안 분석) · Cloudflare 가 막지 않은 요청까지 모든 요청을 보여 주는 화면.
- Turnstile
- Turnstile(사람 확인 위젯) · 가입·로그인 폼 같은 페이지에 넣는 Cloudflare 확인 위젯. 우리 서버는 위젯이 준 토큰을 Siteverify API 로 확인합니다.
- WAF
- Web Application Firewall(웹 애플리케이션 방화벽) · 웹 요청을 룰로 검사해 공격을 막거나 기록하는 Cloudflare 기능.