レートリミットは、短い時間に受け付ける依頼の数に上限を付けて、混雑や使いすぎを防ぐ仕組みです。役所の窓口で「1分に受け付ける件数はここまで」と決めておけば、一度に人が押し寄せても窓口はパンクせず、特定の人が窓口を占領することもない。上限を超えた人には、少し待ってから来てもらう。考え方はこれと同じです。
API や Web サービスは、短い時間に大量のリクエストが来ると、処理が遅れたり止まったりすることがあります。公開 API、ログイン画面、検索機能など、誰でも呼び出せる窓口でよく使われます。
何のために、何を単位に数えるか
レートリミットを入れる目的は、大きく分けて2つあります。一つはサーバーを守る負荷対策、もう一つは悪用を防ぐ不正対策です。どちらの目的かで、数え方も上限の値も変わります。
| 目的 | 数える単位の例 | 使われる場面 |
|---|---|---|
| 負荷を抑える | 利用者ごと、APIキーごと | 公開 API の大量呼び出しを防ぐ。障害時に、これ以上の集中で悪化させない |
| 悪用を防ぐ | IPアドレスごと、アカウントごと | ログインの試行や検索の連打を抑える |
| 契約の範囲を守る | 契約やプランごと | 無料プランと有料プランで使える量を分ける |
ログインの総当たりを抑えたいときは、人か機械かを見分ける CAPTCHA と組み合わせることもあります。危ない中身のアクセスを止める WAF と違い、レートリミットが見ているのは中身ではなく回数です。
上限に当たった人への返し方
厳しくしすぎると、普通に使っているだけの利用者まで止めてしまいます。上限の値は、実際の使われ方を見ながら決めます。
上限を超えたときの返し方も設計の一部です。「しばらくしてから再度お試しください」だけでなく、どれくらい待てばよいのかが伝わると、使う側は困りません。API を公開しているなら、上限と超えたときの挙動を仕様として書いておきます。
なお、レートリミットは混雑を抑える道具で、遅いものを速くする道具ではありません。アプリが重い、データベースが遅い、サーバーの台数が足りない、といった原因は、別に手を打つ必要があります。