背景#
一定の時間内に API アクセス回数を制限します。例えば、1 分間に 5 回の API アクセスのみを許可します。
方法#
注意:
- プロジェクトのルートディレクトリに
middleware.ts
(または .js)ファイルを作成して Middleware を定義します。例えば、pages または app と同じレベル、または src 内に(該当する場合)。 - プロジェクトは 1 つの Middleware のみをサポートします。
プロジェクトが Vercel 環境にデプロイされている場合#
プロジェクトが Vercel にデプロイされている場合は、次を参考にしてください:Add Rate Limiting with Vercel Edge Middleware and Vercel KV
プロジェクトが非 Vercel 環境にデプロイされている場合#
以下のコードは、クライアントの IP を取得して、1 分間に最大 5 回 /api
で始まるルートへのアクセスを制限する方法を示しています。
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
const rateLimitMap = new Map()
// この関数は内部で `await` を使用する場合、`async` としてマークできます
export function middleware(request: NextRequest) {
const ip = request.headers.get('x-forwarded-for') || request.ip
if (ip === '::1') return NextResponse.next()
const limit = 5 // IP ごとに 1 分間に 5 回のリクエストを制限
const windowMs = 60 * 1000 // 1 分
if (!rateLimitMap.has(ip)) {
rateLimitMap.set(ip, {
count: 0,
lastReset: Date.now(),
})
}
const ipData = rateLimitMap.get(ip)
if (Date.now() - ipData.lastReset > windowMs) {
ipData.count = 0
ipData.lastReset = Date.now()
}
if (ipData.count >= limit) {
return NextResponse.json({ message: 'リクエストが多すぎます。1 分後に再試行してください' }, { status: 429 })
}
ipData.count += 1
return NextResponse.next()
}
// 詳細については「パスの一致」を参照してください
export const config = {
matcher: '/api/:path*',
}
コードの出典:Implementing Rate Limiting in Next.js API Routes without External Packages