JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

Node.jsアプリにexpress-rate-limitを導入してレート制限(Rate Limiting)を実装する方法

近年、WebサイトをDoS攻撃やDDoS攻撃から守るために、レート制限(Rate Limiting)の重要性がますます高まっています。レート制限とは、特定のIPアドレスからのリクエスト回数に上限を設けることで、不正なリクエストやブルートフォース攻撃などの悪意あるアクセスからシステムを保護する仕組みです。

Node.jsのWebフレームワーク「Express」では、npmパッケージのexpress-rate-limitを使うことで、ユーザーごとのリクエスト数を簡単に制限できます。本記事では、その導入手順と基本的な使い方を解説します。

express-rate-limitモジュールのインストール

まず、以下のコマンドを実行して、アプリケーションにexpress-rate-limitモジュールをインストールします。

npm install --save express-rate-limit

実装例

次に、rateLimit.jsという名前でファイルを作成し、以下のコードをコピーしてください。作成後は、次のコマンドでプログラムを実行できます。

node rateLimit.js

rateLimit.js

// expressモジュールを読み込む
const express = require("express");

// express-rate-limitモジュールを読み込む
const rateLimit = require("express-rate-limit");

// express関数を変数appに格納
const app = express();

// レートリミッター関数をオプション付きで呼び出す
// max: リクエストの最大許容回数
// windowMs: max回のリクエストを受け付ける時間幅(ミリ秒)
// message: レート制限時にユーザーへ表示するメッセージ
const limiter = rateLimit({
    max: 5,
    windowMs: 60 * 60 * 1000,
    message: "Too many request from this IP"
});

// レート制限をExpressのミドルウェアとして登録し、
// すべてのリクエストが実行前にこの制限を通過するようにする
app.use(limiter);

// ユーザーのリクエストを処理するGETルート
app.get("/", (req, res) => {
    res.status(200).json({
        status: "SUCCESS",
        message: "Welcome to TutorialsPoint !"
    });
});

// サーバーのセットアップ
const port = 8000;
app.listen(port, () => {
    console.log(`app is running on port ${port}`);
});

実行結果

C:\home\node>> node rateLimit.js

Nodeアプリケーションを起動したら、ブラウザで localhost:8000 にアクセスしてみましょう。

正常に動作していれば、以下のような画面が表示されます。

Node.jsアプリにexpress-rate-limitを導入してレート制限(Rate Limiting)を実装する方法

同じURLに5回以上アクセス(または再読み込み)すると、レート制限が働き、以下のようなエラーが返されます。

Node.jsアプリにexpress-rate-limitを導入してレート制限(Rate Limiting)を実装する方法

ポイント解説

  • windowMs: 60 * 60 * 1000 は1時間(3,600,000ミリ秒)を意味します。つまり、この設定では「1時間あたり5リクエストまで」という制限になります。
  • max の値や windowMs の時間幅は、アプリケーションの性質に合わせて自由に調整可能です。APIサーバーなどでは、より厳しい設定にすることでDDoS攻撃への耐性が高まります。
  • レート制限はミドルウェアとして登録されているため、ルーティング処理の前に必ずチェックが行われます。特定のルートだけに適用したい場合は、app.use() の代わりに個別のルートに limiter を渡すこともできます。

このように、express-rate-limitを使えばわずか数行のコードで効果的なレート制限を実装でき、悪意のある大量リクエストからAPIやWebサイトを保護することができます。

  1. JavaScriptの二分木(バイナリツリー)とは?基本概念と重要用語を徹底解説

    二分木(バイナリツリー)は、データの格納を目的として使用される特殊なデータ構造です。最大の特徴は、各ノードが持てる子ノードの数が2つまでという条件にあります。二分木は、整列済み配列と連結リストの両方の長所を兼ね備えた構造です。検索はソートされた配列と同等の速さで行え、データの挿入や削除も連結リストと同様に高速に実行できます。そのため、大量のデータを効率的に扱いたい場合に非常に有用なデータ構造といえます。以下は、二分木の構造を示したイラストです。図には、このあと解説する重要な用語も含まれています。二分木における重要な用語二分木を理解するうえで押さえておきたい、主要な用語を以下にまとめました。パス

  2. JavaScriptで実装するプリム法:最小全域木を求めるアルゴリズムの基本と実装例

    プリム法(Prims Algorithm)とはプリム法は、重み付き無向グラフから最小全域木(MST: Minimum Spanning Tree)を求めるための貪欲法(グリーディアルゴリズム)です。グラフ内のすべての頂点を含み、かつ辺の重みの合計が最小になるような辺の部分集合(木)を見つけ出します。アルゴリズムは、任意の開始頂点から木の構築を始め、1ステップごとに「木に属する頂点」と「木に属さない頂点」をつなぐ辺の中から、最もコスト(重み)の小さいものを1本追加していくことで動作します。プリム法の動作の流れ以下の図を使って、プリム法がどのように動作するのかを順番に見ていきましょう。ステップ1: