+ 作るログイン
図を読み込んでいます…
1 / 14
Cloudflare のすべて ― 1機能ずつ、仕組みと存在理由から / 全35本

Cloudflare 06:レート制限 ― 回数を数えて、多すぎたら止める

発行
アニメモ公式
版
第1版
改訂
コマ
全14

1本ずつなら正しいリクエストでも、何万回も来れば攻撃になります。ログインの総当たりを例に、レート制限の4つの決めごと(どのリクエストを・誰ごとに・何秒で何回まで・超えたらどれだけ止めるか)を時間の軸で説明し、導入、Terraform と Workers での書き方、プランの違い、共有 IP や拠点ごとの数え方といった落とし穴まで扱います。

1回ずつなら正しいリクエストが、何万回も来る

ログイン画面を思い浮かべてください。ID とパスワードを入れて送信する、ごく普通の画面です。

攻撃者は、この画面にパスワードを次々に変えて送りつけます。123456、password、qwerty…。よく使われるパスワードの一覧を上から順に試していけば、弱いパスワードの人はいつか当たります。これが総当たり攻撃(ブルートフォース)です。よそのサイトから漏れた ID とパスワードの組を試す「リスト型攻撃」もあります。

困るのは、この1本1本のリクエストが、中身としては完全に正しいことです。形は普通のログインで、SQL も混ざっていません。05号の WAF で中身を見ても、止める理由がありません。04号の DDoS 対策から見ても、1秒に数十回程度では「洪水」とは言えません。

悪いのは中身ではなく、回数です。人間は1秒に何十回もログインを試しません。

同じ形の困りごとは、ほかにもあります。

場面困ること
API1人の利用者が使いすぎて、他の人の分まで食べてしまう
重いページ検索や集計のページを連打されて、サーバーが疲れる
スクレイピング全ページを短時間で抜き取られる
会員登録・問い合わせ同じ相手から大量に送られる

※この号の内容は 2026年9月時点の情報です。料金・本数の上限・選べる値は変わることがあるので、導入のときは必ず公式のドキュメントで確かめてください。

  • Cloudflare のすべて 06 ― レート制限
  • 1 / 14
  • 1回ずつなら正しいリクエストが、何万回も来る
  • POST /login
  • 攻撃者
  • オリジン
  • 1秒に何十回も
  • あなたのサーバー
  • POST /login user=tanaka pass=123456 → 401
  • POST /login user=tanaka pass=password → 401
  • POST /login user=tanaka pass=qwerty → 401 …これが1秒に何十回
  • パスワードの総当たりは、1本1本を見ても悪いところがない。

レート制限:同じ相手の回数を数え、多すぎたら止める

そこで使うのがレート制限(Rate Limiting)です。「レート」は、一定の時間あたりの回数のことです。

レート制限は、同じ相手から来たリクエストの回数を数え、決めた上限を超えたら止める仕組みです。中身は見ません。回数だけを見ます。

Cloudflare のレート制限ルールは、次の4つの決めごとでできています。

決めごと例
どのリクエストを数えるか/login への POST
誰ごとに数えるか送り元の IP アドレスごと
何秒のあいだに何回までか60秒で5回まで
超えたらどうするか・どれだけ続けるかBlock し、10分間止め続ける

このあとのページで、1つずつ見ていきます。

エッジの中での置き場所は、05号で見たとおり、WAF のカスタムルールの後ろ、マネージドルールの前です。管理画面でも、WAF と同じ場所に並んでいます。

レート制限はアプリの中でも作れます。ただ、エッジで止めれば、上限を超えたリクエストはオリジンまで届きません。サーバーの負担を減らすという意味でも、前に置く価値があります。

  • Cloudflare のすべて 06 ― レート制限
  • 2 / 14
  • レート制限:同じ相手の回数を数え、多すぎたら止める
  • Cloudflare のエッジ(世界中の拠点)
  • WAF カスタムルール(05)
  • レート制限(この号)
  • 攻撃者
  • WAF マネージドルール(05)
  • オリジン
  • 1秒に何十回も
  • あなたのサーバー
  • POST /login
  • ルール=「どのリクエストを」「誰ごとに」「何秒で何回まで」「超えたらどうする」
  • ログインの総当たり・API の使いすぎ・重いページの連打・スクレイピングに効く
  • 中身ではなく「回数」を見る。WAF の隣にいる、もう1つの門番。

