속도 제한

속도 제한 (Rate Limiting)

속도 제한은 API를 남용으로부터 보호하는 데 도움이 됩니다. 지정된 시간 프레임 내에 클라이언트가 만들 수 있는 요청 수에 최대 임계값을 설정하는 것을 의미합니다. 이 간단한 기법은 게이트키퍼 역할을 해 서비스 성능을 저하시키고 불필요한 비용을 발생시키는 과도한 사용을 막습니다.

출처: 공식문서

본문

Upstash Redis와 Upstash Ratelimit로 속도 제한

이 예시에서는 Upstash RedisUpstash Ratelimit으로 API 엔드포인트를 보호합니다.

app/api/generate/route.ts

import {
  createUIMessageStreamResponse,
  streamText,
  toUIMessageStream,
} from 'ai';
import { Ratelimit } from '@upstash/ratelimit';
import { Redis } from '@upstash/redis';
import { NextRequest } from 'next/server';

// Allow streaming responses up to 30 seconds
export const maxDuration = 30;

// Create Rate limit
const ratelimit = new Ratelimit({
  redis: Redis.fromEnv(),
  limiter: Ratelimit.fixedWindow(5, '30s'),
});

export async function POST(req: NextRequest) {
  // call ratelimit with request ip
  const ip = req.ip ?? 'ip';
  const { success, remaining } = await ratelimit.limit(ip);

  // block the request if unsuccessful
  if (!success) {
    return new Response('Ratelimited!', { status: 429 });
  }

  const { messages } = await req.json();

  const result = streamText({
    model: "xai/grok-4.6",
    messages,
  });

  return createUIMessageStreamResponse({
    stream: toUIMessageStream({ stream: result.stream }),
  });
}

API 보호 단순화

Upstash Redis와 Upstash Ratelimit을 사용하면 이런 공격으로부터 API를 쉽게 보호할 수 있습니다. Ratelimit이 어떻게 동작하고 필요에 따라 어떻게 구성하는지에 대한 자세한 내용은 Ratelimit 문서를 참고하세요.

더 알아보기