취약점 요약
3
Critical
5
High
7
Medium
4
Low
11
Pass
이 보고서는 바이브코딩(Cursor AI 활용) 방식으로 개발된 React/Vercel 서비스에서
실제로 자주 발견되는 보안 취약점 패턴을 기반으로 작성된 샘플입니다.
실제 감사 시에는 GitHub 레포 접근 권한 부여 후 소스코드 전수 점검을 수행합니다.
Critical 취약점
CRITICAL
API 키 클라이언트 번들 노출
Cursor AI가 생성한 코드에서 process.env.OPENAI_API_KEY를 클라이언트 컴포넌트(use client)에서 직접 참조. 빌드 결과물 JS 번들에 키가 평문 노출됨.
- 발견 패턴
// ❌ 클라이언트 컴포넌트에서 직접 참조 "use client" const response = await fetch('/api/rag', { headers: { 'Authorization': process.env.OPENAI_API_KEY } })- CVSS Score
- 9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N)
- 조치 방법
- 모든 외부 API 호출을 Next.js Route Handler(서버 전용)로 이전.
NEXT_PUBLIC_접두어 없는 환경변수는 서버에서만 접근 가능.
CRITICAL
인증 없는 RAG API 엔드포인트
개인 서사 처리 API(/api/analyze-story)에 인증 미들웨어 누락. 누구든 직접 요청 가능하여 LLM 비용 무제한 소모 및 개인정보 처리 가능.
- 재현 방법
curl -X POST https://your-app.vercel.app/api/analyze-story \ -H "Content-Type: application/json" \ -d '{"story": "임의 텍스트"}' # → 200 OK (인증 없이 LLM 호출됨)- 조치 방법
- NextAuth.js 세션 검증 또는 API 키 기반 인증 추가. Rate limiting(upstash/ratelimit 등) 적용 필수.
CRITICAL
개인정보 로그 평문 기록
console.log(userData) 패턴이 개인 서사(성명, 기념일, 연락처)를 Vercel 함수 로그에 평문으로 기록. Vercel 대시보드 접근 권한자 전원에게 노출.
- 관련 법규
- 개인정보보호법 제29조 (안전조치의무) — 개인정보 처리 기록 최소화 의무
- 조치 방법
- 프로덕션 환경에서 개인정보 필드 마스킹 후 로깅.
NODE_ENV === 'production'조건부 처리.
High 취약점
HIGH
CORS 와일드카드 설정
API 응답 헤더에 Access-Control-Allow-Origin: * 설정으로 모든 도메인에서 인증된 요청 허용. 9월 론칭 후 고객 세션 탈취 공격 가능.
- 조치 방법
next.config.js의headers()설정을 프로덕션 도메인만 허용하도록 화이트리스트 적용.
HIGH
미검증 파일 업로드 처리
주얼리 레퍼런스 이미지 업로드 시 파일 타입·크기 검증 없음. MIME 타입 위조 공격 및 서버 부하 유발 가능.
- 조치 방법
sharp라이브러리로 이미지 재처리 (서버 사이드 변환 시 악성 페이로드 제거). Vercel Blob 업로드 전 magic bytes 검증 추가.
HIGH
Vercel 환경변수 운영/개발 미분리
Preview 배포에서 Production DB URL이 그대로 사용됨. PR 미리보기 링크를 통한 운영 데이터 접근 가능.
- 조치 방법
- Vercel 프로젝트 설정 → Environment Variables에서 각 변수의 적용 환경(Production/Preview/Development)을 명시적으로 분리. Preview는 별도 스테이징 DB 지정.
감사 체크리스트 (30개 항목)
A. 인증 및 인가
2 Critical
- ✗ A-01. API 엔드포인트 인증 미들웨어 전수 점검
- ✗ A-02. JWT/세션 토큰 만료 및 갱신 로직
- ✓ A-03. 소셜 로그인 OAuth redirect_uri 검증
- ! A-04. 관리자 경로(/admin) 역할 기반 접근 제어
- ✓ A-05. CSRF 토큰 (Next.js App Router 기본 보호)
B. 환경변수 및 시크릿 관리
1 Critical · 1 High
- ✗ B-01. NEXT_PUBLIC_ 접두어 변수 중 민감정보 포함 여부
- ✗ B-02. .env 파일 .gitignore 포함 확인
- ! B-03. Vercel 환경변수 운영/스테이징/개발 분리
- ✓ B-04. GitHub Actions Secret 안전 보관
C. 개인정보 처리
1 Critical
- ✗ C-01. 개인정보 로깅 최소화 (console.log 전수 검색)
- ! C-02. 개인정보 처리방침 및 수집 동의 UI
- ✓ C-03. 전송 구간 TLS 암호화 (Vercel 기본 제공)
- ! C-04. 저장 데이터 암호화 (민감 필드 at-rest 암호화)
D. API 보안
2 High
- ✗ D-01. Rate Limiting 적용 (LLM API 비용 폭증 방지)
- ! D-02. CORS 허용 도메인 화이트리스트
- ✓ D-03. Content-Type 검증
- ✓ D-04. SQL Injection 불가 (Supabase ORM 기본 보호)
- ! D-05. 입력값 검증 (zod 등 schema validation)
E. Vercel 배포 환경
1 High
- ! E-01. Preview 배포 Password Protection 활성화
- ✓ E-02. Vercel Edge Network CDN 활성화
- ✗ E-03. 운영/스테이징 환경변수 분리
- ✓ E-04. Git 브랜치 보호 규칙 (main 직접 push 차단)
- ✓ E-05. Vercel Analytics + Sentry 에러 모니터링
감사 방법론
🔍
정적 분석 (SAST)
소스코드 전수 탐색. 위험 패턴 grep, 의존성 취약점 npm audit, ESLint security ruleset 적용.
🌐
동적 분석 (DAST)
실행 중인 Vercel Preview 환경 대상 Burp Suite 프록시 검사. API 엔드포인트 퍼징 및 인증 우회 시도.
📋
컴플라이언스 검토
개인정보보호법 제29조(안전조치) 준수 여부. 개인정보처리방침 항목 전수 검토. GDPR 대비 점검.
제안 작업 범위 및 산출물
| 주차 | 작업 범위 | 산출물 |
|---|---|---|
| 1주차 | 레포 접근 권한 수령 → SAST 전수 점검 → 취약점 1차 목록 작성 | 취약점 목록 초안 (CRITICAL/HIGH 즉시 공유) |
| 2주차 | DAST (Vercel Preview 환경) → CORS/인증/Rate Limiting 점검 → 개인정보 처리 흐름도 검토 | DAST 보고서 + 개인정보 흐름도 |
| 3주차 | Vercel 환경변수 분리 설정 작업 → CRITICAL/HIGH 취약점 직접 수정 (PR 제출) | 수정 PR 3~5건 + 수정 전/후 비교 보고서 |
| 4주차 | 재점검 (수정 후 검증) → 최종 보안 감사 보고서 + 운영 가이드 작성 | 최종 보안 감사 보고서 (PDF) + 운영 가이드 |
견적 안내
기본 감사 + 보고서: 100만원
기본 감사 + CRITICAL/HIGH 직접 수정 + 보고서: 150만원
전 항목 감사 + 전체 수정 + Vercel 환경 최적화 + 운영 가이드: 200만원
세금계산서 발행 가능 (사업자등록번호 보유). 정부지원사업 집행 처리 경험 다수.
기본 감사 + CRITICAL/HIGH 직접 수정 + 보고서: 150만원
전 항목 감사 + 전체 수정 + Vercel 환경 최적화 + 운영 가이드: 200만원
세금계산서 발행 가능 (사업자등록번호 보유). 정부지원사업 집행 처리 경험 다수.