myesn

myEsn2E9

hi
github

Next.js: API リクエストレート制限

背景#

一定の時間内に 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

参考#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。