For AI agents: fetch the complete documentation index at /llms.txt, the full documentation corpus at /llms-full.txt, the agent skill at /skill.md, or this page as Markdown at /ko/docs/modules/rate-limiting.md (or send Accept: text/markdown).
레이트 리밋
남용에 취약한 모든 라우트를 위한 하나의 리미터.
초보자 연습
전제 조건: 아래 두 개의 초보자 가이드를 읽고, 웹 로컬 설정을 완료하고, 편집기의 루트에서 이 모노레포를 엽니다. 웹 설정은 apps/web/.env.local에 속합니다. Next.js는 루트 .env를 읽지 않습니다. 기본 가짜 모드의 /dashboard는 데이터베이스가 없는 데모입니다. /auth에는 마이그레이션된 데이터베이스가 필요합니다.
빠른 용어: 작업 영역은 한 팀의 별도 사용자, 데이터 및 설정입니다. 서버는 신뢰할 수 있는 백엔드입니다. 제공업체 키를 브라우저 및 전화 코드에 보관하세요. 마이그레이션은 테이블을 생성하거나 업데이트하는 버전이 지정된 데이터베이스 변경입니다. AI 모델은 응답하는 엔진입니다. 모델 카탈로그는 서버의 사용 가능한 모델 ID 및 가격 목록입니다. 공급자는 AI, 이메일, 청구 서비스와 같은 외부 서비스입니다. 자격은 작업 영역에서 기능을 사용할 수 있도록 하는 부여입니다. 웹훅은 한 서비스가 다른 서비스의 URL에 보내는 메시지입니다.
1. 서버 환경에서 공유 프로덕션 버킷에 대해 RATE_LIMIT_STORE=postgres를 선택하고 공용 AI가 비활성화된 상태로 유지되도록 PUBLIC_AI_DAILY_BUDGET_MICROUNITS=0를 설정합니다.
2. 전달 헤더를 추가하는 제어된 프록시의 정확한 수에만 TRUSTED_PROXY_COUNT를 설정합니다. 호스트에 해당되지 않는 한 1를 복사하지 마십시오.
3. 거부된 요청이 재시도 안전 오류를 반환하는지 확인합니다. 인스턴스마다 한도가 다른 경우 Postgres를 공유하는지 확인하세요.
사용자 정의 코드의 경우 제공된 prompts/README.md로 시작하고 가장 가까운 프롬프트(앱 화면의 경우 prompts/new-app-screen.md, 공개 페이지의 경우 prompts/new-landing-page.md)를 복사합니다. 서버, 데이터베이스 또는 공급자 작업의 경우 코딩 에이전트에게 이 가이드의 작업을 제공하고 AGENTS.md, .ai/PROJECT_CONTEXT.md 및 일치하는 .ai/ 미러를 읽도록 요청하세요. 여기에 이름이 지정된 정확한 소스 파일을 검사하십시오. 편집하기 전에 파일을 나열하고 확인합니다. 작업 공간 소유권과 서버 전용 비밀을 보존합니다. 차이점을 보여주세요. 원하는 동작, 입력 및 출력 필드, 허용된 역할, 예상되는 성공 및 오류, 테스트 계정, 공급자 또는 장치를 알려주십시오. 샘플 값을 사용하십시오. 절대 진짜 비밀을 붙여넣지 마세요.
리미터 매장을 선택하세요
RATE_LIMIT_STORE는 메모리 또는 postgres입니다. 설정되지 않은 경우 프로덕션에서는 Postgres를 선택하고 기타 환경에서는 메모리를 선택합니다. 공유 rate_limit_bucket 행은 여러 서버를 조정합니다. API 가용성을 보존하기 위해 현재 저장소 오류는 페일 오픈됩니다.
작업 공간/사용자 AI 제출 제한 및 공개 API/MCP 제한기는 별도의 표면을 보호합니다. 경로를 추가할 때 기존 호출자별 버킷 키를 유지합니다.
제어된 프록시 홉만 신뢰
TRUSTED_PROXY_COUNT의 범위는 0~10이며 x-forwarded-for를 추가하는 역방향 프록시의 수를 계산합니다. Zero는 아무것도 신뢰하지 않으며 공유된 알 수 없는 버킷을 사용합니다. 하나의 제어된 프록시에는 일반적으로 1이 필요합니다. 잘못된 개수로 인해 신뢰할 수 없는 전달 값이 제한기에 영향을 미칠 수 있습니다.
익명 제공업체 지출 제한
PUBLIC_AI_DAILY_BUDGET_MICROUNITS=0는 공개 AI 호출을 비활성화합니다. 음수가 아닌 구성된 일일 UTC 한도는 공급자가 호출하기 전에 플랫폼 지출을 예약하며 각 작업 공간의 예산과 별개입니다. 청구 가능한 공급자가 시도하기 전에 동시 예약, 경계 재설정 및 거부를 테스트합니다.
RATE_LIMIT_STORE=postgres
TRUSTED_PROXY_COUNT=1
PUBLIC_AI_DAILY_BUDGET_MICROUNITS=0설치 및 설정
rate-limit-runtime은 남용에 취약한 표면에 연결된 공유 리미터를 제공합니다 — apiV1Limiter(600 요청/분)와 authLimiter(300 요청/분)가 출하된 프리셋입니다. 한도는 아이덴티티 + 라우트 버킷으로 키잉되고, 일반 오류 대신 Retry-After를 실은 재시도 가능한 429로 응답합니다.
새로운 남용 취약 엔드포인트 — 로그인, OTP, 체크아웃, 작업 제출, 키 생성 — 에는 라우트별로 따로 노는 카운터를 만들지 말고 기존 리미터를 확장하세요.
export const apiV1Limiter = createNamedRateLimiter("api-v1", 600, 60_000);
export const authLimiter = createNamedRateLimiter("auth", 300, 60_000);구현 워크플로
키를 신중히 고르세요: 인증된 액션은 사용자별, 공개 트래픽은 API 키별, 익명 엔드포인트의 IP별은 최후의 수단입니다. 정상적인 버스트는 Retry-After를 받고 공격은 단단한 상한에 부딪힙니다.
남용 취약 라우트에서 리미터를 fail-closed로 유지하세요 — 스토어에 도달할 수 없으면 제한 없이 통과시키는 것보다 비용이 큰 작업을 거부하는 쪽을 택하세요.
검증 및 문제 해결
리미터가 합리적인 Retry-After와 함께 429를 반환할 때까지 실행하고, 서로 다른 워크스페이스가 독립 버킷을 갖는지, 버스트 후 윈도우가 지나면 성공으로 돌아오는지 확인하세요. 거부는 요청의 민감한 페이로드 없이 로그하세요.