AI 코딩 보안 2026.04.16 · 조회 234322

Vercel·Replit 배포할 때 놓치는 보안 설정 7가지

Vercel이나 Replit에서 "Deploy" 버튼 누르기 전에 확인해야 할 보안 설정. 기본값이 안전하지 않은 항목만 골랐다.

S
보안 전문 기업 SENTRIX 레드팀
해킹대회 수상 · 보안 실무 10년 · 실전 진단 경험을 바탕으로 작성합니다.
웹사이트를 운영하고 있다면
보안 헤더·인증서·공개 노출부터 무료로 점검하세요. 결과 링크는 이메일로 받습니다. 로그인 이후 권한·업무 로직은 별도 검증이 필요합니다.

다음 화면에서 이메일과 점검 권한을 확인합니다. 회원가입·카드 없이 무료 요약을 받고, 상세 리포트는 선택 구매합니다.

"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이든, 배포 후 한 번은 돌려봐야 한다.

내 사이트 보안 점검하기 (무료, 30초)

내 사이트도 점검해보세요

URL 입력, 결과 링크는 메일로 받는 무료 점검. 회원가입·카드 불필요.

AI 코딩 보안 체크리스트 받기

AI 코딩 보안 체크리스트(PDF)를 무료로 받아보세요.

코드 자체가 걱정이라면 : 소스코드 보안 분석(SAST)이 ZIP 업로드만으로 취약점 위치와 수정 코드를 찾아드립니다.
이런 글을 계속 받아보려면 뉴스레터 구독 · RSS 피드