AI(Cursor·ChatGPT·Claude)로 빠르게 만든 서비스에서 반드시 확인해야 할 보안 항목입니다.
Supabase RLS, API 키 노출, 인증 취약점, 개인정보보호법까지 한 번에 점검하세요.
.env 파일이 GitHub에 올라가 있지 않은가?
git log --all -- .env 명령으로 커밋 이력을 확인하세요. 한 번이라도 올라갔다면 키를 즉시 재발급해야 합니다.
NEXT_PUBLIC_ 접두사로 서버 API 키를 노출하지 않는가?
NEXT_PUBLIC_ 변수는 브라우저 JS 번들에 포함됩니다. DB 비밀번호, 서버 전용 API 키는 절대 사용 금지.
프론트엔드 JS 코드에 API 키를 하드코딩하지 않았는가?
F12 개발자 도구 → Sources 탭에서 검색 가능합니다. 빌드 후 번들 파일을 직접 확인하세요.
Vercel/배포 환경에 환경변수가 올바르게 설정되어 있는가?
Vercel 대시보드 → Settings → Environment Variables. Preview/Production 환경별로 확인하세요.
Supabase 모든 테이블에 RLS(Row Level Security)가 활성화되어 있는가?
Supabase 기본값은 RLS 비활성화입니다. Authentication → Policies에서 확인. RLS 없이 anon 키만 있으면 DB 전체가 공개됩니다.
Firebase Firestore/Realtime DB에 보안 규칙이 설정되어 있는가?
"allow read, write: if true" 규칙은 누구나 데이터를 읽고 쓸 수 있습니다. 반드시 인증 기반 규칙으로 변경하세요.
phpMyAdmin, pgAdmin 등 DB 관리 패널이 인터넷에 노출되어 있지 않은가?
관리 패널은 IP 화이트리스트 또는 VPN 뒤에만 위치해야 합니다. /phpmyadmin, /adminer 경로를 차단하세요.
SQL 쿼리에 사용자 입력을 직접 연결하지 않는가?
query(`SELECT * FROM users WHERE id = ${userId}`) 패턴은 SQL 인젝션에 취약합니다. Parameterized Query를 사용하세요.
모든 API 엔드포인트에 인증 검증이 있는가?
AI가 생성한 API Route는 인증 미들웨어가 빠지는 경우가 많습니다. /api/ 하위 모든 경로를 확인하세요.
JWT 토큰을 verify()로 검증하는가? (decode() 아님)
jwt.decode()는 서명 없이 파싱만 합니다. 위조 토큰이 통과됩니다. 반드시 jwt.verify(token, secret)을 사용하세요.
로그인 API에 Rate Limiting이 설정되어 있는가?
제한 없이는 1초에 수천 번 비밀번호 시도(브루트포스)가 가능합니다. 5회 실패 시 1분 잠금 등을 구현하세요.
쿠키에 httpOnly, secure, sameSite 속성이 설정되어 있는가?
Set-Cookie: session=abc; HttpOnly; Secure; SameSite=Strict 세 가지가 모두 있어야 XSS·CSRF 방어가 됩니다.
비밀번호를 평문이 아닌 bcrypt/argon2로 해시 저장하는가?
DB가 유출되어도 해시된 비밀번호는 바로 사용할 수 없습니다. MD5, SHA1은 취약하므로 bcrypt(cost≥12)를 사용하세요.
사용자 입력을 HTML에 그대로 출력하지 않는가?
사용자 입력을 innerHTML로 주입하면 XSS 공격이 가능합니다. React의 dangerouslySetInnerHTML 사용을 지양하고 DOMPurify로 정화하세요.
CORS 설정에서 origin: "*" 와일드카드를 사용하지 않는가?
Access-Control-Allow-Origin: * 는 모든 도메인에서 API 호출을 허용합니다. 허용 도메인을 명시적으로 지정하세요.
파일 업로드 시 확장자·MIME 타입·파일 크기를 검증하는가?
.php, .jsp 등 실행 가능한 파일 업로드를 차단하세요. 확장자만으로는 부족하고 실제 파일 내용(매직 바이트)도 검증해야 합니다.
클라이언트에서 받은 금액·수량을 서버에서 재검증하는가?
프론트에서 전달한 price, amount를 그대로 결제에 사용하면 가격 조작 공격이 가능합니다. 반드시 서버 DB에서 가격을 조회하세요.
서버 오류 메시지를 클라이언트에 그대로 노출하지 않는가?
스택 트레이스, DB 테이블명, 파일 경로가 노출되면 공격자의 정찰에 활용됩니다. 일반화된 오류 메시지만 반환하세요.
X-Powered-By 헤더를 숨겼는가?
next.config.js에 poweredByHeader: false 한 줄 추가로 프레임워크 정보 노출을 차단합니다.
HTTPS가 강제 적용되어 있는가?
HTTP로 접근 시 HTTPS로 자동 리다이렉트되어야 합니다. Vercel은 자동 적용되지만 커스텀 서버라면 확인하세요.
관리자 페이지(/admin, /dashboard)가 인터넷에 노출되어 있지 않은가?
IP 제한, VPN, 또는 강력한 인증(MFA)을 적용하세요. 기본 경로명 사용은 자동화 스캐너의 표적이 됩니다.
npm 패키지에 알려진 취약점이 없는가?
npm audit 명령으로 정기 점검하세요. High 이상 취약점은 즉시 패치가 필요합니다.
개인정보 수집 항목과 이용 목적을 고지하고 동의를 받는가?
개인정보보호법 제15조: 수집 항목, 이용 목적, 보유 기간을 명시하고 명시적 동의를 받아야 합니다.
개인정보처리방침이 사이트에 게시되어 있는가?
개인정보보호법 제30조: 이메일 1건이라도 수집하면 처리방침 공개가 의무입니다. 접근하기 쉬운 위치에 배치하세요.
개인정보를 암호화하여 저장하는가?
개인정보보호법 제29조 안전성확보조치: 주민번호, 비밀번호, 신용카드 번호는 반드시 암호화 저장이 의무입니다.
개인정보 보유 기간을 설정하고 파기 절차가 있는가?
목적 달성 후 지체 없이 파기해야 합니다. DB에 탈퇴 회원 데이터가 무기한 남아있는지 확인하세요.
만 14세 미만 아동의 개인정보를 수집할 경우 법정대리인 동의를 받는가?
개인정보보호법 제22조: 아동 대상 서비스는 법정대리인 동의 절차가 별도로 필요합니다.
바이브 코딩으로 서비스를 만들고 운영할 때 반드시 지켜야 할 10가지 원칙입니다. 이 10계명만 지켜도 주요 보안 사고의 80% 이상을 예방할 수 있습니다.
.env 파일은 절대 GitHub에 올리지 않는다
.gitignore에 .env, .env.local, .env.production을 반드시 추가하세요. 한 번이라도 올라간 키는 즉시 재발급해야 합니다.
Supabase 모든 테이블에 RLS를 활성화한다
테이블 생성 즉시 RLS를 켜고 정책(Policy)을 작성하세요. RLS 없는 테이블은 anon 키만으로 전체 데이터에 접근 가능합니다.
AI에게 보안 요구사항을 명시적으로 지시한다
"RLS 정책도 함께", "JWT verify() 사용", "파라미터화된 쿼리 사용" 등을 프롬프트에 반드시 포함하세요.
모든 API 엔드포인트에 인증 검증을 추가한다
/api/ 하위 모든 라우트에 세션 또는 JWT 검증을 적용하세요. AI가 생성한 코드에서 가장 자주 빠지는 항목입니다.
JWT는 반드시 verify()로 검증한다
jwt.decode()는 서명 없이 파싱만 합니다. 위조 토큰이 그대로 통과됩니다. jwt.verify(token, secret)을 사용하세요.
클라이언트 입력값을 서버에서 재검증한다
가격, 수량, 권한 레벨은 절대 프론트엔드에서 전달한 값을 그대로 사용하지 마세요. 반드시 서버 DB에서 조회하세요.
HTTP 보안 헤더 6종을 설정한다
HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy — next.config.js에 추가하세요.
쿠키에 HttpOnly·Secure·SameSite를 설정한다
세션 쿠키에 이 세 가지 속성이 없으면 XSS와 CSRF 공격에 취약합니다. 배포 전 브라우저 개발자 도구에서 반드시 확인하세요.
배포 후 SecuFi로 즉시 점검한다
URL 하나, 30초, 무료. 새 기능을 배포할 때마다 점검을 루틴으로 만드세요. 취약점은 빠를수록 쉽게 고칠 수 있습니다.
개인정보처리방침을 반드시 게시한다
이메일 하나만 수집해도 개인정보처리방침 공개가 법적 의무입니다. 개인정보보호법 위반 시 과태료가 부과됩니다.
A. 네, 지금 바로 점검하시는 것을 강력히 권장합니다. 바이브 코딩으로 만든 서비스에서 가장 흔히 발견되는 취약점(Supabase RLS 미설정, API 키 노출, 인증 없는 API)은 배포 후 수일 내에 자동화 봇에 의해 발견될 수 있습니다. SecuFi에서 URL을 입력하면 30초 안에 주요 취약점을 무료로 점검받을 수 있습니다. 특히 실제 사용자가 있는 서비스라면 개인정보 유출 위험이 있으므로 즉시 점검이 필요합니다.
A. 괜찮지 않습니다. Supabase의 anon(익명) API 키는 클라이언트 측 JavaScript 코드에 포함되어 누구나 볼 수 있습니다. RLS(Row Level Security)가 비활성화된 상태에서는 이 anon 키만으로 DB의 모든 테이블을 자유롭게 조회·수정·삭제할 수 있습니다. 즉, 악의적인 사용자가 브라우저 개발자 도구에서 anon 키를 복사해 curl 명령 하나로 전체 회원 데이터를 가져갈 수 있습니다. Supabase 대시보드의 Authentication → Policies에서 즉시 RLS를 활성화하고 정책을 추가하세요.
A. 항상 취약한 것은 아니지만, 보안 요구사항을 명시하지 않으면 취약점이 포함될 가능성이 높습니다. AI는 요청한 기능을 구현하는 데 최적화되어 있어, 인증 검증·Rate Limiting·입력값 검증·암호화 같은 보안 로직은 별도로 요청하지 않으면 빠지는 경우가 많습니다. 해결책은 간단합니다. 프롬프트에 보안 요구사항을 명시하세요. "RLS 정책도 함께 작성해줘", "JWT verify() 사용해줘", "SQL 인젝션 방어해줘" 같은 지시를 추가하면 AI가 더 안전한 코드를 생성합니다.
A. 이메일 주소 하나만 수집해도 개인정보처리방침 공개(제30조)와 수집 동의(제15조)가 법적 의무입니다. 위반 시 과태료는 최대 3,000만 원이며, 유출 사고 발생 시 손해배상 책임도 집니다. 주요 의무 사항은 다음과 같습니다: 개인정보 수집 전 항목·목적·보유기간 고지 및 동의 받기, 사이트 내 개인정보처리방침 게시, 비밀번호 등 민감 정보 암호화 저장, 보유 목적 달성 후 파기 절차 운영. 1인 바이브 코딩 개발자도 예외 없이 적용됩니다.
A. 무료 점검은 URL 입력 후 30초 안에 A~F 등급과 주요 취약점 목록을 제공합니다. 유료 상세 리포트는 A4 8페이지 분량으로, 각 취약점의 CVSS 심각도 점수, 공격 시나리오 설명, 코드 레벨 수정 가이드, OWASP Top 10 매핑, 개인정보보호법·AI기본법 준수 체크리스트가 포함됩니다. 투자자 실사, 기업 감사 대응, ISMS 인증 준비, 외주 개발사 보안 검수 자료로 활용할 수 있습니다.
A. 최소 월 1회, 새로운 기능을 배포할 때마다 점검하는 것을 권장합니다. 바이브 코딩 서비스는 업데이트가 빈번하기 때문에 새 코드를 배포할 때마다 새로운 취약점이 생길 수 있습니다. 권장 점검 시점: 1) 서비스 최초 배포 직후, 2) 로그인·결제·회원가입 등 핵심 기능 추가 시, 3) 외부 API 또는 라이브러리 추가 시, 4) 매월 정기 점검. SecuFi 무료 점검을 배포 루틴에 포함하고, 중요 서비스는 유료 상세 리포트로 분기별 심층 점검을 추천합니다.