바이브코딩 보안 체크리스트: 만든 서비스를 공개하기 전에 확인할 12가지

AI가 보안 점검을 마쳤다고 말해도 실제 서비스가 안전하다는 뜻은 아니에요. 공개 전에는 비밀 키, 로그인과 권한, XSS·CSRF·SSRF, 파일과 외부 URL, 의존성, 보안 로그를 실제 배포 환경에서 확인해야 합니다.

핵심 요약

바이브코딩으로 만든 서비스를 공개하려고 하면 이런 걱정이 생깁니다.

“기능은 작동하는데, 보안 문제는 괜찮을까요?”

AI에게 “보안도 확인해줘”라고 요청하면 환경변수와 몇 개의 설정을 살핀 뒤 안전하다고 답할 수 있습니다. 하지만 AI의 완료 보고는 코드를 검토했다는 뜻이지, 실제 서비스의 모든 권한과 운영 환경을 검증했다는 뜻은 아니에요.

바이브코딩으로 만든 서비스만 특별히 위험한 것은 아닙니다. 사람이 직접 작성한 코드에도 보안 문제는 생깁니다. 차이는 만드는 속도가 빨라진 만큼 로그인, 데이터 저장과 외부 서비스가 어떻게 연결됐는지 확인하지 않고 공개하기도 쉬워졌다는 데 있어요.

2025년 OWASP Top 10 (새 탭에서 열림)도 웹 애플리케이션의 주요 위험으로 잘못된 접근 권한, 보안 설정 오류, 소프트웨어 공급망 문제, 인증 실패와 보안 로그 누락 등을 다룹니다. 이 글에서는 이 항목을 바이브코딩 입문자가 실제로 확인할 수 있는 순서로 바꿔 살펴보겠습니다.

체크리스트의 범위부터 정해요

보안 점검은 “이제 절대 문제가 생기지 않는다”는 도장을 받는 일이 아닙니다. 어떤 데이터와 기능이 노출될 수 있는지 찾고, 문제가 생길 가능성과 피해를 줄이는 일에 가깝습니다.

이 글은 일반적인 웹 애플리케이션을 공개하기 전 확인할 최소 기준입니다. 건강 정보, 금융 정보, 대규모 개인정보처럼 피해가 큰 데이터를 다루거나 회사의 보안·법무 기준을 적용해야 한다면 별도의 전문가 검토와 조직의 절차가 필요할 수 있어요.

점검을 시작할 때는 먼저 서비스의 입구를 적어보세요.

로그인 없이 보는 공개 페이지
로그인한 사용자의 페이지
관리자 페이지
API와 Server Action
외부 서비스가 호출하는 웹훅
데이터베이스와 파일 저장소
결제·이메일·AI 같은 외부 서비스

이 목록이 있어야 홈페이지 화면만 확인하고 실제 데이터가 오가는 서버 요청을 놓치지 않습니다.

1. 꼭 필요한 데이터만 받고 있는지 확인해요

보유하지 않은 데이터는 유출될 수도 없습니다. 먼저 서비스가 받는 모든 입력 항목과 저장 위치를 표로 뽑아보세요.

데이터 | 받는 이유 | 저장 위치 | 볼 수 있는 사람 | 지우는 시점

문의에 답하는 데 이메일만 필요하다면 생년월일과 상세 주소까지 미리 받을 이유는 없습니다. 관리자 메모에도 업무에 필요하지 않은 민감한 내용을 자유롭게 적게 두지 않는 편이 좋아요.

다음 질문을 확인하세요.

개인정보처리방침을 만들어두는 것과 실제 코드가 필요한 데이터만 받는 것은 다른 일입니다. 화면의 안내와 실제 저장 내용이 같은지 확인해야 해요.

2. 비밀 키가 코드와 브라우저에 나오지 않는지 확인해요

데이터베이스 연결 문자열, 결제 비밀 키, 이메일 발송 키와 관리자용 토큰은 서버만 알아야 하는 비밀값입니다.

다음 위치를 검색하세요.

로컬에서는 Git에서 제외한 .env에, 배포 환경에서는 Vercel 같은 서비스의 환경변수 설정에 값을 둡니다. Vercel은 운영·미리보기 환경의 값을 읽을 수 없게 저장하는 Sensitive Environment Variables (새 탭에서 열림)도 제공합니다.

GitHub의 push protection (새 탭에서 열림)은 지원하는 비밀값이 저장소에 올라가기 전에 push를 막는 데 도움을 줍니다. 하지만 자동 탐지가 모든 키를 찾아주는 것은 아니므로 직접 확인도 필요해요.

키가 한 번 노출됐다면 파일에서 문자를 지우는 것으로 끝나지 않습니다. Git 기록이나 로그, 다른 사람이 복사한 곳에 남아 있을 수 있으므로 해당 서비스에서 기존 키를 폐기하고 새 키를 발급해야 합니다.

API 키와 환경변수를 다루는 방법에서 공개용 키와 서버 비밀 키를 구분하는 기준을 더 자세히 확인할 수 있어요.

3. 로그인과 세션의 전체 흐름을 확인해요

로그인 버튼을 눌러 내 이름이 보인다고 인증 기능이 완성된 것은 아닙니다.

다음 흐름을 실제로 시험하세요.

비밀번호 저장과 세션 처리를 처음부터 직접 만들기보다 검증된 인증 서비스와 라이브러리를 사용하는 편이 안전합니다. 인증은 사용자가 누구인지 확인하는 일이고, 그 사람이 어떤 데이터를 볼 수 있는지 정하는 권한은 다음 단계에서 별도로 검사해야 해요.

세션 쿠키는 브라우저 JavaScript에서 읽을 필요가 없다면 HttpOnly로 두고, 실제 서비스에서는 HTTPS에서만 전송되도록 Secure를 사용합니다. SameSite는 외부 사이트에서 시작한 요청에 쿠키를 보낼 범위를 정합니다. 구체적인 값은 로그인 방식과 외부 결제·인증 흐름에 따라 달라질 수 있으므로 인증 라이브러리의 기본값과 OWASP 세션 관리 가이드 (새 탭에서 열림)를 함께 확인하세요.

회원가입·세션·권한의 차이를 먼저 이해하면 로그인 화면 밖에서 무엇을 확인해야 하는지 찾기 쉽습니다.

4. 중요한 권한은 서버에서 검사해요

관리자 메뉴를 숨기거나 다른 사용자의 수정 버튼을 화면에서 없애는 것은 사용성을 위한 처리입니다. 보안 경계는 서버에 있어야 해요.

최소한 다음 네 상태를 준비하세요.

로그아웃 상태
일반 사용자 A
일반 사용자 B
관리자

그리고 테스트 데이터로 다음을 확인합니다.

OWASP는 잘못된 접근 권한을 2025년에도 가장 중요한 웹 애플리케이션 위험으로 분류 (새 탭에서 열림)하고, 기본적으로 거부한 뒤 모든 요청에서 권한을 확인하라고 권합니다. Next.js 인증 가이드 (새 탭에서 열림)도 화면 요소를 숨기는 것만으로는 부족하며 Server Action을 포함한 서버 작업이 자체적으로 권한을 검사해야 한다고 설명합니다.

테스트할 때는 실제 고객의 ID를 추측하거나 데이터를 변경하지 마세요. 내가 만든 테스트 계정과 테스트 데이터만 사용하고, 조회·수정·삭제 각각이 올바르게 거부되는지 확인합니다.

5. 데이터베이스와 파일 저장소의 접근 경로를 구분해요

Supabase를 사용한다고 모든 프로젝트의 보안 설정이 같은 것은 아닙니다. 브라우저가 Data API로 직접 접근하는 구조와 서버가 PostgreSQL에 직접 연결하는 구조는 권한을 검사하는 위치가 달라요.

