レート制限は、クライアントが時間枠内に行えるリクエスト数に上限を設けます。各レイヤーが異なるものを認識するため複数のレイヤーで適用し、悪用者を識別するものをキーにします。
Retry-After を含む 429 Too Many Requests を返す — クライアントはハンマリングの代わりに礼儀正しくバックオフします。# Define a shared-memory zone keyed by client IP.
# rate=10r/s = the steady refill rate (token bucket).
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
server {
location /api/ {
# burst=20: allow a short spike of 20 queued requests
# nodelay: serve the burst immediately instead of spacing it out
limit_req zone=api burst=20 nodelay;
# Return 429 (not the default 503) so clients see a rate-limit signal
limit_req_status 429;
proxy_pass http://backend;
}
}
ここでは各 IP は毎秒 10 リクエストで補充され、最大 20 までバーストでき、それ以上は 429 を取得します。
レート制限は、Layer 7 フラッド、認証情報詰め込み、および暴走スクレーパーに対する最も安価で常時稼働している防御です。レイヤー化 (ボリューム用エッジ、オリジン用プロキシ、ビジネスロジック用アプリ) し、正しくキー指定することで、悪用者を阻止しながら実ユーザー (および正当なバースト) を無傷で通過させます。実際のベースラインから制限を設定することが、自分自身の停止にならないようにすることです。