① どのリクエストを数えるか

最初に決めるのは、どのリクエストを数えるかです。図の下にあるのは、「パスが /login で、メソッドが POST」のリクエストだけを数える条件です。

書き方は、05号の WAF のカスタムルールと同じルールの言葉です。項目・比べ方・値を and や or でつなぎます。

ここで大事なのは、サイト全体を1つのルールで数えないことです。1つのページを開くと、ブラウザは HTML のほかに、画像・CSS・JavaScript・フォントなどを何十本も取りに行きます。全部を数えると、普通の人がページを数枚めくっただけで上限に届いてしまいます。

守りたい入口ごとに、狙いを絞ってルールを作ります。

入口数える条件の例
ログイン/login への POST
会員登録/signup への POST
検索/search で始まるパス
API/api/ で始まるパス

上位のプランでは、リクエストだけでなく応答を見て数えることもできます。たとえば「オリジンが 401(認証失敗)を返したものだけを数える」とすれば、正しくログインできた人の回数は数えずに、失敗の多い相手だけを止められます。

  • Cloudflare のすべて 06 ― レート制限
  • 3 / 14
  • ① どのリクエストを数えるか
  • Cloudflare のエッジ(世界中の拠点)
  • WAF カスタムルール(05)
  • レート制限(この号)
  • 攻撃者
  • WAF マネージドルール(05)
  • オリジン
  • 1秒に何十回も
  • あなたのサーバー
  • POST /login
  • http.request.uri.path eq "/login" and http.request.method eq "POST"
  • WAF(05号)と同じ式の言葉で書く。画像や CSS まで数えると、普通の閲覧でも上限に届く
  • 全部を数えない。守りたい入口だけに絞る。

② 誰ごとに数えるか(特徴)

次に決めるのは、誰ごとに数えるかです。Cloudflare はこれを特徴(characteristics)と呼びます。

いちばん基本の特徴は、送り元の IP アドレスです。図のように、IP ごとに別々の数え箱を持ち、それぞれの箱の回数が上限を超えたら、その IP だけを止めます。他の IP の利用者には影響しません。

ただし、IP には弱点があります。

弱点中身
大勢が同じ IP会社の出口、学校、携帯電話の回線などでは、たくさんの人が1つの IP を共有していることがある
IP を変えられる攻撃者はたくさんの IP を持つボットネットやプロキシを使える

1つ目は、止めすぎの原因になります。上限を厳しくしすぎると、同じ会社の人がまとめて締め出されます。2つ目は、止まらない原因になります。攻撃者が1つの IP あたりの回数を減らし、IP を増やせば、上限に届きません。

そこで上位のプランでは、IP 以外の特徴でも数えられます。たとえば、API キーのヘッダー、ログインしている利用者の Cookie、国などです。API なら、IP ではなく API キーごとに数えるほうが、利用者1人あたりの使いすぎを正しく抑えられます。

  • Cloudflare のすべて 06 ― レート制限
  • 4 / 14
  • ② 誰ごとに数えるか(特徴)
  • IP 203.0.113.5
  • 12回
  • IP 198.51.100.7
  • 2回
  • IP 192.0.2.44
  • 1回
  • 上限5回
  • 上位プランでは、ヘッダー・Cookie・API キー・国などでも数えられる
  • 同じ IP の裏に大勢いる(会社・携帯回線)ことがある。上限は余裕を持って
  • ふつうは送り元の IP ごと。相手ごとに別々の数え箱を持つ。

③ 何秒のあいだに何回まで(期間と上限)

3つ目は、期間と上限です。「10秒で5回まで」「60秒で100回まで」のように決めます。

図は、時間の軸の上に、同じ IP から来たログインのリクエストを縦の刻みで並べたものです。1秒に1回のペースで送られてきています。青い枠が「10秒の窓」です。この窓の中に、10本の刻みが入っています。上限が5回なら、6回目からルールの動作がかかります。赤くなった刻みがそれです。

期間と上限の決め方の目安は、「普通の人が絶対に届かない回数」です。ログインなら、人間が1分に何回も打ち間違えることはあまりありません。一方、API なら、アプリが1画面を表示するのに何本も呼ぶことがあるので、もっと大きな上限が必要です。

最初から厳しい上限にすると、思わぬ場面で正しい利用者を止めてしまいます。はじめはゆるく設定し、分析の画面で実際の回数を見ながら締めていくのが安全です。

なお、期間として選べる値は決まっていて、プランによって選べる範囲が違います。Free プランでは10秒に固定です。

  • Cloudflare のすべて 06 ― レート制限
  • 5 / 14
  • ③ 何秒のあいだに何回まで(期間と上限)
  • 10秒で10回 → 上限5回を超えた
  • 6回目から、ルールの動作(Block など)がかかる
  • 10秒の窓
  • 0秒
  • 10秒
  • 30秒
  • 60秒
  • 90秒
  • 例:10秒で5回まで。窓の中の回数が上限を超えたら発動。

④ 超えたら、しばらく止める(止める時間)

最後は、上限を超えた相手を、どれだけの時間止め続けるかです。Cloudflare はこれを mitigation timeout(緩和の継続時間)と呼びます。

図の赤い帯が、その時間です。6回目で上限を超えた瞬間から、この例では60秒間、その IP からの /login への POST は、何を送っても止められます。帯の間の刻みは、すべて赤です。

この時間の長さは、両方向に悩ましいものです。

長さ良いところ困るところ
短い(10秒など)間違えて引っかかった本人も、すぐ戻れる攻撃者は少し待って再開するだけ。止める力が弱い
長い(10分・1時間など)攻撃者の試行回数を大きく減らせる共有 IP の他の人まで長く締め出される

ログインの総当たりなら、数分〜10分程度が1つの目安になります。1回の総当たりで試せる回数を、大きく減らせるからです。

一方で、レート制限だけで総当たりを完全に防ぐことはできません。攻撃者は IP を変えられるからです。アプリの側でも、失敗が続いたアカウントのロック、二要素認証、07号のボット対策や 08号の Turnstile を組み合わせます。

  • Cloudflare のすべて 06 ― レート制限
  • 6 / 14
  • ④ 超えたら、しばらく止める(止める時間)
  • 止める時間が短いと、攻撃者は待って再開するだけ
  • 長すぎると、打ち間違えた本人も長く締め出される
  • 0秒
  • 10秒
  • 30秒
  • 60秒
  • 90秒
  • 60秒間は、何を送っても止める
  • mitigation timeout:一度超えた相手を、決めた時間だけ止め続ける。

動作:止める・確かめる・429 を返す

上限を超えたときの動作は、05号の WAF とほぼ同じです。

動作何をするか向いている場面
Blockエラーを返して止める。既定では 429(Too Many Requests)API、ログイン
Managed Challenge などブラウザで確認を挟む。人なら通れるブラウザで見るページ
Log止めずに記録だけ(Enterprise)新しいルールの試運転

Block のときに返す応答は、状態コードや本文を変えられます。API なら、JSON で「しばらく待ってください」と返すと、アプリ側で扱いやすくなります。429 は「回数が多すぎる」を表す状態コードで、行儀のよいクライアントは、これを受け取ると待ってから再試行します。

Challenge は、ブラウザでしか通れません。スマホアプリや、サーバー同士の通信に Challenge を掛けると、正しい相手まで止まります。API には Block を使いましょう。

どの動作を選べるか、応答を見て数えられるか(上位プラン)などは、プランによって違います。Free プランで選べるのは Block です。

  • Cloudflare のすべて 06 ― レート制限
  • 7 / 14
  • 動作:止める・確かめる・429 を返す
  • Block
  • Managed Challenge
  • 429 などのエラーを返す。本文も変えられる
  • ブラウザで確認。人なら通れる
  • Log
  • 応答を数える
  • 数えるだけ(Enterprise)
  • 401 だけ数える等(上位プラン)
  • Free プランで選べるのは Block。何が選べるかはプランで違う
  • API には Block、ブラウザ向けのページには Managed Challenge も。