브라우저 → Supabase Data API → 데이터베이스
권한 검사: RLS 정책

브라우저 → 내 서버 → 데이터베이스
권한 검사: 서버 코드와 데이터 접근 계층

브라우저에서 Supabase Data API로 노출된 테이블에 접근한다면 Supabase 공식 문서 (새 탭에서 열림)의 안내처럼 RLS를 켜고 필요한 작업별 정책을 만들어야 합니다. SELECT가 안전하다고 UPDATEDELETE도 자동으로 안전해지는 것은 아니므로 각각 시험하세요.

RLS를 우회할 수 있는 service_role 키나 서버용 비밀 키는 브라우저 코드에 넣으면 안 됩니다. 공개용 키와 이름이 비슷해도 권한 범위가 다르므로 AI가 어떤 키를 어디에서 사용하는지 함께 보고하게 하세요.

서버가 데이터베이스에 직접 연결한다면 RLS만 켜고 안심할 수 없습니다. 서버 요청마다 현재 사용자와 데이터 소유자, 역할을 확인해야 해요. 두 방식의 차이는 Supabase 서버 접근을 추천하는 이유Supabase RLS를 설정하는 방법에서 각각 살펴볼 수 있습니다.

파일 저장소도 같은 기준으로 확인하세요.

데이터베이스 행의 권한과 파일 주소의 권한은 별개일 수 있습니다.

6. 서버가 입력값과 실행 경로를 제한해요

화면에서 필수 입력을 표시하고 글자 수를 제한해도 요청값은 직접 바꿔 보낼 수 있습니다. 서버는 브라우저의 검사를 믿지 말고 형식과 범위를 다시 확인해야 해요.

입력값이 데이터베이스 쿼리, 운영체제 명령과 파일 경로에 그대로 들어가면 SQL 주입, 명령어 주입과 경로 탐색 같은 문제가 생길 수 있습니다. OWASP 입력값 검증 가이드 (새 탭에서 열림)는 가능한 입력의 형식과 범위를 서버에서 확인하는 허용 목록 방식과 길이 제한을 권합니다.

7. 사용자 입력을 화면에 안전하게 표시해요

게시글, 댓글, 관리자 메모와 Markdown처럼 사용자가 입력한 내용을 다시 화면에 보여줄 때는 XSS를 확인해야 합니다. 악성 스크립트가 실행되면 다른 사용자의 화면에서 계정 작업을 수행하거나 민감한 내용을 읽을 수 있어요.

React는 일반적인 문자열을 화면에 표시할 때 기본적으로 이스케이프합니다. 하지만 다음 기능은 별도로 확인해야 합니다.

OWASP XSS 방지 가이드 (새 탭에서 열림)는 React 같은 프레임워크도 dangerouslySetInnerHTML과 안전하지 않은 URL처럼 기본 보호를 벗어나는 지점을 따로 확인해야 한다고 설명합니다.

Content Security Policy(CSP)는 실행할 스크립트와 불러올 외부 출처를 제한해 피해를 줄일 수 있습니다. 다만 CSP 하나로 XSS가 사라지는 것은 아니므로 안전한 렌더링을 먼저 적용하고 추가 방어선으로 사용하세요.

8. 쿠키를 사용하는 변경 요청은 CSRF를 확인해요

브라우저는 요청을 보낼 때 로그인 쿠키를 자동으로 포함할 수 있습니다. 공격자가 다른 사이트에서 만든 요청이 내 서비스의 수정·삭제·결제 작업으로 처리되면 CSRF 문제가 됩니다.

다음 항목을 확인하세요.

SameSite 쿠키는 도움이 되지만 모든 구조에서 CSRF 방어를 대신하지는 않습니다. OWASP CSRF 방지 가이드 (새 탭에서 열림)를 기준으로 현재 인증 방식에 맞는 토큰이나 요청 출처 검사를 적용하세요.

