Skip to content

Instantly share code, notes, and snippets.

@kobitoDevelopment
Created April 13, 2026 06:59
Show Gist options
  • Select an option

  • Save kobitoDevelopment/40f1d3052e02a6ab27fa78dd9413f64d to your computer and use it in GitHub Desktop.

Select an option

Save kobitoDevelopment/40f1d3052e02a6ab27fa78dd9413f64d to your computer and use it in GitHub Desktop.

ボットによる大量アクセスに対するコスト調整の原則

1. レート制限(Rate Limiting)

1.1 制限単位

単位 説明
IPアドレス 送信元IPごとにリクエスト数を制限する
APIキー 発行したキーごとにリクエスト数を制限する
ユーザーID 認証済みユーザーごとにリクエスト数を制限する
セッション セッションIDごとにリクエスト数を制限する

1.2 アルゴリズム

アルゴリズム 動作
Token Bucket トークンを一定速度で補充し、リクエストごとにトークンを消費する。バースト許容。
Leaky Bucket リクエストをキューに格納し、一定速度で処理する。出力レートが一定。
Fixed Window 固定時間枠(例:1分間)内でリクエスト数をカウントする。境界でリセット。
Sliding Window 移動する時間枠内でリクエスト数をカウントする。境界問題を緩和。

1.3 レスポンス

  • 制限超過時は HTTPステータスコード 429 Too Many Requests を返却する
  • Retry-After ヘッダーで再試行可能までの秒数を通知する
  • レスポンスボディにエラー理由を含める

2. キャッシュ

2.1 目的

  • 同一リクエストに対する処理を省略し、オリジンサーバーの負荷を削減する
  • キャッシュヒット時はオリジンへの通信が発生しないため、計算リソースとデータ転送コストを削減する

2.2 キャッシュ対象の判断基準

対象 理由
静的ファイル(画像、CSS、JS) 内容が変化しない
読み取り専用APIレスポンス 一定期間内で結果が同一
生成コストが高いコンテンツ 再生成の回避による負荷削減

2.3 キャッシュ制御ヘッダー

ヘッダー 用途
Cache-Control キャッシュの有効期間と動作を指定
ETag コンテンツのバージョン識別子
Last-Modified 最終更新日時

3. リクエストフィルタリング

3.1 フィルタリング条件

条件 説明
IPアドレス/CIDR 特定のIP範囲を許可または拒否
地理的位置 IPアドレスから推定した国・地域による制御
リクエストパターン URL、ヘッダー、ボディの内容によるマッチング
リクエストレート 単位時間あたりのリクエスト数による制御

3.2 アクション

アクション 説明
許可(Allow) リクエストを通過させる
拒否(Block) リクエストを遮断し、エラーレスポンスを返す
チャレンジ(Challenge) CAPTCHA等の検証を要求する
カウント(Count) 統計目的で記録のみ行い、通過させる

4. ボット検出手法

4.1 手法の分類

手法 説明
シグネチャベース 既知のボットのUser-Agent文字列やIPアドレスと照合する
行動分析 マウス移動、スクロール、クリックパターンを分析する
ブラウザフィンガープリンティング ブラウザの特性(画面解像度、プラグイン、フォント等)を収集し識別する
JavaScriptチャレンジ JavaScriptの実行を要求し、実行不可のクライアントを検出する
レート異常検出 人間の操作速度を超えるリクエスト頻度を検出する

4.2 検出指標

指標 異常パターン
リクエスト間隔 一定間隔での連続リクエスト
セッション内ページ遷移 人間の閲覧パターンと異なる遷移順序
フォーム入力速度 人間の入力速度を超える送信
JavaScript実行結果 期待される結果と異なる応答

5. 認証・認可

5.1 目的

  • リクエスト元を識別し、匿名アクセスを制限する
  • 識別されたクライアントごとに使用量を追跡・制限する

5.2 制御項目

項目 説明
クォータ 一定期間内の総リクエスト数上限
スロットリング 単位時間あたりのリクエスト数上限
許可エンドポイント アクセス可能なAPIパスの制限
許可メソッド 使用可能なHTTPメソッドの制限

6. リソース上限設定

6.1 設定対象

対象 説明
同時接続数 同時に処理可能なコネクション数の上限
ワーカー/プロセス数 リクエスト処理に使用するプロセス数の上限
メモリ使用量 アプリケーションが使用可能なメモリの上限
スケールアウト上限 自動スケーリング時のインスタンス数上限

6.2 目的

  • 大量アクセス時にリソース消費が無制限に増加することを防止する
  • コストの上限を予測可能にする

7. コスト監視とアラート

7.1 監視対象

対象 説明
リクエスト数 総リクエスト数、エンドポイント別リクエスト数
データ転送量 インバウンド/アウトバウンドの転送バイト数
計算リソース使用量 CPU時間、メモリ使用量、実行時間
課金額 実際の発生コストまたは推定コスト

7.2 アラート条件

条件タイプ 説明
閾値超過 設定値を超えた時点で通知
異常検出 過去のパターンから逸脱した場合に通知
予測ベース 現在の傾向から期間終了時の値を予測し、閾値超過が見込まれる場合に通知

8. 多層防御

8.1 レイヤー構成

[クライアント]
     │
     ▼
[エッジ/CDN層]
  - キャッシュ
  - 地理的フィルタリング
  - DDoS緩和
     │
     ▼
[WAF層]
  - リクエストフィルタリング
  - レート制限
  - ボット検出
     │
     ▼
[ロードバランサー層]
  - 接続数制限
  - ヘルスチェック
     │
     ▼
[アプリケーション層]
  - 認証・認可
  - ビジネスロジックレベルの検証
  - APIキー検証
     │
     ▼
[データ層]
  - コネクションプール制限
  - クエリタイムアウト

8.2 原則

  • 各レイヤーで独立した防御を実装する
  • 外側のレイヤーで可能な限り不正リクエストを遮断し、内側のレイヤーへの負荷を軽減する
  • 単一レイヤーの突破が全体の突破につながらないようにする

9. ログと分析

9.1 収集項目

項目 用途
タイムスタンプ 時系列分析、パターン検出
送信元IPアドレス 発生源の特定、IPベースの制限判断
User-Agent クライアント種別の識別
リクエストパス 攻撃対象エンドポイントの特定
レスポンスステータス エラー率の監視
レスポンス時間 パフォーマンス影響の測定
リクエストサイズ/レスポンスサイズ 転送量の追跡

9.2 分析観点

観点 説明
時間帯別トラフィック 異常な時間帯のアクセス増加を検出
IP別リクエスト分布 特定IPへの集中を検出
エンドポイント別負荷 攻撃対象となっているパスを特定
エラー率推移 ブルートフォース攻撃等の兆候を検出

10. 対応の自動化

10.1 自動対応の例

トリガー アクション
単一IPからの異常リクエスト数 当該IPを一時的にブロックリストに追加
特定エンドポイントへの集中アクセス 当該エンドポイントのレート制限を強化
コスト閾値超過 スケールアウトを停止、管理者へ通知
認証失敗の連続 当該アカウントまたはIPをロックアウト

10.2 自動化の原則

  • 誤検知による正規ユーザーへの影響を最小化するため、一時的な制限から開始する
  • 自動対応の実行をログに記録し、事後検証を可能にする
  • 自動対応の解除条件を明確に定義する
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment