AI 개발 도구를 이용해 만든 웹앱을 배포할 때 Vercel을 사용하는 경우가 많습니다.
GitHub 저장소를 연결하면 자동으로 빌드되고 URL까지 생성되기 때문에 배포 과정은 간단하게 느껴집니다.
하지만 배포에 성공했다는 것과 안전하게 운영할 준비가 끝났다는 것은 다릅니다.
Vercel은 컴퓨팅, 네트워크 같은 플랫폼 인프라를 보호하지만 애플리케이션 코드, 사용자 인증, 데이터 접근 권한, 환경변수 사용은 개발자가 관리해야 합니다.
이번 글에서는 Vercel로 웹앱을 배포할 때 자주 하는 실수 10가지와 확인 방법을 정리해보겠습니다.
이 글은 2026년 6월 22일 기준 Vercel, Next.js, OWASP 공식 문서를 바탕으로 작성했습니다. 요금제와 플랫폼 기능은 변경될 수 있으므로 글 하단의 공식 문서도 함께 확인해주세요.
Vercel에 등록한 환경변수는 저장 시 암호화됩니다.
일반 환경변수는 프로젝트 접근 권한이 있는 사용자가 확인할 수 있으며, Production과 Preview에서는 값을 다시 읽을 수 없도록 Sensitive 옵션을 사용할 수도 있습니다.
하지만 환경변수를 안전하게 저장했다는 사실이 애플리케이션에서의 노출까지 막아주지는 않습니다.
다음과 같은 경우에는 값이 외부로 노출될 수 있습니다.
console.log로 출력한 경우환경변수는 비밀을 저장하는 방법이지, 어디에서 사용해도 안전하게 만들어주는 기능은 아닙니다.
NEXT_PUBLIC_ 변수에 넣는다Next.js는 NEXT_PUBLIC_ 접두사가 붙은 환경변수를 브라우저에서 사용할 수 있도록 빌드 결과에 포함합니다.
NEXT_PUBLIC_ANALYTICS_ID=public-value
위와 같이 브라우저에서 사용하도록 만들어진 공개 값에는 사용할 수 있습니다.
하지만 다음과 같은 값에는 사용하면 안 됩니다.
NEXT_PUBLIC_DATABASE_URL=...
NEXT_PUBLIC_SERVICE_ROLE_KEY=...
NEXT_PUBLIC_STRIPE_SECRET_KEY=...
NEXT_PUBLIC_JWT_SECRET=...
NEXT_PUBLIC_ 변수의 값은 빌드 시 브라우저에 전달되는 JavaScript에 포함될 수 있습니다. 사용자가 개발자 도구나 빌드 파일을 통해 값을 확인할 수 있다는 뜻입니다.
NEXT_PUBLIC_
DATABASE_URL
SERVICE_ROLE
SECRET_KEY
PRIVATE_KEY
JWT_SECRET
공개되어도 되는 값과 서버에서만 사용해야 하는 값을 구분해야 합니다.
Vercel에서 환경변수를 수정해도 이전에 생성된 배포에는 새로운 값이 적용되지 않습니다.
변경된 환경변수는 이후 만들어지는 새로운 배포부터 적용됩니다.
예를 들어 노출된 API Key를 교체하기 위해 Vercel 설정만 변경하고 다시 배포하지 않았다면 현재 실행 중인 배포는 기존 값을 계속 사용할 수 있습니다.
Secret을 교체할 때는 새 값을 적용할 배포와 기존 키의 폐기 시점을 함께 계획해야 서비스 중단을 줄일 수 있습니다.
Vercel은 기본적으로 다음 환경을 구분합니다.
Production이 아닌 Git 브랜치를 배포하면 일반적으로 Preview 배포가 생성됩니다. Preview 환경변수는 전체 비운영 브랜치 또는 특정 브랜치에 적용할 수 있습니다.
문제는 Preview가 운영 환경과 같은 비밀 값과 데이터베이스를 사용할 때 발생합니다.
| 환경 | 연결 대상 예시 |
|---|---|
| Development | 로컬 또는 개발용 DB |
| Preview | 테스트 DB, 테스트 API Key |
| Production | 운영 DB, 운영 API Key |
모든 서비스에서 반드시 별도의 DB를 사용해야 하는 것은 아닙니다. 하지만 Preview가 운영 데이터에 접근한다면 접근 권한과 테스트 데이터 처리 방식을 명확히 정해야 합니다.
Vercel은 브랜치나 커밋마다 고유한 Preview URL을 생성할 수 있습니다.
Preview 응답에는 검색엔진 수집을 막기 위한 x-robots-tag: noindex가 자동으로 추가될 수 있지만, 검색되지 않는 것과 비공개인 것은 다릅니다.
Deployment Protection이 적용되지 않은 배포는 URL을 가진 사람이 접근할 수 있습니다.
Vercel의 Standard Protection은 Production 도메인을 제외한 배포를 보호하는 용도로 사용할 수 있습니다. 적용 가능한 보호 방식과 범위는 요금제 및 프로젝트 설정에 따라 달라질 수 있습니다.
Preview URL을 추측하기 어렵게 만드는 것보다 접근 권한을 설정하는 것이 중요합니다.
Vercel Deployment Protection 공식 문서
Vercel에 배포된 Next.js Route Handler와 API Route는 외부에서 요청할 수 있는 HTTP 엔드포인트입니다.
Vercel이 서버를 실행해준다고 해서 애플리케이션의 API에 사용자 인증과 권한 검사가 자동으로 추가되는 것은 아닙니다.
다음 두 가지를 구분해야 합니다.
예를 들어 로그인한 사용자라 하더라도 URL의 예약 ID만 변경해서 다른 사용자의 예약을 조회할 수 있다면 권한 검사가 부족한 것입니다.
Next.js의 Server Action도 데이터 변경 작업을 수행한다면 호출 사용자의 권한을 확인해야 합니다.
Vercel의 공식 공동 책임 모델에서도 애플리케이션의 인증과 사용자 접근 관리는 고객 책임으로 구분합니다.
Next.js Backend for Frontend 공식 문서
브라우저 화면에서 필수 항목과 글자 수를 검사해도 사용자는 API를 직접 호출할 수 있습니다.
따라서 프론트엔드 검사는 사용자 편의를 위한 기능으로 보고, 서버에서 입력값을 다시 검증해야 합니다.
예를 들어 화면에서 예약 인원을 1명 이상으로 제한했더라도 API에 -100을 직접 전달할 수 있습니다.
클라이언트와 서버 검증은 목적이 다릅니다.
OWASP도 클라이언트 검증은 우회할 수 있으므로 서버 측 검증을 함께 구현하도록 안내합니다.
OWASP Input Validation Cheat Sheet
Vercel Functions에서 console.log, console.error 등으로 출력한 값은 Runtime Logs에서 확인할 수 있습니다.
Runtime Logs에는 Preview와 Production 함수에서 출력한 내용이 포함될 수 있으며, 프로젝트에서 로그를 볼 수 있는 권한을 가진 사용자에게 노출될 수 있습니다.
디버깅을 위해 요청 전체를 출력하면 다음 정보가 함께 기록될 수 있습니다.
console.log(request.headers);
console.log(await request.json());
console.log(process.env);
console.log(user);
객체 전체를 출력하기보다 문제 확인에 필요한 값만 선택해서 기록해야 합니다.
console.log({
event: "reservation_created",
requestId,
userId,
success: true,
});
사용자 ID도 서비스 상황에 따라 마스킹하거나 내부 식별자로 대체할 수 있습니다.
Vercel은 배포 응답에 HSTS와 같은 일부 헤더를 기본으로 제공합니다.
하지만 다음과 같은 보안 정책까지 모든 서비스에 맞게 자동으로 만들어주는 것은 아닙니다.
특히 CSP는 서비스가 사용하는 스크립트, 이미지, API, 외부 서비스에 따라 허용 범위가 달라지므로 애플리케이션에 맞춰 구성해야 합니다.
Vercel에서는 프레임워크 설정이나 vercel.json을 이용해 응답 헤더를 추가할 수 있습니다.
{
"headers": [
{
"source": "/(.*)",
"headers": [
{
"key": "X-Content-Type-Options",
"value": "nosniff"
},
{
"key": "Referrer-Policy",
"value": "strict-origin-when-cross-origin"
}
]
}
]
}
보안 헤더는 무조건 많이 넣는 것이 목적이 아닙니다. 서비스 기능을 깨뜨리지 않는지 Preview에서 테스트한 뒤 적용해야 합니다.
OWASP HTTP Headers Cheat Sheet
Vercel은 요청, 데이터 전송, 빌드, Functions 실행 등 여러 자원의 사용량을 측정합니다.
기능 오류, 반복 요청, 자동화된 공격 또는 갑작스러운 트래픽으로 사용량이 증가할 수 있습니다.
Vercel Dashboard의 Usage에서 프로젝트별 사용량과 예상 비용을 확인할 수 있습니다.
Pro 팀은 Spend Management를 이용해 설정 금액에 도달했을 때 다음 작업을 구성할 수 있습니다.
주의할 점은 금액을 설정하는 것만으로 프로젝트가 자동 중지되는 것은 아니라는 것입니다.
프로젝트 중지를 원한다면 해당 옵션을 별도로 활성화해야 합니다. 중지되면 정상 사용자도 서비스에 접근할 수 없으므로 운영 영향을 함께 고려해야 합니다.
플랫폼 비용 설정만 믿기보다 로그인, 문의, 예약, AI API처럼 반복 호출될 수 있는 기능에도 적절한 요청 제한을 두는 것이 좋습니다.
NEXT_PUBLIC_ 변수에는 공개 가능한 값만 넣었다.env 파일이 Git 저장소에 포함되지 않았다Vercel은 웹앱을 빠르게 배포하고 운영할 수 있게 도와주는 플랫폼입니다.
하지만 플랫폼에 배포했다는 이유만으로 애플리케이션의 인증, 권한, 입력값, 환경변수까지 자동으로 보호되는 것은 아닙니다.
처음부터 모든 항목을 확인하기 어렵다면 다음 세 가지부터 점검해보세요.
이 세 가지는 소스코드와 Vercel 프로젝트 설정에서 바로 확인할 수 있습니다.
배포 성공 화면을 확인한 뒤에는 실제 사용자가 접근하는 경로와 권한도 함께 점검해야 합니다.