# [micro] PR-D0 CORS env 값 검증 (fail-closed 강화)

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "server/main.py"
    - "server/tests/**"
  forbidden_paths:
    - "extension/**"
    - "src/**"
    - ".github/**"
    - "server/routes/**"
    - "server/schemas/**"
    - "server/migrations/**"
    - "supabase/migrations/**"
  commands:
    - "pytest"
    - "python3 -m py_compile"
    - "git"
  merge_policy: "tiered"
  ttl_hours: 6
```

## 대상
- 리포 `/home/jay/projects/InsuRo`, 브랜치 **`task/task-2828-dev1`**(PR #117, 이어서 커밋. 새 PR/브랜치 금지).
- 파일: **`server/main.py` CORS 부분(~298-323)** + 테스트.

## 문제 (Codex HOLD)
`INSURO_EXTENSION_ORIGIN` env 값을 **검증 없이** `allow_origins` 에 추가하고 `allow_credentials=True`. env 가 오타·과도한 값(예: `*`, 비-extension origin, 빈 스킴)으로 설정되면 **자격증명 허용 CORS 가 그 origin 에 열린다.** 미설정 fail-closed 는 있으나 **잘못 설정 fail-closed 가 없다.**

## 수정 (fail-closed 강화)
`INSURO_EXTENSION_ORIGIN` 을 allow_origins 에 추가하기 전에 **형식 검증**:
- 반드시 **`chrome-extension://` 스킴 + 유효한 확장 ID 형식**(예: `chrome-extension://` 뒤 32 소문자 a-p, 표준 Chrome 확장 ID). 정규식 등으로 정확 매칭.
- **`*`·와일드카드·정규식 전체개방·비-chrome-extension origin·다중값 → 거부(추가 안 함 = fail-closed)**.
- 미설정/빈값/형식위반 → 확장 origin 미허용(기존 웹앱 origin 만). 로그로 "형식위반이라 미허용" 경고(선택).
- 기존 웹앱 origin 목록·`allow_credentials` 동작 회귀 0.

## 검증 (전부 통과)
- 유효 chrome-extension origin → 허용됨.
- `*` / `http://evil.com` / `chrome-extension://` 뒤 잘못된 ID / 빈값 → **미허용(fail-closed)**.
- 미설정 → 확장 origin 미허용(기존 동작 유지).
- 기존 웹앱 origin CORS 회귀 0.
- 기존 GET 테스트·전체 회귀 감소 0.

## 완료
- `server/main.py` + `tests/**` 외 변경 0 (`git diff --stat`)
- **dev6 금지** — dev1 등. worktree finish(STRICT+정확base+worktree cwd) → push(PR #117 반영, 새 PR 금지) → Gemini High 0 → ANU 독립검증. **머지 금지**.
- **ANU callback**(UTF-8 ≤3900 bytes, envelope). 자기완료 scope-guard 막힘 시 result.json+ANU callback escalate.
