# 작업 보고: task-2982 · 인슈로 개인정보보호 정책 완성도·화면 노출 점검

- 팀: dev3-team (다그다 / Dagda)
- 유형: **read-only 조사** (앱 코드·배포 변경 0건)
- 대상: `/home/jay/projects/InsuRo` main `49c17a92` · 프로덕션 `https://insuro.biz`
- 작업일: 2026-08-20

---

## S — 상황 (Situation)

회장님 지시(2026-08-20): "과거 검토했던 인슈로 개인정보보호 정책이 **완성됐는지 별도 봇 지정해 체크** + **인슈로 화면에서 실제 확인 가능한지**까지 점검."

과거 검토 실체는 2026-08-07 수행된 2건이다.

| 문서 | 절대경로 | 성격 |
|---|---|---|
| 개인정보 수집현황 감사 + 처리방침 초안 | /home/jay/projects/InsuRo/docs/privacy-policy-audit-and-draft-260807.md | 188줄, PART A 감사 / PART B 방침 **초안** / PART C 조치목록 |
| P0~P2 대응 로드맵 v2 | /home/jay/projects/InsuRo/docs/privacy-p0-p2-roadmap-260807.md | 91줄, 과제 11종 + 실행순서 |

로드맵의 권장 실행순서 4번은 **"P0 반영 후 → 처리방침 최종본 게시"** 로, 게시가 P0 완료에 종속되도록 설계돼 있었다.

## C — 복잡성 (Complication)

세 층위에서 각각 미완이며, 서로를 가린다.

1. **문서 층위** — 초안에 회장님이 채워야 할 빈칸 `【 】` 6종이 그대로 남아 있다(회사명·보호책임자·보유기간·권리행사 창구·Supabase 리전·시행일).
2. **코드 층위** — 로드맵 P0 4종 중 **1종만** 실제 반영됐다.
3. **화면 층위** — 개인정보처리방침 페이지가 **아예 존재하지 않는다**. 라우트·컴포넌트·문자열 전부 0건이며, 사용자가 볼 수 있는 진입점이 하나도 없다.

★ 특히 **HTTP 200 함정**이 있다. `https://insuro.biz/privacy` 는 HTTP 200을 반환하지만 이는 SPA fallback이며, 반환 본문이 루트 index.html과 **바이트 동일**(md5 `7ea9d99e769e3c34ff8e3a6327dbcef3`)이다. 상태코드만 보면 "페이지 있음"으로 오판한다.

## Q — 질문 (Question)

1. 정책이 완성됐는가? → 체크리스트 7항목 실측
2. 인슈로 화면에서 실제 확인 가능한가? → 4시나리오 실 브라우저 실측
3. 과거 검토건은 완료됐는가? → 로드맵 11과제 이행상태 실측

## A — 답변 (Answer)

**정책은 완성되지 않았고, 화면에서 확인 불가능하다.** 초안 단계에서 멈춰 있으며 앱에 게시된 적이 없다.

---

## 1. 정책 완성도 체크리스트 7항목 (실측)

| # | 항목 | 판정 | 근거 (파일:라인 / 실측) |
|---|---|---|---|
| 1 | 수집 항목 | 부분 | 초안 PART A에 항목 표로 정리됨. 단 초안 자체가 미게시 → 이용자 고지 효력 없음 |
| 2 | 보관 기간 | 부분 | DB 컬럼만 존재: server/migrations/mediscan_jobs.sql:16 (90일), compliance_consents.expires_at (30일). **삭제 배치 부재** — server/main.py 에 purge/retention/파기 매치 0건, 읽기 시 필터링만 수행 |
| 3 | 제3자 제공 | 부분 | 초안 제4조에 "광고·판매 목적 제3자 제공 없음" 기재. 미게시 |
| 4 | 처리 위탁 | 부분 | 초안 제5조에 수탁사 표 존재(Supabase·Google·Anthropic·PostHog). 단 Supabase 리전이 `【확인 필요】` 로 미확정, 국외이전 고지 미게시 |
| 5 | 파기 절차 | 부분 | 개별 하드삭제는 존재(server/routes/consultation_history_v1.py:676-726). **회원탈퇴·계정삭제 기능 0건**(src/·server/ 전수 grep 결과 탈퇴/deleteUser/delete_account 매치 0). 고객 삭제 시 Drive·상담이력 cascade 없음(src/pages/CrmCustomers.tsx:216) |
| 6 | 이용자 권리 | **부재** | 정보주체 본인의 열람·정정·삭제 요청 API·화면 0건. 설계사만 관리 가능 |
| 7 | 문의 채널 | **부재** | 보호책임자 성명·연락처가 초안에서 리터럴 `【 】` 플레이스홀더(docs/privacy-policy-audit-and-draft-260807.md:151-152). src/·server/ 전수 grep 으로 `privacy@`·`dpo@`·`개인정보보호책임자` 매치 0건 |

