1 フォロワー

レート制限

不正使用を防ぐために、APIに *レート制限* を追加することを検討する必要があります。たとえば、各ユーザーのAPI使用量を10分間に最大100回に制限することができます。指定された時間内にユーザーから過剰なリクエストを受け取った場合、ステータスコード429(「Too Many Requests」を意味する)のレスポンスを返す必要があります。

レート制限を有効にするには、ユーザーアイデンティティクラスyii\filters\RateLimitInterface を実装する必要があります。このインターフェースでは、3つのメソッドを実装する必要があります。

  • getRateLimit(): 許可される最大リクエスト数と時間枠を返します(例: [100, 600] は、600秒以内に最大100回のAPI呼び出しができることを意味します)。
  • loadAllowance(): 許可される残りのリクエスト数と、レート制限が最後にチェックされたときの対応するUNIXタイムスタンプを返します。
  • saveAllowance(): 許可される残りのリクエスト数と現在のUNIXタイムスタンプの両方を保存します。

許可とタイムスタンプ情報を記録するために、ユーザーテーブルに2つの列を使用することをお勧めします。これらが定義されると、loadAllowance()saveAllowance()は、認証された現在のユーザーに対応する2つの列の値を読み書きするように実装できます。パフォーマンスを向上させるために、これらの情報をキャッシュまたはNoSQLストレージに保存することも検討できます。

Userモデルでの実装は次のようになります。

public function getRateLimit($request, $action)
{
    return [$this->rateLimit, 1]; // $rateLimit requests per second
}

public function loadAllowance($request, $action)
{
    return [$this->allowance, $this->allowance_updated_at];
}

public function saveAllowance($request, $action, $allowance, $timestamp)
{
    $this->allowance = $allowance;
    $this->allowance_updated_at = $timestamp;
    $this->save();
}

アイデンティティクラスが必要なインターフェースを実装すると、Yiiはyii\rest\Controllerのアクションフィルターとして設定されたyii\filters\RateLimiterを自動的に使用してレート制限チェックを実行します。レート制限を超えると、レートリミッターはyii\web\TooManyRequestsHttpExceptionをスローします。

RESTコントローラークラスでレートリミッターを次のように設定できます。

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
    return $behaviors;
}

レート制限が有効になっている場合、デフォルトでは、現在のレート制限情報を含む次のHTTPヘッダーがすべてのレスポンスに送信されます。

  • X-Rate-Limit-Limit: 時間枠で許可される最大リクエスト数
  • X-Rate-Limit-Remaining: 現在の時間枠で残りのリクエスト数
  • X-Rate-Limit-Reset: 許可される最大リクエスト数を得るために待つ必要がある秒数

上記のコード例のように、yii\filters\RateLimiter::$enableRateLimitHeadersfalseに設定することで、これらのヘッダーを無効にすることができます。

タイプミスを見つけた場合、またはこのページの改善が必要だと考える場合は?
Githubで編集する !