リミッター
これは、公開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,
}))