メインコンテンツへスキップ

レートリミットとは

この記事は約 2 分で読めます

レートリミット (Rate Limiting) とは、一定時間内に受け付けるリクエスト数に上限を設け、サービスを過負荷や悪用から保護する仕組みです。DDoS 攻撃の緩和、ブルートフォース攻撃の抑制、 API の公平な利用を実現するために広く導入されています。 2025 年時点で、 API エコノミーの拡大に伴い、レートリミットは API セキュリティの基本要件として定着しています。

制限がないとき遅くなるのは誰か

レートリミットのない API では、処理能力が事実上の早い者勝ちで配分されます。 1 つのクライアントが大量のリクエストを送り続けると、接続数や CPU 時間、データベース接続といった共有資源をそのクライアントが占有し、待たされるのは無関係な他の利用者です。障害として浮かび上がる症状は全体的な応答の遅さであり、原因になっている特定のクライアントの姿は表面には現れません。しかもこの状態は悪意を必要としません。再試行の実装が素朴なクライアントや、初回の一括同期を行うバッチ処理でも同じ結果になります。レートリミットは攻撃を遮断する手段であるだけでなく、 1 つの利用者の振る舞いが他の利用者の体験へ波及する経路を断つ仕組みでもあります。上限を明示しておけば、超過したクライアント側にも制限に達したことが伝わるため、原因不明の遅延として扱われずに済みます。

レート制限フロー

クライアントからリクエスト受信
レートリミッター (カウンター確認)
制限内
200 OK (処理実行)
制限超過
429 Too Many Requests

主要なアルゴリズム

固定ウィンドウ方式は「 1 分間に 100 リクエストまで」のように時間枠を固定して計測します。実装が簡単ですが、ウィンドウの境界でバースト的なリクエストが集中する問題があります。スライディングウィンドウ方式は直近の時間枠で計測し、バースト問題を緩和します。トークンバケット方式は一定速度でトークンが補充され、リクエストごとにトークンを消費するモデルで、短時間のバーストを許容しつつ平均レートを制限できます。

実装シナリオ

ログインエンドポイントでは、同一 IP アドレスからのログイン試行を「 5 分間に 10 回まで」に制限し、クレデンシャルスタッフィングを抑制します。 API では、認証済みユーザーに「 1 時間あたり 1,000 リクエスト」、未認証ユーザーに「 1 時間あたり 100 リクエスト」のようにティア別の制限を設けます。制限超過時は HTTP 429 (Too Many Requests) レスポンスと Retry-After ヘッダーを返し、クライアントに適切な待機時間を伝えます。API キー管理とレートリミットを組み合わせることで、 API の不正利用を効果的に防止できます。

設計のポイント

レートリミットの閾値は、正規ユーザーの利用パターンを分析して設定する必要があります。閾値が低すぎると正規ユーザーの体験を損ない、高すぎると攻撃を防げません。分散環境では Redis などの共有ストアでカウンターを管理し、複数サーバー間で一貫した制限を適用します。強力なランダムパスワードとレートリミットを組み合わせることで、ログインページの安全性を大幅に向上できます。

関連用語

この記事は役に立ちましたか?