# task-70.1 완료 보고서: InsuWiki 긴급 보안 패치 Phase 1 (1/2)

**팀:** 개발1팀 (헤르메스)
**완료일:** 2026-03-02
**중요도:** CRITICAL

---

## 작업 내용

CRITICAL 보안 취약점 3건을 패치하였음.

### CRITICAL-1: AI API 라우트 Bearer 토큰 미검증 수정

**문제:** Authorization: Bearer {uid} 값을 검증 없이 UID로 신뢰 → 임의 UID 위조 가능
**수정:** firebase-admin의 `getAuth().verifyIdToken(token)`으로 교체

- 공통 인증 미들웨어 `verifyAuth()` 함수 신규 생성
- 6개 AI 라우트에 적용 (지시서의 5개 + vector-search 추가 패치)
- 프론트엔드 7개 파일에서 `user.uid` 직접 전송 → `user.getIdToken()` 사용으로 일괄 수정

### CRITICAL-2: share-target UID 쿼리파라미터 무검증 수정

**문제:** URL 파라미터의 `uid`를 검증 없이 사용 → 타인 계정으로 데이터 저장 가능
**수정:** `uid` 파라미터 → `token` 파라미터(Firebase ID Token)로 전환, `verifyAuthFromParam()` 적용

### CRITICAL-3: 암호화 기본값 폴백 키 하드코딩 제거

**문제:** AI_ENCRYPTION_KEY 미설정 시 `'default-secret-key-32-chars-long'` 폴백 사용
**수정:** 환경변수 미설정 시 명시적 에러 throw (lazy 평가로 빌드 호환성 유지)

---

## 생성/수정 파일 목록

### 신규 생성 (1건)

- `nextapp/src/lib/auth-middleware.ts` — 공통 Firebase ID Token 검증 미들웨어

### 백엔드 수정 (7건)

- `nextapp/src/app/api/ai/query/route.ts` — verifyAuth 적용
- `nextapp/src/app/api/ai/status/route.ts` — verifyAuth 적용
- `nextapp/src/app/api/ai/summarize/route.ts` — verifyAuth 적용
- `nextapp/src/app/api/ai/settings/route.ts` — verifyAuth 적용 (GET/POST 2개 핸들러)
- `nextapp/src/app/api/ai/feedback/route.ts` — verifyAuth 적용
- `nextapp/src/app/api/ai/vector-search/route.ts` — verifyAuth 적용 (마아트 QC로 추가 발견)
- `nextapp/src/app/api/share-target/route.ts` — verifyAuthFromParam 적용, uid→token 전환
- `nextapp/src/utils/encryption.ts` — 폴백 키 제거, lazy 평가 전환

### 프론트엔드 수정 (7건)

- `nextapp/src/components/MobileAIBar.tsx` — user.uid → user.getIdToken()
- `nextapp/src/components/AISettingsModal.tsx` — user.uid → user.getIdToken()
- `nextapp/src/components/search/SearchModal.tsx` — user.uid → user.getIdToken()
- `nextapp/src/components/AISidepanel.tsx` — user.uid → user.getIdToken()
- `nextapp/src/hooks/useAIPolling.ts` — uid prop → getToken callback 패턴 전환
- `nextapp/src/components/search/InsurancePDFQuery.tsx` — useAIPolling 호출부 수정
- `nextapp/src/app/share-target/page.tsx` — uid 파라미터 → token 파라미터 전환

---

## 테스트 결과

- TypeScript 컴파일: PASS (3회 확인)
- Next.js 프로덕션 빌드: PASS (25개 라우트 전체 정상)
- Raw UID 추출 패턴 잔존 검색: 0건 (완전 제거 확인)
- `user.uid` Bearer 토큰 전송 패턴 잔존 검색: 0건 (완전 제거 확인)
- 하드코딩 폴백 키 잔존 검색: 0건

---

## 마아트(QC 매니저) 독립 검증 결과

- 1차 검증: vector-search/route.ts 미패치 발견 → **즉시 추가 패치 완료**
- 2차 검증: 빌드 성공, 취약 패턴 0건, 최종 PASS

### 마아트 검증 항목별 결과

1. 수정 파일 보안 패치 적용 여부: PASS
2. npm run build 성공: PASS
3. Raw UID 추출 패턴 제거: PASS (vector-search 추가 패치 후)
4. verifyAuth 적용 여부: PASS (6/6 라우트)
5. 프론트엔드 user.uid 직접 전송 제거: PASS
6. 하드코딩 폴백 키 제거: PASS
7. share-target uid→token 전환: PASS
8. 생성 파일 경로 확인: PASS

---

## 버그/이슈

- 없음. 모든 변경사항 빌드 통과.

## 비고

- 작업 지시서에는 5개 AI 라우트(query, status, summarize, settings, feedback)만 명시되어 있었으나, vector-search도 동일한 취약점을 보유하고 있어 추가 패치함. 마아트 QC에서 발견.
- 2팀 담당 파일(firestore.rules, pdfIndexing.ts)은 수정하지 않음.
- search-wiki, index-wiki, invalidate-cache 라우트는 Bearer 토큰을 사용하지 않는 별도 인증 방식이거나 이미 안전한 패턴을 사용 중.
- 프론트엔드에서 기존에 `user.getIdToken()` 방식을 이미 사용하던 컴포넌트(DocumentClient, EditorToolbar, TrashClient, admin/upload)는 변경 없이 호환 유지.