例:ログインの総当たりを止める

ここまでの4つの決めごとを、ログインの例でまとめます。

決めごと設定
数える対象パスが /login で、メソッドが POST
誰ごとに送り元の IP
期間と上限60秒で5回まで
超えたらBlock(429 を返す)
止める時間10分

これで、1つの IP から1分に6回以上ログインを試すと、その IP は10分間ログインを送れなくなります。人間の利用者なら、1分に6回も失敗することはまずありません。一方、攻撃者の試行は、1つの IP あたり1時間に数十回程度にまで落ちます。

Free プランでは、期間と止める時間が10秒に固定されるので、この例と同じ設定はできません。それでも「10秒で5回まで」だけでも、1秒に何十回という機械的な総当たりは大きく遅くなります。

レート制限はあくまで遅くする道具です。IP をたくさん持つ攻撃者は、1つの IP あたりの回数を上限以下に抑えてきます。アプリ側のアカウントロック、二要素認証、そして強いパスワードの強制と組み合わせることで、はじめて総当たりに強いログインになります。

  • Cloudflare のすべて 06 ― レート制限
  • 8 / 14
  • 例:ログインの総当たりを止める
  • 数える対象
  • パスが /login で、メソッドが POST
  • 誰ごとに
  • 送り元の IP
  • 期間と上限
  • 60秒で5回(Free は10秒のみ)
  • 超えたら
  • Block(またはチャレンジ)
  • 止める時間
  • 10分など(Free は10秒のみ)
  • アプリ側のアカウントロックや二要素認証と組み合わせる。レート制限は IP を変えられると弱い
  • 「/login への POST を、IP ごとに、1分で5回まで」。

導入:管理画面でルールを1本作る

レート制限ルールは、管理画面でドメインを選び、セキュリティ > WAF の中のレート制限ルールから作ります。新しいセキュリティの管理画面では、WAF のカスタムルールなどと一緒に「セキュリティルール」として並んでいます。表示の場所は変わることがあるので、見つからないときは公式のドキュメントで確かめてください。

順番やること補足
1守りたい入口を1つ決めるログインが最初の候補
2数える条件を書く05号と同じ式の言葉。プルダウンでも組み立てられる
3誰ごとに数えるかを選ぶまずは IP
4期間と上限を決める普通の人が届かない回数から
5動作と止める時間を決めるAPI なら Block

作ったあとは、セキュリティの分析画面で、どの IP がどれくらいの回数でルールに当たっているかを見ます。正しい利用者が当たっているようなら上限をゆるめ、攻撃が抜けているようなら締めます。

前提として、ルールが効くのは Cloudflare のプロキシを通るリクエストだけです。オリジンの IP が漏れていると、攻撃者は Cloudflare を通らずにログイン画面を叩けます。04号の「Cloudflare からしか受けない」設定は、ここでも前提です。

  • Cloudflare のすべて 06 ― レート制限
  • 9 / 14
  • 導入:管理画面でルールを1本作る
  • 入口を決める
  • 式を書く
  • IP ごと
  • 期間と上限
  • 動作と時間
  • 場所:セキュリティ > WAF > レート制限ルール(新しい管理画面では「セキュリティルール」)
  • 上限は「普通の人が絶対に届かない回数」から始め、ログを見て締める
  • WAF と同じ場所に並ぶ。まずは守りたい入口1つから。

コードで書く:Terraform と Workers

ルールは管理画面のほか、API や Terraform でも書けます(34号)。図の左は、Terraform の設定の一部です。全体は次のような形になります。

resource "cloudflare_ruleset" "login_rl" {
  zone_id = var.zone_id
  name    = "login rate limit"
  kind    = "zone"
  phase   = "http_ratelimit"
  rules = [{
    expression = "(http.request.uri.path eq \"/login\" and http.request.method eq \"POST\")"
    action     = "block"
    ratelimit = {
      characteristics     = ["cf.colo.id", "ip.src"]
      period              = 60
      requests_per_period = 5
      mitigation_timeout  = 600
    }
  }]
}

characteristics に cf.colo.id(拠点の ID)が入っているのは、回数を拠点ごとに数えるためです。これは落とし穴のページでもう一度出てきます。Terraform のプロバイダーは版によって書き方が変わるので、使う版のドキュメントに合わせてください。

アプリの中で、ログインしている利用者ごとに数えたいときは、Workers(18号)の Rate Limiting バインディングが使えます。

toml
[[ratelimits]]
name = "LIMITER"
namespace_id = "1001"
simple = { limit = 5, period = 60 }
ts
const { success } = await env.LIMITER.limit({ key: userId });
if (!success) return new Response("多すぎます", { status: 429 });

期間は10秒か60秒から選びます。厳密な回数を数える仕組みではなく、「おおよそ」で止めるものなので、課金の回数の管理のように正確さが要る用途には、Durable Objects(21号)を使います。

  • Cloudflare のすべて 06 ― レート制限
  • 10 / 14
  • コードで書く:Terraform と Workers
  • # Terraform(ルールセットの一部)
  • // Workers(18号)の中で数える
  • phase = "http_ratelimit"
  • const { success } =
  • expression = "http.request.uri.path eq
  • await env.LIMITER.limit({
  • \"/login\""
  • key: userId })
  • action = "block"
  • if (!success)
  • characteristics = ["cf.colo.id", "ip.src"]
  • return new Response(
  • period = 60 requests_per_period = 5
  • "多すぎます", { status: 429 })
  • mitigation_timeout = 600
  • ルールはコードで管理できる。アプリの中で数えたいなら Workers。

料金と制限

レート制限ルールは、Free プランでも1本使えます。次の表は 2026年9月時点の目安です。

プラン主な内容
Freeルール1本。IP ごとに数える。期間10秒・止める時間10秒・動作は Block
Pro・Business本数が増える。期間・止める時間・動作の選択肢が広がる。上位ほど応答を見て数えるなども使える
Enterprise高度なレート制限(Advanced Rate Limiting)。ヘッダー・Cookie・API キー・本文の値などで数えられる
WorkersRate Limiting バインディング。期間は10秒か60秒

レート制限は、以前は「リクエスト数に応じて課金する」製品でしたが、今はプランに含まれる形になり、止めたリクエストの数で料金が増えることはありません。

Pro・Business の本数や選べる値は、見直されることがあります。具体的な数は、公式の料金ページとドキュメントの「プランごとの提供範囲」で確かめてください。

  • Cloudflare のすべて 06 ― レート制限
  • 11 / 14
  • 料金と制限
  • Free
  • 1本。IP ごと・10秒・Block・止める時間10秒
  • Pro・Business
  • 本数が増え、期間・止める時間・動作を選べる
  • Enterprise
  • 高度なレート制限:ヘッダー・Cookie・API キー等で数える
  • Workers の制限
  • Rate Limiting バインディング。期間は10秒か60秒
  • 2026年9月時点。本数や選べる値は変わるので、公式の料金ページで確かめること
  • Free でも1本使える。本数・期間・数え方は上位プランで広がる。

よくある落とし穴

落とし穴何が起きるかどうするか
共有 IP会社や携帯回線の大勢が、1人分の上限でまとめて止まる上限に余裕を持つ。上位プランなら Cookie や API キーで数える
拠点ごとに数える回数は Cloudflare の拠点(データセンター)ごと。世界中から分散して来る攻撃は、各拠点で上限に届かないことがある上限を小さめに。ほかの守りと重ねる
数える範囲が広すぎる画像や CSS まで数え、普通の閲覧で止まる入口ごとに絞る
API に Challengeアプリやサーバーの通信が止まるAPI には Block
クライアントが再試行を連打429 を受けてすぐ再送し、止まる時間が延び続ける429 では待ってから再試行するように作る
オリジンの IP が漏れているCloudflare を通らずに叩かれる04号の設定

