レート制限とは何か、固定ウィンドウ、スライディングウィンドウ、トークンバケット、リーキーバケットの違いを、ライブシミュレーター、429ステータス、Retry-After、Nginxの例とともに解説します。
レート制限とは、1人の訪問者、キー、IPアドレスが一定時間内に送れるリクエスト数に上限を設けることです。上限を超えたリクエストは拒否され、通常はHTTPステータス429 Too Many Requestsと、再試行できるタイミングを示すRetry-Afterヘッダーが返されます。ログインフォーム、問い合わせフォーム、APIを、大量アクセスや想定外の高額請求から守ります。
代表的な4つのレート制限アルゴリズム
サイトにログインページ、問い合わせフォーム、決済ページ、他のアプリから呼ばれるAPIがあれば、いずれ誰かが、偶然か意図的に、大量のリクエストを送ってきます。レート制限は、どこからが多すぎるかを決めるルールです。下ではボタンを押してリクエストを送り、各アルゴリズムが受け入れるか拒否するかを確認できます。その後、そのまま使えるNginxの設定をコピーできます。
RFC 6585では、429 Too Many Requestsを、一定時間内にリクエストを送りすぎたクライアントに返すステータスと定義しています。レスポンスには、クライアントがどれだけ待つべきかを伝えるRetry-Afterヘッダーを含めることができます。
デフォルトでは、limit_reqモジュールは拒否したリクエストに503を返します。limit_req_statusディレクティブで429に変更でき、呼び出し元に何が起きたかを正確に伝えられるため、多くのAPIではこちらが好まれます。
まだ標準ではありません。RateLimitとRateLimit-Policyのフィールドは、2026年10月時点でまだ策定中だったIETFワーキンググループのInternet-Draftに由来するため、代わりに古いX-RateLimitヘッダーを送るサービスもあります。参考になるヒントとして扱いましょう。
トークンバケットでは、呼び出し元が貯めたトークンをバーストで使い、その後は補充の速度に落ち着きます。リーキーバケットは、トラフィックを一定の流出量に均します。Nginxのドキュメントでは、limit_reqモジュールはリーキーバケット方式を使うとされています。
いいえ。少数の発信元からの悪用にはよく効きますが、数千のアドレスに分散したトラフィックには、ホスティングやCDNでの保護も必要です。レート制限は防御の1層であり、すべてではありません。
この設定では、ログインのパスで各IPアドレスに1秒あたり5リクエストを許可し、10件までのバーストは即座に処理し、超過したリクエストにはデフォルトの503ではなく429を返します。
10mのゾーンにカウンターを保存します。ドキュメントによると、1メガバイトに64バイトの状態を約16千個保持できます。
サーバーが1台なら、トークンバケットは数行で書けます。複数のサーバーを運用する場合は、共有ストアでカウントを管理しましょう。
各キーには10個のトークンがあり、1秒に1個ずつ補充されます。拒否された呼び出しには429と、秒単位のRetry-Afterが返ります。
ステータス429と、30秒のRetry-Afterです。
どのアルゴリズムも、5秒あたり約5リクエスト(または1秒に1ずつ動く容量5のバケット)を許可します。リクエストを送り、時間を進めて、何が通るかを確認しましょう。
アルゴリズム
固定ウィンドウ
スライディングウィンドウ
トークンバケット
リーキーバケット
1件のリクエストを送信
{n}件をまとめて送信
1秒待つ
リセット
時刻:{v}秒
許可:{n}
429で拒否:{n}
リクエストログ
t={v}s 許可
t={v}s 拒否(429)
まだリクエストはありません。上のボタンを押してください。
1秒単位で進む学習用モデルです。実際のリミッターはミリ秒単位で計測します。
無料で始める · クレジットカード不要