**7항목 중 존재 0 · 부분 5 · 부재 2.** 완전 충족 항목은 없다.

---

## 2. 화면 노출 4시나리오 (실 브라우저 실측)

스크린샷 디렉토리: /home/jay/workspace/memory/reports/task-2982-screenshots/

| 시나리오 | 실측 결과 | 증거 |
|---|---|---|
| ① 권한별 접근 (비로그인) | 루트·`/privacy`·`/privacy-policy`·`/terms`·`/policy`·존재하지않는경로 **전부 로그인 화면으로 귀결**. AuthGuard가 전 라우트를 감싸며 공개 라우트는 `/login`·`/reset-password`·`/chat/*`·`/namecard/*` 뿐 | 01-root-redirect-login.png, 02-privacy-redirect-login.png, 05-404-not-exist.png |
| ② 핵심 화면 진입 | 로그인 화면 푸터에 `© 2026 InsuRo. All rights reserved.` 만 존재. **처리방침·이용약관 링크 0개**. 회원가입 화면에도 동의 체크박스·약관 링크 **0개** (Google 가입 / 이메일 계속 버튼만) | 06-login-email-form.png, 07-signup-form.png |
| ③ 업로드·분석 플로우 동의/고지 | 인증 게이트로 브라우저 직접 확인 불가 → 배포 번들 문자열 검증으로 대체. 공개 상담폼 청크 assets/DigitalNamecard-DhPWua3W.js (8,195 bytes) 에서 `개인정보`·`동의`·`처리방침` **0건** (대조군 `이름` 3건·`상담` 4건은 정상 검출) | 본 보고서 §4 실측표 |
| ④ 오류·빈 상태 | `/namecard/<무효ID>` → `프로필을 찾을 수 없습니다.` 빈 상태. 존재하지 않는 라우트 → 로그인 화면. **어느 화면에도 처리방침 링크 없음** | 03-namecard-invalid-id.png, 05-404-not-exist.png |

### ★★ 시나리오 ②에서 발견된 최중대 사항 — 공개 경로의 실동작 PII 수집 폼
`/chat/<무효토큰>` 은 오류 화면이 아니라 **`본인 확인` 폼을 실제로 렌더한다.** 화면 문구는 `상담을 시작하려면 이름과 연락처를 입력해주세요.` 이고 입력란은 `이름`·`연락처 (010-0000-0000)` 2개다.

- 비로그인·무인증 상태에서 최종 고객의 **성명 + 휴대전화번호**를 수집하는 폼이 프로덕션에 살아 있다.
- 화면에 개인정보 수집·이용 동의 체크박스, 고지 문구, 처리방침 링크가 **전부 없다**.
- 증거: 04-chat-invalid-token.png (다그다 육안 확인) · 소스 src/pages/CustomerChat.tsx 308줄 전체에 동의·정책 문자열 0건.

이는 §5 결함 3(공개 상담폼 고지 부재)의 가장 구체적인 발현 지점이며, 무효 토큰으로도 폼이 렌더되므로 접근 장벽도 없다.

### ★ 핵심 답변
**"비로그인 사용자가 인슈로에서 개인정보처리방침을 볼 수 있는가?" → NO.**
페이지 자체가 존재하지 않으며(라우트·컴포넌트·문자열 전부 0건), 어떤 화면에서도 링크되지 않는다.

---

## 3. 프로덕션 배포 번들 실측 (다그다 직접 수행)

