blog

その14:インターフェイスのアクセス頻度を制限する

フロー制限とは、その名の通りAPIコールの頻度を制限することです。APIを呼び出すたびにサーバーのリソースが消費されるため、多くのAPIはユーザーに対して無期限に開放されているわけではなく、一定回数の...

Nov 19, 2020 · 3 min. read
シェア

フロー制限は、名前が示すように、APIコールの頻度を制限することです。各APIコールは、サーバーのリソースを費やすので、多くのAPIは、無制限にユーザーに開かれることはありません、リクエストは、もはやアクセスすることは許可されません一定の回数に達すると、または時間の期間、せいぜい、唯一のAPIにアクセスすることが許可される回数を指定します。

現在、インターフェイスは流量を制限する措置がなく、ユーザーがインターフェイスを呼び出す限り、サーバーはデータを処理して返します。インターフェイスが悪意のあるユーザーによってブラッシングされるのを防ぐために、インターフェイスにフローを制限するために来てください。

前回の記事で、インターフェイスが整理され、キャッシュが追加され、フロー制限ポリシーはキャッシュ設定に基づくことができるようになりました。キャッシュ時間が長いインターフェースに対しては、制限を適切に緩和することができ、データベースへのアクセスを必要とする可能性のあるインターフェースに対しては、厳格な制限が適用されます。

django-rest-framework は、フロー制限のための2つの一般的な補助クラス、 AnonRateThrottle と UserRateThrottle を提供します。 AnonRateThrottle は認証されていないユーザのアクセス頻度を制限するために使われ、 制限はユーザの ip に基づいて行われます。UserRateThrottle は認証されたユーザ、つまりウェブサイトの登録ユーザへのアクセスを制限するために使用されます。両方のクラスを同じ API で使用することで、異なるタイプのユーザに対して異なる流量制限ポリシーを適用することができます。

2つのヘルパー・クラスは、"最大アクセス数/間隔 "というフォーマットで指定する頻度を制限します。 exceptions.Throttled 制限回数を超えた呼び出しは例外をスローし、クライアントはレスポンスとして429ステータスコードを受け取ります。

再び、フロー制限ポリシーは、利用可能なAPIのリストとキャッシュに基づいて分析されます:

その他の注意事項

  1. ホーム記事リストAPI:キャッシュ、通常のユーザーはあまり頻繁に訪問しません、10/分に制限されています。
  2. 記事詳細API:キャッシュ、通常のユーザーはあまり頻繁に訪問しません、10/分に制限されています。
  3. カテゴリ、タグ、アーカイブの日付のリスト、キャッシュ、通常のユーザーからはあまりアクセスされません。
  4. 検索インターフェイス、通常のユーザーはあまり頻繁に訪問しません、5/分に制限されています。

インターフェイスのフロー制限ルールができたら、次はフロー制限ヘルパークラスを設定します。

1つはグローバル設定、もう1つはグローバル設定をオーバーライドする個々のビュー設定です。ほとんど全てのインターフェースは匿名ユーザーへのフローを制限しているので、グローバル設定から始めましょう。プロジェクトの設定ファイルcommon.pyで、REST_FRAMEWORKの設定項目を見つけて、以下の設定を追加します:

# filename="common.py"
REST_FRAMEWORK = {
 'DEFAULT_THROTTLE_CLASSES': [
 'rest_framework.throttling.AnonRateThrottle',
 ],
 'DEFAULT_THROTTLE_RATES': {
 'anon': '10/min',
 }
}

このようにして、すべてのインターフェイスのアクセス周波数は10/分に設定されます。

検索インターフェースでは、5/分という流量制限ルールが設定されているため、このビューセットには別の流量制限クラスが設定されています。

グローバル・コンフィギュレーションでは、制限周波数のデフォルト設定は10/分なので、制限クラスのデフォルト周波数を5/分に設定するには、元の制限クラスを継承して、そのTHROTTLE_RATESプロパティをオーバーライドする必要があります:

# filename="blog/views.py"
from rest_framework.throttling import AnonRateThrottle
class PostSearchAnonRateThrottle(AnonRateThrottle):
 THROTTLE_RATES = {"anon": "5/min"}

そして、検索インターフェイスのビューセットで、throttle_classesを介してこのフロー制限クラスを指定します:

# filename="blog/views.py"
class PostSearchView(HaystackViewSet):
 index_models = [Post]
 serializer_class = PostHaystackSerializer
 throttle_classes = [PostSearchAnonRateThrottle]

電流制限が実際に機能するかどうかをテストするためです。

まず、10分のアクセス制限をかけたインターフェイスをテストしてみましょう。 記事リストインターフェイスapi/v1/posts/を例にとると、10回の連続アクセスの後、インターフェイスは次のような結果を返します:

HTTP 429 リクエストが多すぎます 許可: GET, HEAD, OPTIONS Content-Type: application/json Retry-After: 52 Vary: Accept

{ "detail": "リクエストが速度制限を超えました。 52秒後に利用可能になる予定です。}

分後に再アクセスすると正常に戻りました。

api/v1/search/?text=markdownにアクセスして、検索インターフェイスをもう一度テストしてみましょう。 5回連続してリフレッシュした後、インターフェイスは以下の結果を返します:

HTTP 429 リクエストが多すぎます 許可: GET, HEAD, OPTIONS Content-Type: application/json Retry-After: 26 Vary: Accept

{ "detail": "リクエストが速度制限を超えました。 26秒後に利用可能になる予定です。}

分後に再アクセスすると正常に戻りました。

!!! ノート

Read next

RBACユーザーロール権限設計

つまり、ユーザはロールを通じてパーミッションに関連付けられています。簡単に言えば、ユーザーはいくつかのロールを持ち、それぞれのロールはいくつかのパーミッションを持ちます。このようにして、"ユーザー-ロール-パーミッション "という権限モデルが構築されます。このモデルでは、一般にユーザとロール、ロールとパーミッションの関係は多対多の関係になります。 ロールとは何ですか?それは、ある数のパーミッションの集合体、パーミッションのキャリアとして理解することができます。例えば、...

Nov 19, 2020 · 4 min read