とくに2つ目は知らない人が多い点です。レート制限の回数は、Cloudflare の拠点ごとに数えられ、世界全体の合計ではありません。ふつうは1人の相手は1つの拠点にしかつながらないので問題になりませんが、「全世界で合計何回まで」という厳密な制限には向きません。

  • Cloudflare のすべて 06 ― レート制限
  • 12 / 14
  • よくある落とし穴
  • 会社や携帯回線は、大勢が同じ IP。1人分の上限で全員が止まる
  • 数えるのは拠点(データセンター)ごと。全世界の合計ではない
  • 画像や CSS まで数え、普通の閲覧で上限に届く
  • API に Challenge を掛けて、アプリの通信が止まる
  • 429 を受けたら待つよう、クライアントも作る
  • 数え方の前提を知らないと、止めすぎるか、止まらないか。

他の号とのつながり

レート制限は「回数」を見る守りです。ほかの守りと、見ているものが違います。

号機能見るもの
04DDoS 対策量の洪水
05WAF1本の中身
06レート制限(この号)同じ相手からの回数
07ボット対策人間か機械か
08Turnstileフォームを送ったのが人間か

ログインを守るなら、このうち複数を重ねるのが基本です。たとえば、ログインのフォームに Turnstile(08号)を置き、レート制限で回数を抑え、ボット対策(07号)で自動化の道具を見分けます。

アプリの中で数えたいときは、Workers(18号)の Rate Limiting バインディングや、正確に数えられる Durable Objects(21号)が使えます。AI の API の使いすぎを抑えたいなら、AI Gateway(30号)にもレート制限の機能があります。ルールの状況を分析する方法は 32号、ルールをコードで管理する方法は 34号で扱います。

  • Cloudflare のすべて 06 ― レート制限
  • 13 / 14
  • 他の号とのつながり
  • Cloudflare のエッジ(世界中の拠点)
  • DDoS 対策(04):量の洪水
  • WAF(05):中身
  • 利用者
  • レート制限(この号):回数
  • オリジン
  • ブラウザ・アプリ
  • ボット対策(07):人か機械か
  • あなたのサーバー
  • Turnstile(08):フォームの人間確認
  • 式の言葉は 05号と共通。アプリの中で数えるなら Workers(18)や Durable Objects(21)
  • API の利用量の管理は AI Gateway(30)にもレート制限がある
  • 回数はこの号、中身は05、人かどうかは07・08。

まとめ:何を・誰ごとに・何秒で何回・どうする

この号で見たことをまとめます。

項目内容
なぜ要るか1本ずつは正しいリクエストでも、回数が多すぎれば攻撃になる(総当たり・使いすぎ・連打)
仕組み同じ相手からの回数を数え、上限を超えたら止める。中身は見ない
① 何を式の言葉で入口を絞る。サイト全体は数えない
② 誰ごとにふつうは IP。上位プランでは API キーや Cookie も
③ 期間と上限普通の人が届かない回数から始め、ログを見て締める
④ 止める時間短いと攻撃者は待つだけ、長いと共有 IP の人が困る
料金Free でも1本。本数・値の選択肢は上位で広がる
注意共有 IP、拠点ごとの数え方、API に Challenge を掛けない

レート制限は、攻撃を遅くする道具です。完全に止める道具ではありません。だからこそ、ほかの守りと重ねて使います。次の07号では、「そもそも相手は人間か、機械か」を見分けるボット対策を扱います。

  • Cloudflare のすべて 06 ― レート制限
  • 14 / 14
  • まとめ:何を・誰ごとに・何秒で何回・どうする
  • 対象・誰ごと
  • 式で入口を絞り、IP ごとに数える
  • 期間・上限・時間
  • 窓の中の回数が上限を超えたら、しばらく止める
  • 0秒
  • 10秒
  • 30秒
  • 60秒
  • 90秒
  • 60秒間は、何を送っても止める
  • 回数で止める門番。上限は余裕を持ち、ほかの守りと重ねる。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]