# [InsuRo P0-1] Drive 프록시 Phase 2 — 프론트 링크 프록시 배선 + E2E

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "src/**"
    - "tests/**"
    - "playwright.config.ts"
  forbidden_paths:
    - ".env"
    - ".env.*"
    - ".github/**"
    - "server/**"
  commands:
    - "npm"
    - "npx"
    - "node"
  merge_policy: "tiered"
  ttl_hours: 48
```

## 배경 / 필독
- P0-1 Drive 프록시 백엔드는 **Phase 1+1.5 배포 완료**(라이브). 이제 프론트가 실제로 프록시를 통해 파일을 연다.
- 필독 설계: `docs/plans/drive-proxy/plan.md`(결정 A ticket 방식), `docs/plans/drive-proxy/context.md`
- **Phase 1.5 백엔드 계약(라이브)**:
  - `POST /api/insuro/file-ticket` (Bearer/verify_jwt) body `{file_url? | drive_file_id?, mode: "view"|"download"}` → `{ticket_id, expires_in}`. 등급별 IDOR 인가(공개 fcpa/관리자 소식지·보험료/FA소유 증권).
  - `GET /api/insuro/file/{ticket_id}` → 스트리밍. **view**=inline+Range+2분TTL 다회, **download**=attachment+1회소비.

## Phase 2 범위 (프론트만)
1. **프론트 헬퍼** `src/lib/driveFile.ts`(신규): `requestFileTicket(fileUrlOrId, mode)` → `POST ${INSURO_API_BASE}/api/insuro/file-ticket`(Bearer 세션토큰) → `${INSURO_API_BASE}/api/insuro/file/{ticket_id}` 반환.
2. **링크 7곳 교체** (기존 Drive `/view` URL 직접 열기 → 프록시):
   - 증권 `PolicyAnalysis.tsx:599`(`window.open`) → **download** 또는 view
   - 소식지 `AdminNewsletters.tsx:451` / 보험료 `AdminPremiumData.tsx:430` → 원본 열기
   - 소식지 검토 `ReviewDetailPanel.tsx:191, 227` → 원본 보기
   - 금소법 `AdminFcpa.tsx:211` / 가이드 `FcpaGuide.tsx:129` → **view**(법령 열람)
3. **★팝업차단 회피 (Codex 지적)**: async ticket 발급 후 `window.open`은 브라우저가 차단. → **클릭 즉시 `const w = window.open("", "_blank")` 빈 창 열고, ticket 발급 후 `w.location = url`** 패턴. 실패 시 에러 처리 + `w.close()`.
4. **view vs download 구분**: "원문 **보기**/열기"=`view`(inline, 브라우저 표시), "**다운로드**"=`download`(attachment). 라벨과 동작 일치.
5. **이미지 프리뷰** `ReviewDetailPanel.tsx:188-189` `<img src>`: **view 모드 ticket** URL을 src로(다회+Range 지원되므로 `<img>` 재요청 정상). 로딩 실패 폴백 유지.
6. **로딩/에러 UX**: ticket 발급 중 스피너, 실패 시 toast(현재 순수 앵커라 UX 없음).
7. INSURO_API_BASE cross-origin — 링크는 프록시 URL 직접(헤더 불요, ticket이 URL에 없고 서버세션 저장이라 안전).

## 주의 (Phase 2에서 안 함)
- 신규 `anyone` 공개 생성 제거·기존 소급 회수는 **Phase 3** (별도). Phase 2는 프론트 배선만 — 이 시점엔 파일이 아직 공개라 프록시·직접링크 **둘 다** 열림(무중단).
- 백엔드 수정 금지(`server/**` forbidden).

## 검증 (필수)
1. **실브라우저 E2E (Playwright)** — MEMORY 규칙: build PASS ≠ 실동작. 7곳 링크 클릭 시 프록시로 파일 열림, 이미지 프리뷰 표시, 팝업차단 안 걸림.
2. 로그인 세션에서 file-ticket 200 → file 스트리밍 열람.
3. `npm run build` PASS + 기존 vitest 회귀 0.

## 배포
- 프론트 = **CF Pages**(`wrangler pages deploy`, 회장/ANU 조율). 백엔드 이미 라이브라 프론트만 배포하면 프록시 동작.
- finalize-only. 머지=ANU.

## 완료 보고
수정 파일 diff · 헬퍼 · 링크 7곳 교체 · 팝업차단 회피 구현 · view/download 구분 · 이미지 프리뷰 · E2E 결과(스크린샷) · build/회귀 · callback.

## goal_assertions (auto-generated)
- `npm run build`
