Node+Redi による API レート制限

青灯夜游
リリース: 2020-09-19 10:13:03
転載
3566 人が閲覧しました

Node+Redi による API レート制限

レート制限により、API ベースのサービスの可用性が保護および向上します。 API と通信していて、HTTP 429 Too Many Requests 応答ステータス コードを受信した場合は、レートが制限されています。これは、一定時間内に許可されるリクエストの数を超えたことを意味します。必要なのは、速度を落とし、少し待ってから再試行することだけです。

推奨ビデオ チュートリアル: nodejs チュートリアル

なぜレート制限があるのですか?

独自の API ベースのサービスを制限することを検討する場合は、ユーザー エクスペリエンス、セキュリティ、パフォーマンスの間のトレードオフを比較検討する必要があります。

Node+Redi による API レート制限

#データ フローを制御する最も一般的な理由は、API ベースのサービスの可用性を維持することです。ただし、偶発的または意図的な受信トラフィックの急増により貴重なリソースが占有され、他のユーザーの可用性に影響を与える可能性があるため、セキュリティ上の利点もあります。

受信リクエストの速度を制御することで、次のことが可能になります。

  • サービスとリソースが「フラッディング」されないようにします。
  • ブルート フォース攻撃の軽減
  • 分散型サービス拒否 (DDOS) 攻撃の防止

レート制限を実装するにはどうすればよいですか?

レート制限は、クライアント レベル、アプリケーション レベル、インフラストラクチャ レベル、またはその中間のレベルで実装できます。 API サービスへの受信トラフィックを制御するには、いくつかの方法があります。

  • ユーザー別 : API キー、アクセス トークン、または IP アドレスを使用してユーザーによる呼び出しを追跡する
  • By地理的地域: たとえば、1日のピーク時に地理的地域ごとのレート制限を下げる
  • By Server: 複数のサーバーがある場合API へのさまざまな呼び出しを処理するには、より高価なリソースへのアクセスに対してより厳しいレート制限を課す可能性があります。

これらのレート制限のいずれかを (または組み合わせて) 使用できます。

Node+Redi による API レート制限

実装方法に関係なく、レート制限の目標は、リソースへのアクセス要求を拒否または通過するチェックポイントを確立することです。多くのプログラミング言語とフレームワークには、これを実現するための機能やミドルウェアが組み込まれており、さまざまなレート制限アルゴリズムのオプションも備えています。

Node と Redis を使用して独自のレート リミッターを作成する 1 つの方法は次のとおりです:

  • ノード アプリの作成

  • # #Adding a Redis を使用したレート リミッター

  • Postman でのテスト

GitHub でコード例をご覧ください。
始める前に、コンピューターに Node と Redis がインストールされていることを確認してください。

ステップ 1: ノード アプリケーションをセットアップする

コマンド ラインから新しいノード アプリケーションをセットアップします。 CLI プロンプトでデフォルトのオプションを受け入れるか、

—yes フラグを追加します。

$ npm init --yes
ログイン後にコピー

プロジェクトのセットアップ時にデフォルトのオプションを受け入れた場合は、エントリ ポイントとして

index.js という名前のファイルを作成します。

$ touch index.js
ログイン後にコピー

Express Web フレームワークをインストールし、

index.js でサーバーを初期化します。

const express = require('express')
const app = express()
const port = process.env.PORT || 3000

app.get('/', (req, res) => res.send('Hello World!'))
app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
ログイン後にコピー

コマンドラインからサーバーを起動します。

$ node index.js
ログイン後にコピー

index.js に戻り、ルートを作成し、最初にレート制限を確認し、制限を超えていない場合はユーザーがリソースにアクセスできるようにします。

app.post('/', async (req, res) => {
  async function isOverLimit(ip) {
    // to define
  }
  // 检查率限制
  let overLimit = await isOverLimit(req.ip)
  if (overLimit) {
    res.status(429).send('Too many requests - try again later')
    return
  }
  // 允许访问资源
  res.send("Accessed the precious resources!")
})
ログイン後にコピー

