---
name: secure-vibe-coding
description: >-
  Security and traffic-management rules for vibe-coded web apps, websites, and games.
  Use whenever writing, modifying, or deploying code for a web app, website, game, or API
  server — especially anything touching API keys or secrets, login/auth, databases, user
  input forms, file uploads, payments, leaderboards, websockets, or deployment/launch prep.
  Trigger even if the user never mentions security: requests like "게임 만들어줘",
  "사이트 만들어줘", "make me a website", "배포해줘", "deploy this" all count.
  Also use when the user asks for a security check (보안 점검) or worries about many
  concurrent users, traffic spikes, or server costs. Includes a read-only security scan
  script (scripts/security_check.py) to run before deployment.
---

# Secure Vibe Coding — 보안 & 트래픽 자동 적용 규칙

웹사이트/웹앱/게임을 만들 때 이 규칙을 **기본값으로** 적용한다.
사용자가 프롬프트에 보안·트래픽 요구사항을 쓰지 않아도 적용해야 한다.
이유: AI 생성 코드의 40~62%에서 보안 결함이 발견되며, 사용자는 보안을
매번 요청하는 것을 잊는다. 그것을 대신 기억하는 것이 이 스킬의 존재 이유다.

## 규칙 키워드

- **[NEVER]** — 절대 하지 마라. 예외 없음.
- **[MUST]** — 반드시 하라. 예외 없음.
- **[SHOULD]** — 기본적으로 하라. 안 할 경우 이유를 사용자에게 말하라.
- **[ASK-USER]** — 적용 전에 반드시 사용자에게 물어보고 허락을 받아라.

충돌 시 우선순위: `NEVER > MUST > ASK-USER > SHOULD`

## ⚠️ 최우선 규칙: 성능·품질 트레이드오프 시 사용자 허락

**[MUST]** 보안·트래픽 규칙 적용이 결과물의 **속도(FPS·응답속도·로딩시간),
그래픽 퀄리티, 게임 조작감, UX**에 체감될 만한 영향을 줄 경우,
적용 전에 반드시 아래 형식으로 사용자에게 물어라. 임의로 적용하지 마라:

```
⚠️ 보안/트래픽 규칙과 성능·품질이 충돌합니다.
- 적용하려는 규칙: (예: 게임 판정을 서버에서 처리)
- 영향: (예: 입력 반응이 약 50~100ms 느려질 수 있음)
- 선택지:
  A) 보안 우선 — 규칙 그대로 적용 (권장/비권장 표기)
  B) 성능 우선 — 규칙 완화 (감수해야 할 위험: ...)
어느 쪽으로 할까요?
```

반대로, 체감 영향이 없는 규칙(.env 사용, SQL 바인딩, 보안 헤더 등)은
**묻지 말고 그냥 적용하라.** 사소한 질문으로 사용자를 피곤하게 하지 마라.

## 항상 적용하는 핵심 규칙 (질문 불필요)

1. **[NEVER]** API 키·시크릿·DB 접속 문자열을 코드에 하드코딩하거나,
   프론트엔드(브라우저 전달 코드)에 넣지 마라. `NEXT_PUBLIC_`/`VITE_`/
   `REACT_APP_` 접두사 환경변수는 클라이언트에 노출된다 — 비밀 키 금지.
2. **[MUST]** 비밀 값은 `.env` + 배포 플랫폼 환경변수로만 관리. 프로젝트 생성
   즉시 `.gitignore`에 `.env` 추가, `.env.example`(값 비운 버전) 생성.
3. **[MUST]** 유료/비밀 API는 서버(API 라우트) 프록시를 거쳐 호출. 키는 서버에만.
4. **[MUST]** 모든 외부 입력은 서버에서 검증. SQL은 파라미터 바인딩,
   HTML 출력은 이스케이프(React 기본 렌더링), `eval`/`innerHTML`에 입력 금지.
5. **[MUST]** 인증 토큰은 `httpOnly` 쿠키에 (localStorage 금지). 비밀번호는
   bcrypt/argon2. 모든 엔드포인트에 인가(소유권) 검사.
6. **[MUST]** 로그인·공개 API에 rate limit. CORS는 실제 도메인만 허용.
7. **[MUST]** 프로덕션 에러 응답에 스택 트레이스 금지. 디버그 라우트 제거.
8. **[MUST]** 목록 API 페이지네이션, DB 인덱스, 커넥션 풀(서버리스는 풀러 필수).
9. **[MUST]** (게임) 점수·재화·승패의 최종 판정은 서버가. 클라이언트를 신뢰하지 마라.
10. **[SHOULD]** Supabase/Firebase 사용 시 RLS/보안 규칙 활성화 확인.

## 상황별 상세 규칙 (해당 작업을 할 때 읽어라)

| 지금 하는 작업 | 읽을 문서 |
|---|---|
| API 키·로그인·DB·입력 폼·파일 업로드·게임 점수 코드 작성 | [references/security-rules.md](references/security-rules.md) |
| 배포 준비, 동시 접속자 대비, 캐싱·rate limit·비용 관리 | [references/traffic-rules.md](references/traffic-rules.md) |
| 배포(공개) 직전 최종 점검 | [references/deploy-checklist.md](references/deploy-checklist.md) |

## 보안 스캔 스크립트

배포 직전, 또는 사용자가 "보안 점검"을 요청하면 실행하라:

```bash
python3 scripts/security_check.py <프로젝트 경로>
```

읽기 전용 스캔이다(파일을 수정하지 않음). 하드코딩된 키, git에 커밋된 `.env`,
XSS/인젝션 위험 패턴, npm 취약점을 검사한다.
- ❌ FAIL 항목: 반드시 수정한 뒤 재실행해서 통과를 확인하라.
- ⚠️ WARN 항목: 사용자에게 보고하고 수정 여부를 확인받아라.
- 키가 git 히스토리에서 발견되면: 삭제 커밋으로는 지워지지 않는다.
  사용자에게 **즉시 키 재발급(rotate)**을 안내하라.
