# task-1685.1 완료 보고서
> InsuWiki 배포 후속 — 보안 CRITICAL + 기술 부채 5건

## SCQA

**S**: InsuWiki Firebase 배포(task-1683.1) 후 보안 CRITICAL 1건 + 기술 부채 5건이 발견되어 후속 처리가 필요한 상황이다.

**C**: GCP 서비스 계정 키 2개가 git에 추적 중(보안 위험), backfillClaims CF가 Script보다 안전성이 낮음(Auth-only 유저 미체크, invalid role 미처리), Node.js 20 지원 종료가 2026-04-30으로 임박, npm 취약점 19건 존재.

**Q**: 보안 위험을 즉시 제거하고 기술 부채 5건을 해소할 수 있는가?

**A**: 6건 중 5건 해결 완료, 1건(Vercel 배포 설정)은 제이회장님 판단 대기. 보안 키 git 추적 해제, backfillClaims CF Script 수준 정렬, Node.js 22 업그레이드, npm 취약점 11/19 해결, firestore.rules dead code 제거. TypeScript 빌드 에러 0건, 테스트 9/9 통과.

---

## 작업 상세

### 1. [CRITICAL] GCP 서비스 계정 키 git 추적 해제 ✅
- `.gitignore`에 `temp.j2h/` 추가
- `git rm --cached -r temp.j2h/` 실행하여 git 추적 해제 (파일은 디스크에 유지)
- 커밋: `b567760 fix(security): add temp.j2h/ to .gitignore and untrack GCP service account keys`

### 2. [MEDIUM] backfillClaims CF ↔ Script 정렬 ✅
- `resolveRole()` 함수 추가: invalid role을 'guest'로 coerce (기존: 단순 스킵)
- `auth.getUser(uid)` 사전 체크 추가: Firestore-only 유저 감지 (기존: 체크 없음)
- `auth/user-not-found` 에러 시 `skipped_no_user` 상태 반환 (기존: 일반 에러로 처리)
- 테스트 2건 추가 (총 9/9 통과): Auth 미존재 유저 스킵, invalid role coerce 검증

### 3. [MEDIUM] Node.js 20 → 22 업그레이드 ✅
- `functions/package.json` engines.node: `"20"` → `"22"` 변경

### 4. [MEDIUM] npm audit 취약점 수정 ✅ (부분)
- 수정 전: 19건 (8 high, 3 moderate, 8 low)
- 수정 후: 8건 (8 low) — 11건 해결
- 주요 업데이트: next 16.1.6→16.2.3, undici 7.0.0→7.24.0+, vite 7.0.0→7.3.1+
- 잔여 8건: @tootallnate/once 취약점 (firebase-admin >=11.0.0 의존 체인). `npm audit fix --force`는 firebase-admin Breaking Change 위험

### 5. [LOW] firestore.rules hasClaimRole 제거 ✅
- `hasClaimRole(role)` 함수 삭제 — rules 전체에서 미사용 dead code
- `isReviewerOrAbove()`, `isMemberOrAbove()` 등 실제 사용 함수는 유지

### 6. [INFO] Vercel 프론트엔드 배포 설정 ⏸️
- 현재 빌드 성공, 배포 대상 미구성
- Vercel 연동 vs 자체 호스팅 → **제이회장님 판단 필요**

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **customClaims.test.ts 미사용 변수 경고** — `name: string` → `_name: string` prefix 수정 (line 30)
2. **backfillClaims CF Auth-only 유저 silent failure** — `getUser()` 사전 체크 + `skipped_no_user` 상태 추가
3. **invalid role 처리 불일치** — `resolveRole()` 함수 도입으로 CF↔Script 동작 통일

### 범위 외 미해결 (4건)
1. **GCP 키 git history 잔존** — BFG/filter-repo로 히스토리 정리 필요. 파괴적 작업으로 제이회장님 승인 필요
2. **GCP Console 키 비활성화/삭제** — GCP Console 접근 필요. 제이회장님 직접 조치 필요
3. **npm audit 잔여 8건 low** — firebase-admin Breaking Change 위험으로 `--force` 미실행. 범위 외 판단
4. **vitest 미설치 (functions/package.json)** — 기존 이슈. devDependencies에 vitest 없으나 테스트는 정상 동작 (외부 설정)
5. **Node.js 22 Cloud Functions 런타임 배포** — `firebase deploy --only functions` 필요. 프로덕션 배포 승인 필요

---

## 산출물 파일

- `/home/jay/projects/insuwiki/.worktrees/task-1685.1-dev1/.gitignore`
- `/home/jay/projects/insuwiki/.worktrees/task-1685.1-dev1/functions/src/backfillClaims.ts`
- `/home/jay/projects/insuwiki/.worktrees/task-1685.1-dev1/functions/src/__tests__/customClaims.test.ts`
- `/home/jay/projects/insuwiki/.worktrees/task-1685.1-dev1/functions/package.json`
- `/home/jay/projects/insuwiki/.worktrees/task-1685.1-dev1/firestore.rules`
- `/home/jay/projects/insuwiki/.worktrees/task-1685.1-dev1/nextapp/package-lock.json`

---

## 머지 판단
- **머지 필요**: Yes
- **브랜치**: task/task-1685.1-dev1
- **워크트리 경로**: /home/jay/projects/insuwiki/.worktrees/task-1685.1-dev1
- **머지 의견**: 보안 키 추적 해제(CRITICAL)가 포함되어 있으므로 우선 머지 권장. TypeScript 빌드 에러 0건, 테스트 9/9 통과. 단, 머지 후 GCP Console 키 비활성화 + git history 정리 별도 필요.

---

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: .gitignore, backfillClaims.ts, customClaims.test.ts, package.json, firestore.rules, package-lock.json (6개 파일)
- [x] 2. 엣지 케이스: resolveRole(undefined) → 'guest', resolveRole('superadmin') → 'guest', Auth 미존재 유저 → skipped
- [x] 3. 작업 지시 일치: 6건 중 5건 처리, 1건(Vercel)은 의사결정 대기
- [x] 4. 에러 처리/보안: 키 추적 해제, auth/user-not-found 에러 핸들링
- [x] 5. 테스트: 9/9 통과 (기존 7 + 신규 2)
- [x] 6. 발견 이슈: 3건 자체 해결, 4건 범위 외 사유 명시
- [x] 7. 코드 아키텍처 원칙: SOLID/DRY 위반 없음
- [x] 8. 인터페이스 변경: backfillClaims return status에 'skipped_no_user' 추가 — 호출부는 admin 전용 CF로 프론트엔드 직접 참조 없음

---

## 모델 사용 기록

- 팀원: 불칸 / 작업 내용: backfillClaims CF 로직 정렬 + 테스트 추가 / 사용 모델: sonnet / 정당성: -
- 팀원: 불칸 / 작업 내용: .gitignore + Node.js 22 + firestore.rules 수정 / 사용 모델: haiku / 정당성: 단순 설정/삭제 작업
- 팀원: 이리스 / 작업 내용: npm audit fix / 사용 모델: haiku / 정당성: 단순 명령 실행

## 세션 통계
- 총 도구 호출: 13회

### 수정 파일 목록
- /home/jay/projects/insuwiki/.worktrees/task-1685.1-dev1/functions/src/__tests__/customClaims.test.ts: 5회 (Edit)
- bash_cmd: 2회 (Bash)
- /home/jay/projects/insuwiki/.worktrees/task-1685.1-dev1/.gitignore: 1회 (Edit)
- /home/jay/projects/insuwiki/.worktrees/task-1685.1-dev1/firestore.rules: 1회 (Edit)
- /home/jay/projects/insuwiki/.worktrees/task-1685.1-dev1/functions/package.json: 1회 (Edit)
- /home/jay/projects/insuwiki/.worktrees/task-1685.1-dev1/functions/src/backfillClaims.ts: 1회 (Edit)
- /home/jay/workspace/memory/reports/task-1685.1.md: 1회 (Write)
- /home/jay/workspace/memory/tasks/task-1685.1.md: 1회 (dispatch)

### 도구 사용 현황
- Edit: 9회
- Bash: 2회
- Write: 1회
- dispatch: 1회