9. 업로드 파일과 외부 URL을 제한해요

이미지, 이력서와 문서 업로드는 사용자가 만든 파일을 서버와 저장소에 들여오는 입구입니다.

OWASP 파일 업로드 가이드 (새 탭에서 열림)는 필요한 확장자만 허용하고 파일 형식과 크기를 확인하며, 애플리케이션이 새 파일명을 만들고 허가된 사용자만 업로드하게 하라고 안내합니다.

사용자가 입력한 URL을 서버가 대신 열어 미리보기, 이미지 가져오기나 문서 분석을 제공한다면 SSRF도 확인해야 합니다. 서버가 localhost, 사설 네트워크와 클라우드 내부 주소에 접근하지 못하게 하고, 가능한 경우 허용한 도메인과 프로토콜만 요청하세요. 리디렉션을 따라간 뒤의 최종 주소도 같은 기준으로 검사해야 합니다.

OWASP SSRF 방지 가이드 (새 탭에서 열림)는 목적지가 정해져 있다면 허용 목록을 사용하고, 외부 주소를 받아야 한다면 프로토콜·도메인·IP와 리디렉션을 함께 제한하라고 안내합니다.

10. 반복 요청과 웹훅의 출처를 확인해요

로그인, 비밀번호 재설정과 인증 코드 발송을 누구나 무한히 실행할 수 있으면 계정 공격과 메시지 폭탄에 악용될 수 있습니다. AI 답변, 이메일 발송과 파일 처리처럼 비용이 드는 기능도 같은 문제가 생겨요.

결제와 이메일 서비스가 보내는 웹훅도 요청 주소만 보고 믿으면 안 됩니다. 제공자가 지원하는 서명을 검증하거나 서버 API에서 이벤트와 금액·상태를 다시 조회하세요. 검증에 실패한 요청은 주문과 계정 상태를 바꾸지 않아야 합니다.

11. 의존성과 운영 설정을 점검해요

AI는 기능을 만들면서 여러 라이브러리와 외부 스크립트를 설치할 수 있습니다. 설치한 구성요소와 운영 설정도 공격 표면에 포함됩니다.

GitHub Dependabot security updates (새 탭에서 열림)는 알려진 취약점에 수정 버전이 있으면 업데이트 pull request를 만들 수 있습니다. 보안 업데이트는 실제 사용 여부와 영향 범위를 확인한 뒤 빌드와 핵심 기능을 다시 테스트하세요.

OWASP 보안 응답 헤더 가이드 (새 탭에서 열림)를 참고하되 설정을 그대로 복사하지는 마세요. 로그인, 이미지와 외부 스크립트가 사용하는 출처를 먼저 파악하고 실제 배포 주소에서 동작을 확인해야 합니다.

12. 오류 노출과 보안 로그를 확인해요

사용자 화면에 데이터베이스 쿼리, 내부 파일 경로와 전체 오류 스택을 그대로 보여주면 서비스 구조를 불필요하게 노출합니다. 화면에는 사용자가 다음 행동을 정할 안내를 보여주고, 원인을 찾을 정보는 접근이 제한된 운영 로그에 남기세요.

로그에는 다음 사건이 필요합니다.

비밀번호, 세션 토큰, API 키, 데이터베이스 연결 문자열과 결제 카드 정보는 로그에 그대로 남기면 안 됩니다. OWASP 로깅 가이드 (새 탭에서 열림)도 인증·권한 실패와 중요한 관리 작업을 기록하되, 접근 토큰과 주요 비밀값·민감한 개인정보는 제거하거나 가리도록 안내합니다.

기록이 있어도 아무도 보지 않으면 문제를 늦게 발견합니다. 중요한 실패가 반복되면 운영자가 알림을 받을 수 있는지도 확인하세요. 로그가 무엇이고 왜 필요한지에서 배포 로그와 사용자 행동 기록의 차이를 살펴볼 수 있습니다.

