속도 제한
속도 제한 (Rate Limiting)
속도 제한은 API를 남용으로부터 보호하는 데 도움이 됩니다. 지정된 시간 프레임 내에 클라이언트가 만들 수 있는 요청 수에 최대 임계값을 설정하는 것을 의미합니다. 이 간단한 기법은 게이트키퍼 역할을 해 서비스 성능을 저하시키고 불필요한 비용을 발생시키는 과도한 사용을 막습니다.
출처: 공식문서
본문
Upstash Redis와 Upstash Ratelimit로 속도 제한
이 예시에서는 Upstash Redis와 Upstash 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 문서를 참고하세요.