Developer monitoring dashboards and code across multiple screens at night

#019 런칭 당일 서버 다운과 API 과금을 방어하는 Rate Limit 및 보안 펜스 구축

커뮤니티나 프로덕트 헌트에 서비스를 공개했을 때 가장 끔찍한 시나리오는 두 가지다. 첫째는 트래픽이 몰려 서버가 뻗어버리는 것이고, 둘째는 악성 유저나 매크로 봇이 크롤링 API를 무차별 호출해서 수백만 원의 API 과금 폭탄을 안겨주는 것이다.

무료 인프라(#007)를 유지하면서 1인 시스템을 안전하게 지켜내려면, 백엔드 진입로에 ‘속도 제한(Rate Limiting)’과 ‘보안 펜스’를 미리 쳐두어야 한다. 오늘은 비용 없이 10분 만에 적용할 수 있는 API 보안 방어벽 구축 프로토콜을 정리했다.

🛡️ 1인 SaaS를 위협하는 3대 취약점과 대응책

  1. 무차별 API 연타 (DDoS / 매크로 호출):
    • 한 유저가 스크립트를 짜서 1초에 수십 번씩 크롤링 요청을 보내면 백엔드 자원이 고갈되고 타깃 쇼핑몰로부터 내 서버 IP가 영구 차단당한다.
    • 대응: IP 및 유저 ID 기반의 토큰 버킷(Token Bucket) 속도 제한을 건다.
  2. 비로그인 유저의 무제한 긁어가기:
    • 회원가입 없이 맛보기 기능을 제공할 때 쿠키만 삭제해가며 무제한으로 툴을 악용하는 케이스.
    • 대응: 브라우저 핑거프린트 및 IP 단위로 일일 무료 사용량을 3회로 강제 고정한다.
  3. 타 도메인에서의 API 무단 도용 (CORS 공격):
    • 내가 만든 백엔드 엔드포인트를 남의 웹사이트에서 몰래 가져다 쓰는 행위.
    • 대응: Next.js 미들웨어에서 허용된 내 도메인(Origin) 외의 요청을 100% 차단한다.

⚙️ Upstash Redis를 활용한 무자본 Rate Limit 연동

서버리스 환경에서 가장 가볍고 빠른 속도 제한 도구는 ‘Upstash Redis’다. 하루 10,000건의 요청까지 평생 무료로 제공되므로 1인 SaaS에 완벽하게 부합한다.

Plaintext

[Upstash Rate Limit 설치 및 Next.js 미들웨어 연동]
1. 터미널 라이브러리 설치
npm install @upstash/ratelimit @upstash/redis
2. Upstash 대시보드에서 무료 Redis DB 생성 후 토큰 복사
- UPSTASH_REDIS_REST_URL
- UPSTASH_REDIS_REST_TOKEN

TypeScript

// middleware.ts (백엔드 진입로 차단 미들웨어)
import { NextRequest, NextResponse } from 'next/server';
import { Ratelimit } from '@upstash/ratelimit';
import { Redis } from '@upstash/redis';
const redis = new Redis({
url: process.env.UPSTASH_REDIS_REST_URL!,
token: process.env.UPSTASH_REDIS_REST_TOKEN!,
});
// 규칙 설정: 동일 IP당 1분간 최대 5회까지만 요청 허용
const ratelimit = new Ratelimit({
redis: redis,
limiter: Ratelimit.slidingWindow(5, '1 m'),
});
export async function middleware(request: NextRequest) {
// 크롤링 핵심 API 경로에만 적용
if (request.nextUrl.pathname.startsWith('/api/crawl')) {
const ip = request.ip ?? '127.0.0.1';
const { success, limit, remaining, reset } = await ratelimit.limit(ip);
if (!success) {
return NextResponse.json(
{ error: '요청 한도를 초과했습니다. 잠시 후 다시 시도해 주세요.' },
{ status: 429 } // Too Many Requests 에러 반환
);
}
}
return NextResponse.next();
}

🔒 데이터베이스를 지키는 Row Level Security (RLS) 설정

Supabase를 사용할 때 가장 흔하게 발생하는 보안 사고는 테이블의 RLS를 꺼두어, 해커가 프론트엔드 키(Anon Key)를 가지고 남의 결제 데이터나 회원 정보를 통째로 조회해 가는 것이다.

  • 원칙: Supabase의 모든 테이블(users, crawls, payments)은 생성 즉시 Enable RLS 토글을 켜야 한다.
  • 접근 정책(Policy) 작성:
    • “오직 로그인한 본인(auth.uid() = user_id)만 자기 데이터를 읽고 쓸 수 있다”는 단 하나의 정책만 걸어두면 데이터 유출 사고를 원천 차단할 수 있다.

💡 런칭 전 필수 보안 체크리스트

검검 항목정상 상태확인 방법
API 키 노출 여부GitHub 공개 코드에 Secret Key 없음.gitignore.env* 파일 포함 확인
속도 제한 작동 여부1분에 6회 이상 요청 시 429 에러 발생Postman이나 브라우저로 연속 요청 테스트
Supabase RLS 활성화모든 테이블에 초록색 ‘RLS Enabled’ 배지 점등Supabase Table Editor 대시보드 확인
CORS 도메인 제한내 서비스 도메인 외 외부 호출 차단Next.js API 헤더 Access-Control-Allow-Origin 점검
  • 인사이트 요약: 시스템을 공격하는 봇이나 과금 리스크로부터 내 인프라를 지키는 것은 개발의 마지막 단계가 아니라 서비스 생존의 필수 기본기다. 10분짜리 Rate Limit 미들웨어 하나로 서버 다운 걱정 없이 편안하게 런칭 트래픽을 맞이할 수 있는 방패가 준비되었다.
  • 차기 분석 테스크: 리스트 020번 “20편 시리즈의 완결: 실전 런칭 체크리스트 총점검 및 첫 유료 결제 발생 시 행동 강령” 정리. 지금까지 빌드한 ReviewZip을 인터넷 세상에 정식 배포하고 첫 달러를 수확하는 최종 실전 프로토콜로 마무리하겠다.

🚀 지금 바로 1인 AI SaaS 창업을 시작하세요!

이 글에서 다룬 모든 아키텍처와 운영 전략이 담긴 마스터북 + 풀스택 보일러플레이트 코드를 지금 확인해보세요.

$0에서 $10k MRR까지의 완벽한 로드맵. 7일 내 환불 보증.



코멘트

댓글 남기기

1인 SaaS 창업 연구소 : Hellomoneys에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기