Limiter
Fiber 를 위한 Limiter 미들웨어로, 패스워드 재설정과 같은 공개 API 및 엔드포인트에 대한 반복 요청을 제한하는 데 사용됩니다. 또한 API 클라이언트, 웹 크롤링 또는 제한이 필요한 기타 작업에도 유용합니다.
Signatures
func New(config ...Config) fiber.Handler
Examples
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{},
}))
Sliding window
표준 고정 창 알고리즘 대신 sliding window 알고리즘을 활성화할 수 있습니다.
이러한 구성의 예는 다음과 같습니다:
app.Use(limiter.New(limiter.Config{
Max: 20,
Expiration: 30 * time.Second,
LimiterMiddleware: limiter.SlidingWindow{},
}))
이는 모든 창이 이전 창(있었던 경우)을 고려한다는 것을 의미합니다. 주어진 속도 공식은 다음과 같습니다:
weightOfPreviousWindpw = previous window's amount request * (whenNewWindow / Expiration)
rate = weightOfPreviousWindpw + current window's amount request.
Config
Next
func(*fiber.Ctx) bool
Next는 true를 반환할 때 이 미들웨어를 건너뛰는 함수를 정의합니다.
nil
Max
int
Expiration
초 동안 429 응답을 보내기 전에 최근 연결 수의 최대값입니다.
5
KeyGenerator
func(*fiber.Ctx) string
KeyGenerator를 사용하면 사용자 지정 키를 생성할 수 있으며, 기본적으로 c.IP()가 사용됩니다.
c.IP()를 기본값으로 사용하는 함수
Expiration
time.Duration
Expiration은 메모리에 요청 레코드를 보관하는 시간입니다.
1 * time.Minute
LimitReached
fiber.Handler
LimitReached는 요청이 제한에 도달했을 때 호출됩니다.
429 응답을 보내는 함수
SkipFailedRequests
bool
true로 설정하면 StatusCode >= 400인 요청이 계산되지 않습니다.
false
SkipSuccessfulRequests
bool
true로 설정하면 StatusCode < 400인 요청이 계산되지 않습니다.
false
Storage
fiber.Storage
Store는 미들웨어의 상태를 저장하는 데 사용됩니다.
이 프로세스에만 사용되는 인메모리 스토어
LimiterMiddleware
LimiterHandler
LimiterMiddleware는 제한 미들웨어를 구현하는 구조체입니다.
새로운 Fixed Window Rate Limiter
Duration (Deprecated)
time.Duration
사용되지 않음: 대신 Expiration 사용
-
Store (Deprecated)
fiber.Storage
사용되지 않음: 대신 Storage 사용
-
Key (Deprecated)
func(*fiber.Ctx) string
사용되지 않음: 대신 KeyGenerator 사용
-
Default Config
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{},
}
Custom Storage/Database
storage 패키지의 모든 스토리지를 사용할 수 있습니다.
storage := sqlite3.New() // From github.com/gofiber/storage/sqlite3
app.Use(limiter.New(limiter.Config{
Storage: storage,
}))
Last updated