본문으로 건너뛰기

ADR 0046 — 형사 사건 portal PII 노출 정책

Status: Proposed — Pack 6 형사 사건 portal 노출 정책 미정 잔여 작업 (retro #23 다음 세션 후보 #5).

배경

Pack 6 ADR 0045 가 형사 도메인 5 종 (사기·횡령·폭행·마약·교통치사상) 을 ship 했지만 의뢰인 portal 에 어떤 사건 정보를 어떻게 노출할지 가 미정. 민사 사건은 청구금액·당사자명·기일 등 모두 의뢰인이 알 권리가 있는 정보이지만 형사 사건은:

  1. 피의자·피고인 보호: 의뢰인 자신의 죄명·송치·기소·구속 사실은 의뢰인 본인이 알 권리. 그러나 portal 토큰이 의뢰인 가족·지인에게 노출되면 사회적 낙인.
  2. 피해자 PII: 형사 사건 핵심 사실 (criminalCoreFacts) 에 피해자 이름·관계 등 별도 PII 가 포함됨. 의뢰인 (피의자) 이 자기 portal 에서 피해자 정보를 직접 보는 건 합의 협상 도구이지만 동시에 피해자 2 차 가해 가능성.
  3. 법정 비공개: 일부 형사 사건은 미공개 (성범죄·소년·가정 폭력) 이며 portal 이 외부에 유출되면 법원의 비공개 결정과 충돌.

현재 상태 (ship 미정)

  • CriminalInfoSection 의 9 형사 필드는 사무소 내부 (변호인·사무장) 에만 노출
  • portalTokens 컬렉션 + 4자리 코드 인증 portal (apps/web/app/(portal)/) 에 형사 사건 정보를 노출하는 코드 없음
  • 의뢰인 portal 에서 형사 사건은 "사건 진행 중" 추상 표시만 (활동 로그 항목 hide)

결정 (제안)

Policy A — 기본 noportal (recoveryType ∈ criminal-* → portal 노출 금지)

가장 보수적 접근. 형사 사건은 의뢰인 portal 에서 자체 보이지 않음.

  • portal 토큰 발급 시 사건 유형이 형사면 silent 거부 + 변호인에게 사유 표시
  • 사건 목록·상세에서 portal 관련 UI 자체 hide

장점: 피의자·피해자 PII 노출 위험 0, 비공개 사건 호환 단점: 의뢰인 (피의자) 이 자기 사건 진행 상황 자체 조회 불가 → 변호인에게 직접 문의 필요

Policy B — Redacted portal (criminal-* 도 portal 노출 허용, 필드 redact)

형사 사건도 portal 노출하되 핵심 PII 는 마스킹.

  • CriminalInfoSection 의 portal 변환 시:
    • 노출: phaseLabel, chargeName, court 단계, indictmentDate
    • 마스킹: criminalCoreFacts (전체 hide), criminalAggravated (hide), criminalDetained (hide)
    • 부분 마스킹: 피해자 이름 등은 criminalCoreFacts 본문 자체를 client-side regex 로 redact

장점: 의뢰인이 자기 사건 단계 확인 가능 (변호인 부담 감소) 단점: redact 로직 복잡성, 누출 위험 잔존

Policy C — opt-in portal (변호인이 case-by-case 토글)

caseData.criminalPortalEnabled?: boolean 새 필드. 변호인이 사건 별로 opt-in 시만 portal 노출.

장점: 변호인 책임 명시 + 사건별 유연성 단점: 변호인 운영 부담 (각 사건 토글 결정), default 가 모호

권장

Policy A (기본 noportal) 를 Pack 6.10 first slice 로 ship. 사용자 피드백 후 Policy B/C 로 점진 확장.

근거:

  • 형사 사건의 PII 위험은 민사보다 압도적으로 큼 (수형 기록·전과·범죄 사실)
  • 의뢰인 (피의자) 가 자기 사건 단계를 자체 조회할 가치보다 PII 누출 사고 비용이 훨씬 큼
  • portal 의 4자리 코드 인증은 형사 사건의 비공개 결정에 적합한 보안 수준이 아님
  • 의뢰인은 변호인 사무실 방문·전화 등 1:1 채널이 형사 사건 흐름에 더 적합

결정 후 작업 (Pack 6.10)

  1. createPortalTokenAction (또는 신규 토큰 발급) 에 recoveryType ∈ criminal-* 거부 분기
  2. portal 사이드바에서 형사 사건 자체 hide (목록 + 상세 라우트 404 처리)
  3. apps/docs/content/operations/portal-message-notification-runbook.md 갱신
  4. 변호인 UI 에 "형사 사건은 의뢰인 포털 노출 비대상" 안내 (PortalLinkDialog 분기)
  5. e2e — recoveryType=criminal-fraud 인 사건의 portal 토큰 발급 시도 거부 검증

후속 확장 (별도 ADR)

Policy B (redacted) 또는 C (opt-in) 채택은 production 운영 6 개월 + 사용자 피드백 후 별도 ADR.

한 줄 본질 정합

"사무소가 자기 데이터로 자기 AI 학습·활용" 의 데이터 영역에 형사 사건이 포함되더라도, 의뢰인 portal 은 사무소 내부 학습과 별도 채널.

formal portal 노출 정책의 부재는 형사 사건 도메인 ship 의 무결성 위험. 본 ADR 이 closure 되어야 Pack 6 도메인이 production-safe.

참고

  • ADR 0045 — Pack 6 형사 사건 도메인 정의
  • 포털 재설계 — Pack 1~5 포털 기본 정책
  • 보안 체크리스트 — PII 보호 일반 정책
  • apps/web/app/(portal)/ — 의뢰인 포털 라우트
  • apps/web/lib/firebase/portal-token.ts — 4자리 코드 토큰 발급