측정 대상 `https://insuro.biz` · API sha `49c17a928a17e039bf8423ff38c5d644a392d6a3` (main `49c17a9` 일치)

| 검증 지점 | 대조군 (정상 검출) | 개인정보 관련 검색어 | 결과 |
|---|---|---|---|
| 루트 HTML (2,909 bytes) | — | 개인정보·처리방침·이용약관 | 0건 |
| 메인 번들 assets/index-Bl-JgF8J.js (295,238 bytes) | 로그인 1건·고객관리 5건·보험 5건 | 개인정보처리방침·처리방침·이용약관·/privacy·privacy-policy | **0건** |
| 지연로딩 청크 151개 (파일명) | — | 청크명에 Privacy 또는 Terms 포함 | **0개** |
| 공개 상담폼 청크 DigitalNamecard-DhPWua3W.js | 이름 3건·상담 4건 | 개인정보·동의·처리방침 | **0건** |

대조군 한글 문자열이 정상 검출되므로 grep 방법론은 유효하다. 개인정보 관련 문자열만 선택적으로 부재한다.

소스 층위 교차확인: `grep -rc "처리방침" src/` → **0건**. `src/config/routes.ts` 라우트 56개 중 privacy/terms 라우트 0건(`policy` 매치는 증권분석 페이지 `/crm/policy-analysis`). Footer 컴포넌트는 **아예 존재하지 않는다**(`find src -iname "*footer*"` 결과 `SidebarFooter` 만, 플랜상태+로그아웃 표시 전용).

★ 오탐 배제: src/pages/MediScan.tsx 에서 `고지` 2건이 잡히나 `고지양식 복사` = 보험 **고지의무** 양식으로 개인정보 고지와 무관하다.

---

## 4. 로드맵 P0~P2 이행 상태 (실측)

| 과제 | 로드맵 상태 | 실측 판정 | 근거 |
|---|---|---|---|
| P0-1 Drive 공개제거 + 서버 프록시 | 확정 | **완료·머지됨** | `git merge-base --is-ancestor b21b04b HEAD` 참. server/main.py:5906,5992 에 `/api/insuro/file-ticket`·`/api/insuro/file/{ticket_id}` 존재. PR #203 체인 |
| P0-2 AI 무학습·제로보존 | 신규 | **부분 — 로드맵 지목 파일 미반영** | 고객상담 경로(analyze-customer·transcribe-call)는 anu-system 전환됨(PR #205·#206). 그러나 로드맵이 지목한 server/ai_parser.py 는 여전히 원시 호출(`anthropic.AsyncAnthropic`, ai_parser.py:141), server/policy_analyzer.py 는 claude CLI 그대로. server/*.py 전체에 no-train·zero-retention 파라미터 **0건**. 증권 PDF(고객 성명·생년월일 포함) 경로가 미조치 |
| P0-3 공개 상담폼 최소 수집 고지 | 신규 | **미이행** | src/pages/DigitalNamecard.tsx 전 342줄에 개인정보·동의·고지 매치 0건. 배포 청크에서도 0건 |
| P0-4 프론트 고객저장 → 서버 단일경로 | 신규 | **미이행** | src/pages/CrmCustomers.tsx:176 · src/pages/DigitalNamecard.tsx:68-111 이 `supabase.from("customers").insert()` 직접 호출 유지. `privacy_consent_at` 은 src/integrations/supabase/types.ts:698,720,742 스키마 타입 정의에만 존재하고 **쓰는 코드 0건** |
| P0-5·6·7 위탁계약·처리방침 위탁명시·국외위탁 공개 | 문서·계약 | **미이행** | 처리방침 자체가 미게시 |
| P1-1 회원탈퇴 + 통합 파기 | 미구현 | **미착수** | src/·server/ 전수 grep 으로 탈퇴·deleteUser·delete_account·withdraw 매치 0건 |
| P1-2 열람·삭제 요청(설계사 경유) | 확정(문구만) | **미이행** | 처리방침 미게시로 안내 문구 자체가 노출되지 않음 |
| P2-1a 고정salt → HMAC | 권장 | 미확인(본 조사 범위 밖) | — |
| P2-1b CSV export 통제 | 권장 | 미확인(본 조사 범위 밖) | — |
| P2-1c 전 PII 암호화 + 키분리 | 조건부 | 미착수(조건부 과제) | — |
| P2-2 보관기간 자동파기 | 정책 선행 | **미착수** | server/main.py purge/retention/파기 0건 |

**P0 7종 중 완료 1 · 부분 1 · 미이행 5.** 로드맵이 게시 전제로 삼은 P0가 미완이므로, 처리방침 미게시는 설계 순서상 일관된 상태이지 누락 사고는 아니다. 다만 **P0-3·P0-4는 위임 이력 자체가 발견되지 않아**, 로드맵에 "신규"로 적힌 뒤 실제 배정된 적이 없다.

---

## 5. 발견 결함 · 심각도 분류

수정은 본 task 범위 밖(별도 위임 대상)이며, 아래는 분류만 수행한다.

### P0 (법적 시급)
1. **개인정보처리방침 미게시** — 페이지·라우트·링크 전무. 개인정보 보호법상 처리방침 공개 의무 관련. 화면 실측·번들 실측·소스 실측 3중 확인.
2. **회원가입 시 개인정보 수집·이용 동의 절차 부재** — 회원가입 화면에 동의 체크박스·약관 링크 0개. 07-signup-form.png 육안 확인.
3. **공개 경로 PII 수집 폼의 고지·동의 부재** — 비로그인 고객이 성명·전화번호를 입력해 `customers` 테이블에 직접 insert 되는 경로에 고지 0건. (P0-3·P0-4)
   - 발현 지점 A: `/chat/:token` `본인 확인` 폼 — **무효 토큰으로도 렌더되는 실동작 폼**, 이름+연락처 수집, 동의 요소 0개 (04-chat-invalid-token.png 육안 확인). src/pages/CustomerChat.tsx
   - 발현 지점 B: `/namecard/:agentId` 상담신청 폼 — src/pages/DigitalNamecard.tsx 342줄 4개 조건부 렌더 분기 전부에 동의 JSX 0건. 배포 청크 문자열 0건
4. **보호책임자·문의 채널 부재** — 초안이 리터럴 `【 】` 플레이스홀더. 침해 신고 창구 부존재.

### P1 (권리·파기)
5. **회원탈퇴·통합 파기 기능 부재** — 파기 요구권 행사 수단 없음.
6. **보관기간 자동 파기 배치 부재** — expires_at 컬럼은 있으나 집행 코드 없음(만료 데이터가 무기한 잔존).
7. **정보주체 열람·정정·삭제 창구 부재**.

### P2 (운영 위생 · 유실 위험)
8. **★ 감사·로드맵 문서 2건이 git 미추적(UNTRACKED)** — `git ls-files --error-unmatch` 실패, `git log --follow` 결과 0건. 로컬 디스크에만 존재해 워크트리 정리·디스크 사고 시 **유실된다**. 과거 검토 산출물 전체가 백업 없이 단일 사본으로 존재하는 상태.
9. **PostHog 분석 사전 동의 부재** — src/App.tsx:47 에서 마운트 즉시 init, 동의 확인 없음.
10. **P0-2 잔여 경로** — 증권 PDF 분석(ai_parser.py·policy_analyzer.py)에 무학습·제로보존 설정 미적용. ※ Anthropic 상업 API는 기본적으로 학습에 사용하지 않으므로 실제 위험도는 계약 조건에 따라 달라진다. 코드 층위 미조치 사실만 기록하며, 법적·계약적 판단은 하지 않는다.

⚠️ 본 보고서는 **운영 누락 점검**이며 법률 확정판단이 아니다. 시행에는 개인정보 전문 법률 검토가 필요하다.

---

## L1 스모크테스트

- **서버 재시작**: 해당없음 (read-only 조사, 코드·배포 변경 0건. 기존 가동 중인 서비스 상태만 관측)
- **API 응답 확인**:
  - `curl -s https://api.insuro.biz/api/status` → HTTP 200, `sha=49c17a928a17e039bf8423ff38c5d644a392d6a3`, `ready:true`, `db:ok`
  - `curl -s http://localhost:8001/api/status` → 동일 sha (systemd `--user` `insuro-api.service` active/running, uvicorn port 8001)
  - `curl -sI https://insuro.biz/` → HTTP/2 200
  - `curl -s https://insuro.biz/privacy` → HTTP 200 이나 본문이 루트와 바이트 동일(md5 `7ea9d99e769e3c34ff8e3a6327dbcef3`) = SPA fallback
- **스크린샷**: /home/jay/workspace/memory/reports/task-2982-screenshots/ (7장, 전부 다그다가 Read 툴로 육안 확인 완료 — 로그인월 오판 방지 규율 적용)

---

## 수정 파일별 검증 상태

앱 코드 수정 0건. 본 task 산출물만 기재한다.

| 파일 | 종류 | 검증 상태 |
|---|---|---|
| /home/jay/workspace/memory/reports/task-2982.md | 최종 보고서 | verified |
| /home/jay/workspace/memory/reports/task-2982-dagda-prod.md | 다그다 프로덕션 번들 실측 | verified |
| /home/jay/workspace/memory/reports/task-2982-lugh.md | 루 백엔드·체크리스트 실측 | verified |
| /home/jay/workspace/memory/reports/task-2982-brigid.md | 브리짓 프론트 화면노출 실측 | verified |
| /home/jay/workspace/memory/reports/task-2982-morrigan.md | 모리건 실 브라우저 E2E 실측 | verified |
| /home/jay/workspace/memory/reports/task-2982-screenshots/01-root-redirect-login.png | 스크린샷 | verified |
| /home/jay/workspace/memory/reports/task-2982-screenshots/02-privacy-redirect-login.png | 스크린샷 | verified |
| /home/jay/workspace/memory/reports/task-2982-screenshots/03-namecard-invalid-id.png | 스크린샷 | verified |
| /home/jay/workspace/memory/reports/task-2982-screenshots/04-chat-invalid-token.png | 스크린샷 | verified |
| /home/jay/workspace/memory/reports/task-2982-screenshots/05-404-not-exist.png | 스크린샷 | verified |
| /home/jay/workspace/memory/reports/task-2982-screenshots/06-login-email-form.png | 스크린샷 | verified |
| /home/jay/workspace/memory/reports/task-2982-screenshots/07-signup-form.png | 스크린샷 | verified |

---

## 3 Step Why

- **1st Why — 왜 처리방침이 화면에 없는가?**
  페이지 컴포넌트·라우트가 구현된 적이 없다. 초안은 문서로만 작성됐고 앱에 반영하는 작업이 별도로 존재하지 않았다.

- **2nd Why — 왜 반영 작업이 없었는가?**
  로드맵 권장 실행순서가 "4. P0 반영 후 → 처리방침 최종본 게시" 로 게시를 P0 완료에 종속시켰다. P0 7종 중 1종만 완료돼 게시 조건이 성립하지 않았다.

- **3rd Why — 왜 P0가 1종만 완료됐는가?**
  P0-1은 task-2927~2932 로 실제 위임·머지됐고 P0-2 일부는 task-2933·2936 으로 처리됐으나, **P0-3·P0-4는 위임 이력 자체가 발견되지 않는다.** 로드맵에 "신규"로 기재된 뒤 실제 배정 단계로 넘어가지 않았고, 로드맵 문서가 git 미추적이라 진행상황을 추적할 공식 매체도 없었다. 문서 미추적(결함 8)과 과제 미배정이 서로를 강화한 구조다.

---

## 셀프 QC 8항목

1. **다른 파일 영향**: 앱 코드 변경 0건 — 영향 없음. 산출물은 memory/reports 하위 신규 파일뿐.
2. **엣지 케이스**: HTTP 200 SPA fallback 오판(바이트 대조로 배제), MediScan `고지의무` 오탐(문맥 확인으로 배제), 빌드/배포 시점 불일치(프로덕션 번들 직접 fetch 로 배제).
3. **작업 지시 일치**: 체크리스트 7항목 + 4시나리오 + 과거 이력 추적 3건 전부 수행.
4. **에러 처리·보안**: read-only 준수. API 키·토큰 값 출력 0건. 서명 JWT 위조 금지 준수(인증 필요 화면은 "확인 불가"로 정직 기록).
5. **테스트 커버리지**: 코드 변경이 없어 신규 테스트 부재. 검증은 실 브라우저 스크린샷 + 프로덕션 번들 문자열 대조군 방식으로 수행.
6. **발견 이슈 처리**: 결함 10건 전부 심각도 분류 완료. 수정은 task 지시에 따라 **별도 위임 대상**(본 task는 조사 범위).
7. **아키텍처 원칙**: 코드 변경 없음 — 해당 없음.
8. **인터페이스 변경**: 없음.

**Zero Issue 아님** — P0 4건·P1 3건·P2 3건 총 10건 적출.

---

## trip-wire 5종 실측치

| 항목 | 실측 |
|---|---|
| Critical7 | 0 |
| PII net-new | 0 (스크린샷은 무효 ID·빈 상태·로그인 화면만, 실 고객정보 미포함 — 7장 전부 육안 확인) |
| 회귀 실패 | 0 (코드 변경 0건) |
| forbidden_paths 침범 | 0 (InsuRo repo read-only, 워크스페이스 memory/reports 만 기록) |
| nonce = task_id | task-2982 일치 |

---

## 모델 사용 기록

| 팀원 | 역할 | 모델 | 비고 |
|---|---|---|---|
| 루 (Lugh) | 백엔드·체크리스트·로드맵 실측 | sonnet | 분석 작업 — haiku 미사용 |
| 브리짓 (Brigid) | 프론트 화면노출 코드 실측 | sonnet | 분석 작업 — haiku 미사용 |
| 아네 (Aine) | 환경·인증게이트 사전조사 | sonnet | 분석 작업 — haiku 미사용 |
| 모리건 (Morrigan) | 실 브라우저 E2E | sonnet | 분석 작업 — haiku 미사용 |
| 다그다 (Dagda, 팀장) | 설계·분배·교차검증·통합 | opus | 직접 코딩 0건. 팀원 주장 5건 독립 재확인 |

haiku 사용 0건.

---

## 팀장 교차검증 기록

팀원 보고를 액면 수용하지 않고 아래를 직접 재확인했다.

| 팀원 주장 | 다그다 재확인 | 결과 |
|---|---|---|
| src/ 에 처리방침 0건 | `grep -rc "처리방침" src/` | 일치 (0건) |
| privacy_consent_at 미기록 | grep 결과 types.ts 3곳(스키마 타입)뿐 | 일치 |
| 문의 채널 부재 | `privacy@`·`dpo@`·`개인정보보호책임자` grep | 일치 (0건) |
| P0-2 지목 파일 미조치 | ai_parser.py:141 원시 호출 확인 | 일치 |
| MediScan 고지 0건 | grep 2건 검출 → 문맥 확인 결과 `고지양식 복사`(보험 고지의무) | **브리짓 결론 유효, 오탐** |
| 회원탈퇴 부재 | 탈퇴·deleteUser·delete_account·withdraw 전수 grep | 일치 (0건) |
| 자동 파기 배치 부재 | main.py purge/retention/파기 grep | 일치 (0건) |
| `/chat/*` 본인확인 폼에 동의 없음 (모리건) | 04-chat-invalid-token.png 육안 재확인 | 일치 — 이름·연락처 입력란 2개, 동의 요소 0개 |
| `/privacy` 가 라우트 부재 (모리건·브리짓) | 프로덕션 `curl` 본문 md5 대조 → 루트와 바이트 동일 | 일치 — HTTP 200은 SPA fallback |

---

## 비고

- **수정 권고는 하되 수정은 수행하지 않았다.** task 지시 "read-only 조사 위주(수정 필요 시 별도 보고)" 준수.
- 후속 위임 권고 순서: ① P0-3+P0-4(같은 프론트 파일, 묶어서) → ② 처리방침 페이지 신설 + 푸터/로그인/가입 화면 링크 배선 → ③ 회장님 빈칸 6종 확정 → ④ P1-1 탈퇴·통합파기.
- **즉시 조치 권고(무비용)**: 감사·로드맵 문서 2건을 git 에 커밋해 유실 위험을 제거할 것. 현재 단일 로컬 사본이다.
- P2-1a(HMAC)·P2-1b(CSV export 통제)는 본 조사 범위 밖으로 미확인 상태다.

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

