API設計

レート制限 れーとせいげん

Rate LimitingスロットリングAPIトークンバケット429 Too Many RequestsDoS対策
レート制限について教えて

簡単に言うとこんな感じ!

レート制限は「1分間に何回まで」みたいなルールで、APIへのリクエスト数を制限する仕組みだよ。回転寿司のレーン速度制限みたいなもので、一人が皿を取りすぎると他のお客さんが困るから、ちゃんとルールを決めてるってこと!


レート制限とは

レート制限(Rate Limiting) とは、一定時間内にAPIやサービスへ送れるリクエストの回数を制限する仕組みのことです。「1分間に最大60回まで」「1日に1000回まで」といったルールを設け、それを超えた場合はエラーを返したり、処理を遅延させたりします。

たとえばTwitter(現X)のAPIは「15分間に180リクエストまで」といった制限を設けており、これを超えると 429 Too Many Requests というHTTPステータスコードが返ってきます。ビジネスシステムでAPIを使ったサービスを作る場合、この制限を意識しないと「突然データが取れなくなった」というトラブルにつながります。

レート制限が必要な理由は主に3つです。①サーバーへの過負荷を防ぐ、②DoS攻撃(サービス妨害攻撃) などの悪意あるアクセスをブロックする、③公平にリソースを分配する(一部のユーザーが独占しないようにする)。クラウドサービスや外部APIを利用するシステム開発では必ず押さえておきたい概念です。


レート制限の主なアルゴリズム

レート制限には複数の実装方式があります。それぞれ「どうカウントするか」が異なり、ユースケースによって使い分けられます。

アルゴリズム仕組み特徴
固定ウィンドウ「1分間に60回」のように固定の時間枠でカウントシンプル。ウィンドウの境目に集中アクセスされる弱点あり
スライディングウィンドウ現在時刻から過去1分間をリアルタイムに計算精度が高い。実装は少し複雑
トークンバケットバケツにトークンが一定速度で溜まり、リクエストごとに消費バーストアクセス(急なアクセス増)を許容しやすい
リーキーバケットバケツから一定速度でリクエストが漏れ出る(処理される)リクエストを均一な速度で処理したい場合に向く

🪣 トークンバケットのイメージ

[ バケツ ] 最大10トークン
  ↑ 毎秒1トークン補充
  ↓ リクエスト1回 = 1トークン消費

✅ トークンあり → リクエスト処理OK
❌ トークンなし → 429エラー or 待機

覚え方:「バケツとトークン」

「トークンバケット」は「コイン(トークン)を貯めて、使う」イメージで覚えると◎。コインが足りないと入場できない遊園地の乗り物みたいなものです。


歴史と背景

  • 1990年代〜2000年代初頭:ネットワーク帯域制御の文脈でトークンバケット・リーキーバケットのアルゴリズムが確立。RFC 2697・2698などで標準化
  • 2000年代中盤:WebAPIの普及(Twitter・Google Maps等)とともに、APIのレート制限が広く認知される
  • 2010年代:クラウドサービスの拡大に伴い、AWSやGCPなどもAPIごとに細かいレート制限を設定。開発者が必ず意識する概念に
  • 2015年以降マイクロサービスアーキテクチャの普及で、サービス間通信にもレート制限が重要に。API Gatewayによる集中管理が一般化
  • 現在CloudflareAWS WAFなどのエッジサービスがレート制限をインフラレベルで提供。アプリケーション側の実装負担が軽減

レート制限の適用パターンと比較

レート制限は「誰に対して制限するか」によって設計が変わります。

レート制限の適用パターン グローバル制限 全体で◯req/秒 ユーザー単位 APIキーごとに制限 IP単位 IPアドレスごと エンドポイント URL単位で設定 API Gateway / Reverse Proxy (例: AWS API Gateway / Nginx / Cloudflare) バックエンドAPIサーバー (処理・レスポンス) 制限超過時 → HTTP 429 Too Many Requests を返す

超過時のレスポンス例

HTTP/1.1 429 Too Many Requests
Retry-After: 60
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1712620800

{
  "error": "rate_limit_exceeded",
  "message": "Too many requests. Please retry after 60 seconds."
}
  • X-RateLimit-Limit : 上限リクエスト数
  • X-RateLimit-Remaining : 残りリクエスト数
  • X-RateLimit-Reset : 制限がリセットされる時刻(Unixタイムスタンプ)
  • Retry-After : 何秒後に再試行すべきか

関連する規格・RFC

規格・RFC番号内容
RFC 6585HTTPステータスコード 429 Too Many Requests の定義
RFC 2697シングルレートトークンバケット(srTCM)アルゴリズムの仕様
RFC 2698ツーレートトークンバケット(trTCM)アルゴリズムの仕様
RFC 7231HTTPセマンティクス(Retry-Afterヘッダーの定義を含む)
RFC 8631APIリンクリレーションRateLimit ヘッダーの議論の背景)

関連用語

  • APIゲートウェイ — APIへのリクエストを一元管理するミドルウェア。レート制限を集中管理する場所
  • HTTPステータスコード — サーバーがリクエスト結果を伝える3桁の番号。429はレート制限超過を示す
  • スロットリング — レート制限と似た概念。処理速度を意図的に絞ること
  • DoS攻撃 — 大量リクエストでサービスを妨害する攻撃。レート制限で緩和できる
  • APIキー — API利用者を識別するための認証トークン。ユーザー単位のレート制限に使われる
  • マイクロサービス — 小さなサービスを組み合わせるアーキテクチャ。サービス間通信のレート制限が重要
  • CDN — コンテンツ配信ネットワーク。エッジでレート制限を適用できるサービスも多い
  • REST API — Webで広く使われるAPI設計スタイル。レート制限はREST APIの運用で必須の概念