Node+Redi による API レート制限

次のステップでは、レート リミッター関数

isOverLimit を定義します。

ステップ 2: Redis を使用してレート リミッターを追加する

Redis はメモリ内のキーと値のデータベースであるため、データを非常に迅速に取得できます。 Redis を使用したレート制限の実装も非常に簡単です。

    ユーザーの IP アドレスなどのキーを保存します。
  • この IP から行われる呼び出しの数を増やす
  • 指定した期間後にレコードを期限切れにする
下の図に示すレート制限アルゴリズムは、

スライディング ウィンドウ カウンターの例 。ユーザーが適度な数の呼び出しを送信するか、時間をかけて間隔をあければ、レート制限に達することはありません。 10 秒以内に最大リクエストを超えたユーザーは、リクエストを再開するのに十分な時間を待つ必要があります。

Node+Redi による API レート制限

コマンド ラインからノードに ioredis という名前の Redis クライアントをインストールします。

$ npm install ioredis
ログイン後にコピー

Redis サーバーをローカルで起動します。

$ redis-server
ログイン後にコピー

次に、

index.js で Redis クライアントを要求して初期化します。

const redis = require('ioredis')
const client = redis.createClient({
  port: process.env.REDIS_PORT || 6379,
  host: process.env.REDIS_HOST || 'localhost',
})
client.on('connect', function () {
  console.log('connected');
});
ログイン後にコピー

前のステップで書き始めた isOverLimit 関数を定義します。Redis のこのモードに従って、カウンターは IP に従って保存されます。

async function isOverLimit(ip) {
  let res
  try {
    res = await client.incr(ip)
  } catch (err) {
    console.error('isOverLimit: could not increment key')
    throw err
  }
  console.log(`${ip} has value: ${res}`)
  if (res > 10) {
    return true
  }
  client.expire(ip, 10)
}
ログイン後にコピー

これはレート リミッターです。

ユーザーが API を呼び出すと、Redis をチェックしてユーザーが制限を超えているかどうかを確認します。その場合、API はすぐに リクエストが多すぎます — 後でもう一度試してください というメッセージを含む HTTP 429 ステータス コードを返します。ユーザーが制限内にある場合は、コードの次のブロックに進み、保護されたリソース (データベースなど) へのアクセスを許可します。

レート制限チェック中に、Redis でユーザーのレコードを見つけてリクエスト数を増やします。Redis にそのユーザーのレコードがない場合は、新しいレコードを作成します。最後に、各レコードは、最新のアクティビティから 10 秒以内に期限切れになります。

次のステップでは、速度リミッターが適切に機能していることを確認してください。

ステップ 3: Postman でのテスト

変更を保存し、サーバーを再起動します。 Postman を使用して、http:// localhost:3000 でローカルに実行されている API サーバーに POST リクエストを送信します。

Node+Redi による API レート制限

#レート制限に達するまで、リクエストを連続して送信し続けます。

Node+Redi による API レート制限

レート制限に関する最終的な考え方

これは、Node と Redis のレート制限の簡単な例です。始まり。レート制限を構築して実装するために使用できる戦略やツールは数多くあります。この例では、応答本文の

    または
  • Retry-after ヘッダーとして、再試行する前にユーザーに通知するなど、他の機能強化も検討できます。待ったほうがいいでしょうか
  • レート制限に達したリクエストをログに記録して、ユーザーの行動を理解し、悪意のある攻撃を警告します
  • 他のレート制限アルゴリズムまたは他のミドルウェアを使用してみてください
覚えておいてくださいAPI の制限に注目すると、パフォーマンス、セキュリティ、ユーザー エクスペリエンスの間でトレードオフが生じることになります。理想的なレート制限ソリューションは、これらの要素を考慮して、時間の経過とともに変化します。

英語の元のアドレス: https://codeburst.io/api-rate-limiting-with-node-and-redis-95354259c768

その他のプログラミング関連の知識、

プログラミング入門をご覧ください。 !

以上がNode+Redi による API レート制限の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート