# InsuWiki Firestore — 보안 취약점 4건 통합 수정

## 우선순위: Security (로키 HIGH 판정 2건 포함)

## 수정 1: ai_suggestions write 권한 소유권 검증 (HIGH)

**파일**: `/home/jay/projects/insuwiki/firestore.rules`

현재: `allow write: if isAuthenticated() && isMemberOrAdmin();`
→ 인증된 모든 사용자가 다른 사용자 문서의 ai_suggestions에 쓰기 가능

수정: 부모 문서의 authorId와 현재 사용자가 일치하거나, Admin만 쓰기 허용
```
allow write: if isAuthenticated()
  && (get(/databases/$(database)/documents/documents/$(docId)).data.authorId == request.auth.uid
      || isAdmin());
```

단, Cloud Functions(Admin SDK)는 Rules를 우회하므로 기존 동작에 영향 없음. 클라이언트에서도 본인 문서에는 쓸 수 있어야 함.

## 수정 2: AiSuggestion에 userId 필드 추가 (HIGH)

**문제**: rules에서 `resource.data.userId` 조건을 쓰지만, 실제 Cloud Functions에서 userId를 저장하지 않아 dead code.

**확인 필요 파일**:
- `/home/jay/projects/insuwiki/functions/src/` 에서 ai_suggestions에 write하는 코드 찾기
- `staticMatching.ts`, `embeddingMatching.ts` 등

**수정**:
1. Cloud Functions에서 ai_suggestions 생성 시 `userId` 필드 포함하도록 수정
2. 또는 rules에서 userId 조건 대신 부모 문서 authorId로 대체 (수정 1과 통합)

실제 Cloud Functions 코드를 확인하고 판단할 것.

## 수정 3: visibility 필드 값 검증 (MEDIUM)

**파일**: `/home/jay/projects/insuwiki/firestore.rules`

현재 create/update 규칙에서 visibility에 임의 값 저장 가능.

수정: create/update 시 visibility 값을 제한
```
// create 규칙에 추가
&& (!('visibility' in request.resource.data) || request.resource.data.visibility in ['public', 'private'])

// update 규칙에 추가 (visibility 변경 시)
&& (!request.resource.data.diff(resource.data).affectedKeys().hasAll(['visibility'])
    || request.resource.data.visibility in ['public', 'private'])
```

## 수정 4: isMemberOrAdmin vs isMemberOrAbove 통일 (HIGH)

**문제**: 두 함수가 서로 다른 소스(DB 조회 vs JWT 클레임)를 사용하여 인증 지연 차이 발생

**확인 필요**: firestore.rules에서 두 함수의 정의를 찾아서
- 어느 쪽이 더 안전한지 판단
- 하나로 통일

일반적으로 JWT 클레임 기반이 더 안전하고 빠름 (DB 조회 비용 없음). 단, 역할 변경 시 JWT 갱신 지연이 있음.

수정: 보안 우선 → JWT 클레임 기반으로 통일. DB 조회 버전은 deprecated 처리 후 제거.

## 검증 시나리오
1. **write 권한**: 다른 사용자의 문서에 ai_suggestions 쓰기 시도 → 차단되면 성공
2. **userId 필드**: Cloud Functions가 생성한 ai_suggestions에 userId 포함되면 성공
3. **visibility 검증**: visibility를 "evil"로 설정 시도 → 차단되면 성공
4. **인증 통일**: 모든 규칙에서 동일한 인증 함수 사용되면 성공
5. **기존 기능**: InsuWiki 서비스 전체 기능 정상 동작
6. **Cloud Functions**: AI 제안 생성 등 기존 Functions 정상 동작
7. **firebase deploy 성공**