面接問題:レートリミットを複数IPで回避する攻撃者からAPIを守る方法
問題¶
Attackers bypass your Rate Limiting using multiple IPs. How do you protect your API in production?
解答¶
IP ベースのレートリミット単体では簡単にバイパスできる。複数の対策を組み合わせる必要がある。
1. User/Session ベースのレートリミット¶
# IP ベース(簡単にバイパスされる)
limit_by: ip_address # 攻撃者が IP を変えれば突破
# ユーザー/セッションベース(より耐性が高い)
limit_by: user_id # 認証済みユーザーの ID で制限
limit_by: api_key # API キーで制限
limit_by: account_id # アカウント単位で制限
2. フィンガープリンティング¶
User-Agent + Accept-Language + タイムゾーン + TLS fingerprint
を組み合わせてクライアントを識別する
→ IP が変わっても同一クライアントと判定できる
→ JA3/JA4 fingerprint(TLS クライアント特性)も活用可能
3. Bot 検知・CAPTCHA¶
① 行動パターン分析
- リクエスト間隔が一定すぎる → ボットの可能性
- マウス動作・タイピングパターンの自然さを評価
② チャレンジ・レスポンス
- reCAPTCHA / hCaptcha / Turnstile
- 疑わしいトラフィックだけに適用(UX を守る)
4. IP ベース対策の強化¶
# IP レピュテーション(既知の悪意ある IP を拒否)
- MaxMind GeoIP2
- AbuseIPDB API
- Cloudflare のボット管理
# ASN(Autonomous System Number)で制限
- データセンター ASN からのリクエストに厳格なルール
- 住宅用 ISP は緩め(人間のユーザーが多い)
# Anycast CDN で吸収(Cloudflare, AWS Shield)
- DDoS 規模のトラフィックはエッジで吸収
5. スライディングウィンドウ + 複合キー¶
# Redis で複合キーによるレートリミット
def rate_limit_key(request):
return "|".join([
request.user_id or "anon",
request.ip_address,
request.api_key or "",
get_device_fingerprint(request)
])
# 複合キーで制限することで、IP を変えても他の要素で捕まえる
6. Adaptive Rate Limiting¶
面接でのポイント¶
- 「IP だけでは不十分」と即座に言える
- 認証済みユーザーには
user_idベース、未認証には複合フィンガープリントを使うことを説明 - Cloudflare / AWS WAF などのマネージドサービスの活用に触れると実務経験として評価される