AI 기능을 연결했다면 도구 권한을 확인해요

사용자의 질문, 업로드 문서와 웹 검색 결과에는 AI의 지시를 바꾸려는 문장이 들어 있을 수 있습니다. 프롬프트에 “이 지시를 무시해”라는 문구를 막는 것만으로는 충분하지 않아요. AI가 어떤 결정을 하더라도 서버가 허용된 작업만 실행하게 해야 합니다.

OWASP 프롬프트 인젝션 방지 가이드 (새 탭에서 열림)는 AI 에이전트가 도구를 호출할 때 사용자 권한과 세션을 다시 확인하고, 도구별 입력값 검증과 최소 권한을 적용하라고 권합니다.

실제 배포 환경에서 다시 확인해요

로컬 코드가 안전해 보여도 운영 환경의 키, 쿠키, CORS와 데이터베이스 정책이 다를 수 있습니다. 실제 주소에 출시 후보 버전을 배포한 뒤 테스트 계정으로 로그인·권한·XSS·CSRF·파일·웹훅 흐름을 다시 확인하세요.

AI가 Vercel·Supabase 같은 외부 대시보드에 접근하지 못했다면 해당 설정을 추측으로 통과 처리하지 않습니다. 확인할 수 없는 항목을 따로 남기고 운영자가 직접 확인해야 해요. 위험한 명령과 운영 환경 접근을 반복해서 막아야 한다면 클로드코드 훅의 PreToolUse 설정도 함께 살펴보세요.

로컬 작업의 반복 승인을 줄이는 것과 안전 경계를 없애는 것은 다릅니다. 클로드코드 Auto mode와 코덱스의 Approve for me가 어떤 검토를 대신하고, 어떤 작업은 사람이 직접 확인해야 하는지는 두 자동 승인 방식의 차이에서 확인할 수 있습니다.

백업, 되돌리기, 중복 클릭과 모바일 같은 운영·품질 항목은 웹앱 공개 전 테스트 체크리스트에서 이어서 점검할 수 있습니다.

클로드코드에서 /security-review를 실행해요

클로드코드를 사용하는 프로젝트라면 기능을 만든 뒤 다음 명령을 실행할 수 있습니다.

/security-review

Claude Code 명령어 공식 문서 (새 탭에서 열림)/security-review를 현재 브랜치의 변경분에서 보안 취약점을 찾는 읽기 전용 점검으로 설명합니다. Git diff를 살펴보며 주입, 인증·권한과 데이터 노출처럼 실제 피해로 이어질 수 있는 위험을 찾습니다. 실행 방법은 처음에 익힐 클로드코드 슬래시 명령어에서도 확인할 수 있어요.

로그인, 관리자 기능, 결제, 파일 업로드처럼 중요한 기능을 수정한 뒤 실행하면 사람이 놓친 변경을 한 번 더 확인하기 좋습니다. 발견한 항목에는 파일과 위치, 위험한 흐름과 수정 방향이 함께 나오는지 확인하고, 수정한 뒤 같은 명령을 다시 실행하세요.

다만 /security-review는 현재 브랜치의 변경분을 중심으로 봅니다. 이번에 수정하지 않은 기존 코드, Vercel·Supabase 대시보드의 실제 설정, 운영 데이터와 배포 주소의 동작까지 모두 확인해주는 명령은 아닙니다. 아래의 전체 점검 요청과 실제 배포 테스트를 함께 사용해야 합니다.

AI에게 읽기 전용 보안 점검을 요청하는 방법

처음부터 “취약점을 전부 고쳐줘”라고 하면 원래 상태와 수정 결과를 구분하기 어렵습니다. 먼저 코드와 배포 환경을 읽기 전용으로 확인하고 확인한 내용을 보고하게 하세요.

이 웹 애플리케이션을 공개하기 전에 보안 기준으로 감사해줘.
아직 코드를 수정하지 말고 읽기 전용으로 확인해.

실제 배포 주소: [https://내도메인.com]

먼저 아래 항목을 목록으로 정리해줘.
- 공개 페이지와 로그인 후 페이지
- 관리자 페이지
- API Route와 Server Action
- 외부 웹훅
- 데이터베이스와 파일 저장소 접근 경로
- 사용하는 인증·결제·이메일·AI 서비스
- 코드에서 사용하는 환경변수 이름

그다음 아래 12개 항목을 확인해줘.
1. 수집·저장하는 개인정보와 불필요한 데이터
2. 코드·Git·브라우저·로그의 비밀 키 노출
3. 가입·로그인·로그아웃·만료·재설정의 세션 흐름과 쿠키 설정
4. 사용자별·관리자별 서버 권한 검사
5. 데이터베이스와 파일 저장소의 접근 정책
6. 서버 입력값 검증과 SQL·명령어·경로 삽입 방지
7. HTML·마크다운·URL의 XSS 방지와 CSP
8. 쿠키 인증을 쓰는 상태 변경 요청의 CSRF 방어
9. 파일 업로드 제한과 서버가 가져오는 외부 URL의 SSRF 방어
10. 반복 요청 제한과 웹훅 서명·원본 데이터 재검증
11. 취약한 의존성, 개발용 설정, CORS와 보안 헤더
12. 오류 응답, 보안 로그, 비밀값과 개인정보 마스킹

AI가 파일·데이터베이스·외부 서비스 도구를 호출한다면 사용자 권한 전달, 도구 인자 검증, 최소 권한, 파괴적 작업 재확인과 프롬프트 인젝션 방어도 추가로 확인해줘.

결과는 아래 열을 가진 표로 작성해줘.
항목 | 상태 | 확인한 파일·설정·URL | 확인 내용 | 영향 | 권장 수정

상태는 통과 / 주의 / 실패 / 확인 불가 중 하나로 표시해.
코드에서 확인한 사실과 외부 대시보드에서 직접 확인해야 할 일을 구분해.
확인하지 못한 항목을 추측으로 통과 처리하지 마.
실제 고객 데이터를 조회·수정·삭제하지 마.
파괴적이거나 서비스에 부하를 주는 테스트를 실행하지 마.

감사 결과를 검토한 뒤 수정 범위를 나누어 요청합니다.

감사 결과에서 실패 항목부터 수정 계획을 만들어줘.
아직 수정하지 말고 작업별 영향과 검증 방법을 적어줘.

우선순위는 다음 순서로 정해.
1. 비밀 키와 개인정보 노출
2. 로그인·세션과 권한 우회
3. SQL 삽입·명령어 삽입·XSS·CSRF·SSRF
4. 웹훅·파일 업로드·AI 도구의 중요한 작업
5. 의존성·운영 설정·보안 로그

각 수정 뒤 어떤 테스트 계정과 방법으로 통과를 확인할지도 포함해.

보안은 변경 범위가 크므로 보고서를 검토하고 한 묶음씩 수정하는 편이 안전합니다. 수정 뒤에는 기존 핵심 기능이 계속 작동하는지도 다시 확인하세요.

공개 전 최소 보안 체크리스트

정리

바이브코딩 보안은 코드를 한 줄씩 외워서 검사하는 일이 아닙니다.

AI에게 보안 점검을 맡길 수는 있습니다. 다만 “안전합니다”라는 결론만 받지 말고, 무엇을 어디에서 확인했고 어떤 계정과 요청으로 검증했는지 구체적으로 설명하게 해야 합니다.

무료 바이브코딩 가이드 12장의 보안 점검 실습에서도 프로젝트를 공개하기 전 비밀 키와 권한을 확인하는 흐름을 따라 할 수 있어요.

#바이브코딩#보안#보안 체크리스트#개인정보#권한#API 키#배포#운영

인스타그램 @ddukddak.build · 페이스북 뚝딱