한계자
이는 Fiber의 미들웨어로, 공용 API 및/또는 엔드포인트(예: 비밀번호 재설정)에 대한 반복 요청을 제한하는 데 사용됩니다. 또한 API 클라이언트, 웹 크롤러 또는 기타 요청 속도 제한이 필요한 작업을 제한하는 데 유용합니다.
참고: 이 미들웨어는 저희의 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{},
}))
이는 각 창이 이전 창(있는 경우)을 고려한다는 것을 의미합니다. 주어진 속도에 대한 공식은 다음과 같습니다:
이전 창의 요청 양 * (새 창 간격 / 만료) = 이전 창의 가중치
속도 = 이전 창의 가중치 + 현재 창의 요청 양
구성
속성 | 유형 | 설명 | 기본값 |
---|---|---|---|
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 (폐기됨) | time.Duration |
폐기됨: Expiration 대신 사용합니다. | - |
Store (폐기됨) | fiber.Storage |
폐기됨: Storage 대신 사용합니다. | - |
Key (폐기됨) | 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,
}))