リミッター

これは、公開APIやエンドポイント(例:パスワードリセット)への繰り返しリクエストを制限するために使用されるFiberのミドルウェアです。また、APIクライアント、Webクローラー、またはレート制限が必要なその他のタスクのレートを制限するのにも役立ちます。

注意: このミドルウェアは、統一されたインターフェースを介してさまざまなデータベースをサポートするために、当社のStorageパッケージを使用しています。デフォルトの構成ではデータをメモリに格納し、他のデータベースを参照するには以下の例をご覧ください。

注意: デフォルトでは、このモジュールは他のプロセス/サーバーと状態を共有しません。

シグネチャ

func New(config ...Config) fiber.Handler

Fiberウェブフレームワークの一部としてミドルウェアパッケージをインポートします:

import (
  "github.com/gofiber/fiber/v2"
  "github.com/gofiber/fiber/v2/middleware/limiter"
)

Fiberアプリを作成した後、次のオプションを使用できます:

// デフォルトの構成で初期化
app.Use(limiter.New())

// またはカスタム構成で拡張
app.Use(limiter.New(limiter.Config{
    Next: func(c *fiber.Ctx) bool {
        return c.IP() == "127.0.0.1"
    },
    Max:          20,
    Expiration:     30 * time.Second,
    KeyGenerator:          func(c *fiber.Ctx) string {
        return c.Get("x-forwarded-for")
    },
    LimitReached: func(c *fiber.Ctx) error {
        return c.SendFile("./toofast.html")
    },
    Storage: myCustomStorage{},
}))

スライディングウィンドウ

標準の固定ウィンドウアルゴリズムの代わりにスライディングウィンドウアルゴリズムを有効にできます。

例の構成は次のようになります:

app.Use(limiter.New(limiter.Config{
    Max:            20,
    Expiration:     30 * time.Second,
    LimiterMiddleware: limiter.SlidingWindow{},
}))

これにより、各ウィンドウは前のウィンドウ(あれば)を考慮に入れます。与えられたレートの式は以下の通りです:

weightOfPreviousWindow = 前のウィンドウのリクエスト数 * (whenNewWindow / Expiration)
rate = weightOfPreviousWindow + 現在のウィンドウのリクエスト数

構成

プロパティ タイプ 説明 デフォルト
Next func(*fiber.Ctx) bool Nextは、trueを返すとこのミドルウェアをスキップするための関数を定義します。 nil
Max int Expiration秒内の最大接続数。超過した場合は429レスポンスを返します。 5
KeyGenerator func(*fiber.Ctx) string カスタムキーを生成することができます。デフォルトではc.IP()を使用します。 c.IP()を使用する関数
Expiration time.Duration リクエストレコードをメモリに保持する時間。 1 * time.Minute
LimitReached fiber.Handler 制限に達したときに呼び出されます。 429レスポンスを送信する機能
SkipFailedRequests bool trueの場合、StatusCode >= 400 のリクエストをカウントしません。 false
SkipSuccessfulRequests bool trueの場合、StatusCode < 400 のリクエストをカウントしません。 false
Storage fiber.Storage ミドルウェアの状態を格納するために使用されるストア。 現在のプロセスだけのメモリストレージ
LimiterMiddleware LimiterHandler リミッターミドルウェアを実装する構造体。 新しい固定ウィンドウのレートリミッター
Duration (Deprecated) time.Duration 廃止予定: 代わりにExpirationを使用してください。 -
Store (Deprecated) fiber.Storage 廃止予定: 代わりにStorageを使用してください。 -
Key (Deprecated) func(*fiber.Ctx) string 廃止予定: 代わりにKeyGeneratorを使用してください。 -

注意: カスタムストレージがStorageインターフェースを実装している場合、カスタムストレージを使用できます - 詳細や例については、store.goを参照してください。

デフォルト構成

var ConfigDefault = Config{
    Max:        5,
    Expiration: 1 * time.Minute,
    KeyGenerator: func(c *fiber.Ctx) string {
        return c.IP()
    },
    LimitReached: func(c *fiber.Ctx) error {
        return c.SendStatus(fiber.StatusTooManyRequests)
    },
    SkipFailedRequests: false,
    SkipSuccessfulRequests: false,
    LimiterMiddleware: FixedWindow{},
}

カスタムストレージ/データベース

当社の storage パッケージでは、任意のストレージメソッドを使用できます。

storage := sqlite3.New() // From github.com/gofiber/storage/sqlite3
app.Use(limiter.New(limiter.Config{
    Storage: storage,
}))