# 보안 로드맵 (Security Roadmap)
**버전**: v1.0
**작성일**: 2026-03-07
**기준**: AI 앱 보안 30계명 vs 우리 시스템 비교 분석 결과

---

## 현재 보안 수준 요약

- **적용됨**: 17/30 (57%)
- **부분 적용**: 7/30 (23%)
- **미적용**: 6/30 (20%, 이 중 3개는 해당 없음)
- **실질 적용률**: 24/27 (89%)

---

## Phase 1: 즉시 보강 (Immediate)

### 1-1. 시크릿 로테이션 정책 수립 (#5)
- **문제**: `.env.keys` 키들의 생성일/만료일 추적 없음
- **해결**:
  - `memory/security/secret-inventory.json` 생성 — 시크릿 인벤토리 (이름, 생성일, 만료일, 소유자)
  - `scripts/secret-rotation-check.py` 생성 — 90일 초과 시크릿 자동 감지 + 경고
  - cron으로 주 1회 실행, 만료 임박 시 아누에게 알림
- **대상 시크릿**:
  - `COKACDIR_KEY_ANU/DEV1/DEV2/DEV3` — Telegram 봇 키
  - `GLM_API_KEY` — z.ai API 키
  - `VERCEL_TOKEN` — Vercel 배포 토큰
  - `NAVER_SEARCHAD_API_KEY/SECRET_KEY` — 네이버 광고 API
  - `INFORKEYWORD_API_KEY` — InfoKeyword Worker API 키
  - Firebase 서비스 계정 키
  - Google Drive OAuth 토큰
  - `AI_ENCRYPTION_KEY` — InsuWiki BYOK 암호화 키
  - `GROUP_CHAT_BOT_TOKEN` — 단톡 봇 토큰
  - `OPENAI_API_KEY` — Whisper STT

### 1-2. npm audit CI 자동화 (#8)
- **문제**: Python `pip-audit`은 CI에 포함, npm audit는 미자동화
- **해결**:
  - InsuWiki, InfoKeyword 프론트엔드 빌드 후 `npm audit --audit-level=high` 자동 실행
  - critical/high 취약점 발견 시 빌드 실패 처리
  - `package-lock.json` 존재 여부 강제 체크

### 1-3. AI API 비용 하드 리밋 (#17)
- **문제**: InsuWiki `costMonitor.ts`에서 경고만 발생, 자동 차단 없음
- **해결**:
  - `vector-search/route.ts`에 일일 쿼리 하드 리밋 추가 (5000회 초과 시 429 반환)
  - `costMonitor.ts`에 비용 한도 초과 시 자동 차단 플래그
  - config에 `MAX_DAILY_QUERIES`, `MAX_DAILY_COST_USD` 환경변수 추가
- **대상**: InsuWiki B형 벡터 검색, C형 심층 분석

---

## Phase 2: 단기 보강 (1~2주)

### 2-1. console.log 정리 (#11)
- **문제**: 프론트엔드 코드에 개발용 console.log 잔존 가능성
- **해결**:
  - ESLint `no-console` 규칙 추가 (warn → error for production)
  - 또는 빌드 시 `babel-plugin-transform-remove-console` 적용
- **대상**: InsuWiki, InfoKeyword 프론트엔드

### 2-2. Redirect URL 화이트리스트 (#13)
- **문제**: InsuWiki `returnUrl` 파라미터 검증 없음 → Open Redirect 가능성
- **해결**:
  - `returnUrl` 허용 패턴: 동일 도메인(`insuwiki.vercel.app`)만 허용
  - 외부 URL 리다이렉트 완전 차단
  - `sanitizeReturnUrl()` 유틸 함수 추가
- **대상**: InsuWiki 로그인 페이지 (`login/page.tsx`)

### 2-3. CORS 프로덕션 제한 강화 (#12)
- **문제**: InfoKeyword CORS가 환경변수 기반이지만 기본값이 localhost
- **해결**:
  - 프로덕션 배포 시 명시적 도메인만 허용하도록 강제
  - 와일드카드(`*`) 사용 코드 레벨 차단 (startup 검증)

### 2-4. 패키지 취약점 자동 체크 강화 (#6, #7)
- **현재**: `pip-audit` CI 포함
- **추가**:
  - `npm audit` CI 포함 (1-2와 연동)
  - Dependabot 또는 Renovate 설정 (자동 PR)
  - 설치 전 패키지 존재 확인 가이드라인 문서화

---

## Phase 3: 중기 보강 (프로젝트 확장 시)

### 3-1. DDoS 보호 강화 (#18)
- **현재**: Vercel 기본 보호 의존
- **추가**: Cloudflare 프록시 또는 Vercel Edge Config rate limiting
- **시점**: 외부 사용자 증가 시

### 3-2. 이메일 보안 (#22)
- **추가**: Resend/SendGrid 도입 + SPF/DKIM 레코드 설정
- **시점**: 고객 리포트 자동 이메일 기능 구현 시

### 3-3. GDPR 계정 삭제 (#27)
- **추가**: 완전한 계정 삭제 플로우 (Firestore 개인정보 + Drive 파일 + Auth 계정)
- **시점**: 외부 서비스 런칭 시

### 3-4. 웹훅 서명 검증 (#21)
- **추가**: Stripe/토스페이 웹훅 HMAC 서명 검증
- **시점**: 결제 기능 구현 시

### 3-5. 세션 만료 정책 (#1)
- **현재**: Firebase Auth 기본 정책
- **추가**: 커스텀 세션 만료 (7일 + refresh rotation) 필요 시 Firebase Admin SDK 토큰 검증
- **시점**: 보안 요구사항 강화 시

---

## 우리만의 추가 보안 (30계명에 없는 것)

1. **3단계 QC 레벨** (normal/critical/security) — 작업 중요도별 보안 강도 차등
2. **레드팀 자동 감사** — 로키 서브에이전트 OWASP Top 10 + 의존성 스캔
3. **스키마 무결성 검증** (SC-1~SC-8) — JSON Schema 무단 변경 탐지
4. **AI 답변 안전장치** — 인젝션 필터 15패턴, 단정 표현 치환, PII 마스킹
5. **분산 락 + 원자적 파일 연산** — fcntl, Path.touch(exist_ok=False)
6. **BYOK AES-256-GCM 암호화** — 사용자 API 키 서버 사이드 암호화
7. **감사 추적** — audit-trail PostToolUse hook, task-timer 전 작업 기록
8. **파일 기반 위임** — 쉘 이스케이핑 공격 방지 (--task-file 강제)

---

## 체크리스트

### Phase 1 (즉시)
- [ ] 1-1. 시크릿 인벤토리 + 로테이션 체크 스크립트
- [ ] 1-2. npm audit CI 자동화
- [ ] 1-3. AI API 비용 하드 리밋

### Phase 2 (단기)
- [ ] 2-1. console.log 정리 (ESLint no-console)
- [ ] 2-2. Redirect URL 화이트리스트
- [ ] 2-3. CORS 프로덕션 강화
- [ ] 2-4. 패키지 취약점 자동 체크 강화

### Phase 3 (중기, 해당 기능 구현 시)
- [ ] 3-1. DDoS 보호 강화
- [ ] 3-2. 이메일 SPF/DKIM
- [ ] 3-3. GDPR 계정 삭제
- [ ] 3-4. 웹훅 서명 검증
- [ ] 3-5. 세션 만료 정책

---

*이 문서는 보안 강화 진행 시 업데이트합니다.*
