"Deploy" 한 번이면 전 세계에 공개된다
Vercel이나 Replit은 배포가 놀라울 정도로 쉽다. AI에게 코드를 만들게 하고 깃허브에 푸시하면 자동 배포. 문제는 기본 설정이 "동작"에 최적화되어 있지, "보안"에 최적화되어 있지 않다는 점이다.
바이브코더들이 배포 후 가장 많이 듣는 말: "사이트 잘 되는데요, 근데 이거 다 열려있어요."
Vercel 배포 시 놓치는 것
1. 환경변수에 NEXT_PUBLIC_ 접두사 남용
Vercel + Next.js 조합에서 NEXT_PUBLIC_으로 시작하는 환경변수는 브라우저에 그대로 노출된다.
# 위험 — 브라우저에서 보임
NEXT_PUBLIC_SUPABASE_SERVICE_KEY=eyJ...
NEXT_PUBLIC_OPENAI_API_KEY=sk-...
# 안전 — 서버에서만 접근 가능
SUPABASE_SERVICE_KEY=eyJ...
OPENAI_API_KEY=sk-...
AI에게 "Supabase 연동해줘"라고 하면 편의상 NEXT_PUBLIC_을 붙이는 경우가 많다. service_role 키에는 절대 붙이면 안 된다.
2. API Route에 인증 미들웨어 누락
Next.js의 /api/ 라우트는 기본적으로 인증 없이 누구나 접근 가능하다. AI가 만든 API 라우트에 인증 체크가 없는 경우:
// 취약 — 누구나 호출 가능
export async function POST(req) {
const data = await req.json();
await db.insert(data); // 인증 없이 DB 쓰기
return Response.json({ ok: true });
}
// 안전 — 세션 확인 후 처리
export async function POST(req) {
const session = await getServerSession();
if (!session) return Response.json({ error: 'Unauthorized' }, { status: 401 });
const data = await req.json();
await db.insert(data);
return Response.json({ ok: true });
}
3. Preview 배포가 공개 상태
Vercel은 PR마다 프리뷰 URL을 자동 생성한다. 이 URL이 검색 엔진에 인덱싱되거나 외부에서 접근 가능한 경우가 있다. 프리뷰에 테스트 데이터, 관리자 기능이 포함되어 있으면 위험하다.
Settings → General → Deployment Protection에서 Preview 배포에 비밀번호를 설정하거나 Vercel Authentication을 켜야 한다.
Replit 배포 시 놓치는 것
4. Secrets가 포크에 복사됨
Replit에서 프로젝트를 공개(Public)로 설정하면 다른 사람이 포크할 수 있다. Secrets(환경변수)는 포크에 복사되지 않지만, 코드에 하드코딩된 값은 그대로 따라간다.
AI가 "빠르게 테스트해보자"며 코드에 직접 넣은 키가 있다면, 포크한 사람이 그 키를 갖게 된다.
5. .replit 파일의 run 명령어
.replit 파일에 run = "python main.py"가 설정되어 있으면, 방문자가 Run 버튼으로 서버를 실행할 수 있다. 의도치 않은 리소스 소비나 데이터 접근이 발생할 수 있다.
공통으로 놓치는 것
6. CORS 와일드카드
AI에게 "CORS 에러 해결해줘"라고 하면 십중팔구 이렇게 한다:
// AI의 기본 답변 — 전체 허용
res.setHeader('Access-Control-Allow-Origin', '*');
// 올바른 설정 — 내 도메인만 허용
const allowedOrigins = ['https://myapp.vercel.app', 'https://mydomain.com'];
const origin = req.headers.origin;
if (allowedOrigins.includes(origin)) {
res.setHeader('Access-Control-Allow-Origin', origin);
}
7. 에러 페이지에 스택 트레이스 노출
개발 모드에서는 에러가 나면 파일 경로, 변수값, DB 쿼리가 화면에 뜬다. 배포할 때 NODE_ENV=production으로 바꿔야 하는데, AI가 이걸 빠뜨리는 경우가 있다.
배포 전 30초 점검
URL만 입력하면 위 항목을 포함한 17가지 보안 항목을 자동 점검한다. Vercel이든 Replit이든, 배포 후 한 번은 돌려봐야 한다.