# task-2111 완료 보고서: InsuRo API URL 설정 수정 — 네트워크 오류 해결

## SCQA

**S**: InsuRo(insuro.biz) 프론트엔드가 백엔드 API 호출 시 `src/config/api.ts`의 fallback URL로 Tailscale 내부 주소(`aidevserver.tail2cdab6.ts.net:10000`)를 사용하고 있다. `.env`에 `VITE_INSURO_API_URL`이 미설정 상태.

**C**: 외부 사용자가 insuro.biz에서 키워드 분석, 구글 트렌드 등 백엔드 API 호출 시 Tailscale 내부 URL에 접근할 수 없어 "네트워크 오류가 발생했습니다" 에러 발생. 또한 `server/main.py` CORS `allow_origins`에 `insuro.biz` 도메인이 없어 CORS preflight도 차단됨. 추가로 3개 파일(CrmMessenger, CopilotPanel, SummaryTab)이 `VITE_API_URL || localhost:8001` 패턴을 사용하여 프로덕션에서 작동 불가.

**Q**: `.env` 수정 + CORS 추가 + API URL 통일로 외부에서 API 호출이 정상 작동하도록 할 수 있는가?

**A**: 3가지 수정 완료: (1) `.env`에 `VITE_INSURO_API_URL=https://api.insuro.biz` 추가, (2) `server/main.py` CORS에 `insuro.biz`/`www.insuro.biz` 추가, (3) 3개 파일의 `VITE_API_URL` 참조를 `INSURO_API_BASE` import로 통일. `npm run build` 7.76초에 성공, 빌드 결과에 `api.insuro.biz` 포함 확인. `curl https://api.insuro.biz/api/status` → `{"status":"ok"}` 응답 확인.

---

## 수정 파일

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| .env | VITE_INSURO_API_URL=https://api.insuro.biz 추가 | grep "VITE_INSURO_API_URL" OK | verified |
| server/main.py:151-152 | CORS allow_origins에 insuro.biz, www.insuro.biz 추가 | grep "insuro.biz" OK (2건) | verified |
| src/pages/CrmMessenger.tsx:16 | VITE_API_URL → INSURO_API_BASE import 교체 | grep "INSURO_API_BASE" OK | verified |
| src/components/crm/CopilotPanel.tsx:7,40 | VITE_API_URL → INSURO_API_BASE import 교체 | grep "INSURO_API_BASE" OK | verified |
| src/components/crm/SummaryTab.tsx:10,83,120 | VITE_API_URL → INSURO_API_BASE import 교체 | grep "INSURO_API_BASE" OK | verified |

---

## 발견 이슈 및 해결

### 자체 해결 (3건)

1. **CORS allow_origins에 insuro.biz 미등록** — server/main.py:151-152에 2개 도메인 추가
   - Codex 사전 검증에서 critical 리스크로 발견. .env만 수정해도 CORS 차단으로 브라우저 호출 실패
2. **3개 파일이 VITE_API_URL || localhost:8001 사용** — INSURO_API_BASE import로 통일
   - CrmMessenger.tsx, CopilotPanel.tsx, SummaryTab.tsx
3. **빌드 결과에 Tailscale URL 잔존 여부** — 빌드 후 grep 확인: Tailscale URL 0건, api.insuro.biz 1건 포함 확인

### 범위 외 미해결 (2건)

1. **.env 민감정보 git 추적 중** — 범위 외 사유: .env가 .gitignore에 없어 서비스 롤 키, VAPID 키 등 노출됨. 별도 보안 작업으로 .env .gitignore 추가 + 키 로테이션 권장
2. **서버 재시작 필요** — 범위 외 사유: CORS 변경은 서버 코드 수정이므로 서버 재시작/재배포 시 반영. 아누 판단 필요 (`systemctl restart insuro-api` 또는 동등)

---

## L1 스모크테스트 결과

- 서버 재시작: 해당없음 (프론트엔드 빌드 작업, 서버는 프로덕션에서 별도 운영)
- API 응답 확인: `curl -s https://api.insuro.biz/api/status` → `{"status":"ok"}` 정상
- 빌드 확인: `npm run build` → 7.76초 성공, dist/ 142개 파일 생성
- 빌드 결과 검증: `grep "api.insuro.biz" dist/` → 포함 확인, Tailscale URL 0건

---

## 머지 판단

- **머지 필요**: Yes
- **브랜치**: task/task-2111-dev1
- **워크트리 경로**: /home/jay/projects/InsuRo/.worktrees/task-2111-dev1
- **머지 의견**: 프론트엔드 .env 추가 + CORS 수정 + API URL 통일. npm run build 성공. 충돌 가능성 낮음 (설정 파일 + CORS 리스트 끝에 추가). 머지 후 Cloudflare Pages 자동 배포 + 서버 재시작으로 CORS 반영 필요.

---

## 모델 사용 기록

- 팀원: 이리스 / 작업: .env 수정 + API URL 통일 (4개 파일) / 모델: sonnet
- 팀원: 불칸 / 작업: CORS allow_origins 수정 / 모델: sonnet

---

## Codex 사전 검증

- 결과: FAIL → 수정 후 대응 완료
- 발견 리스크: CORS 미등록 (critical), .env 민감정보 노출 (critical), Cloudflare Pages 환경변수 (high), VITE_API_URL 불일치 (medium)
- 대응: CORS 추가 (해결), API URL 통일 (해결), .env 민감정보 (범위 외), Cloudflare Pages 환경변수 (아누 확인 권장)

## 로키 보안 감사 결과

- 감사자: 로키 (security-team)
- 결과: PASS (8건 검사, 7건 PASS + 1건 WARN)
- WARN: allow_methods/allow_headers ['*'] 사용 (기존 설정, 이번 변경 범위 외)
- 주요 확인: CORS allowlist 방식 정상, XSS/SSRF 위험 없음, JWT 인증 정상, URL 인코딩 처리 확인
- 보안 개선점: HTTP localhost fallback 제거 → HTTPS only로 전환됨
- 상세: /home/jay/workspace/memory/events/task-2111.security-audit

## QC 검증 결과

- full_suite_check: PASS (pytest 2445 passed, 89.44s)
- file_check: PASS
- data_integrity: PASS
- three_docs_check: PASS (체크리스트 13/13 = 100%)
- l1_smoketest_check: PASS
- tdd_check: FAIL (예외 사유: 설정 파일 수정 작업 — .env, CORS 설정, import 경로 변경은 로직 구현이 아닌 환경 설정이므로 TDD 대상 아님)
- git_evidence: FAIL (예외 사유: 변경사항은 worktree 브랜치 task/task-2111-dev1에 커밋됨. main workspace에서는 감지 불가한 구조적 한계)
- scope_check: WARN (task 파일에 affected_files 미명시 → 실제 수정 5개 파일 모두 정당)

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


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


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


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


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


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


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

