P2 노출 가드 — 표준답변·안내글의 고객 챗봇 노출 개인정보·비공개 가드 정본
최초 작성 — 2026-06-18 · 개인정보보호관리자(privacy-officer) · Phase 2 고객 챗봇이 표준답변(
hp_standard_answer)·안내글(hp_announce)을 인용·노출하기 전 적용해야 할 PII 마스킹·비공개 출처 차단·직원 내부표현 필터·승인 게이트의 정본갱신 — 2026-06-19 · privacy-officer · 재큐레이션 복원 스크린샷(이미지) PII 검수 기준 확정(§4-A)·승인 게이트 이미지 필수 체크(§4-2)·PII 게이트 상태 컬럼(§4-B)·텍스트 정규식 보강(§2-1). 배경:
created_by='llm-curator-v3'approved 580건 중 이미지 보존 345건(51.3%) — 본문 텍스트는 마스킹됐으나 스크린샷 속 PII는 자동 제외되지 않음(사람 검수 필수)이 문서가 해소하는 미정 항목(다른 정본이 본 문서에 위임):
- REQUIREMENTS.md FR-10.3 · NFR-6.3 · §7 Q3 (비공개 자료 마스킹·노출 세부 규칙)
- PMS-INQUIRY-HARVEST.md §7-2 H8 · §9-E (안내글 P2 노출 가드)
- STANDARD-ANSWER-CURATION.md §7-2 T8 · §8-D · §9-E (비공개 출처 표준답변 P2 노출 가드)
포지셔닝: 수집·분류·승인 워크플로 자체는 위 두 정본이 정본이다. 본 문서는 그 워크플로에 개인정보·비공개 노출 관점의 가드(검사 규칙·승인 체크리스트·차단 조건·적법성) 만을 얹는다. 실제 마스킹 파이프라인·승인 UI·자동 스캔 구현은 §8 핸드오프로 api/admin/dba에 넘긴다(본 문서는 코드를 만들지 않는다).
1. 위협 모델 — 무엇이 어디서 새는가
표준답변·안내글은 PMS 문의/직원 안내글에서 수집된다(출처 source_post_id). 본문(answer/body)·이미지·출처 메타에 다음이 섞여 들어올 수 있다.
| # | 노출 경로 | 유형 | 위험도 | 정보주체 범위 |
|---|---|---|---|---|
| L1 | 표준답변/안내글 본문에 원 문의자·제3자 PII(이름·연락처·이메일·사업자번호·주소) 잔존 | PII 본문 잔존 | high | 원 문의 고객·담당자 |
| L2 | 이미지 인용(hp_image_asset)의 캡션·화면 캡처 속 고객정보(관리화면 스크린샷에 명단·연락처) | 이미지 PII | high | 캡처 화면에 등장한 다수 고객 |
| L3 | 비공개 댓글(private_yn='Y') 파생 정보가 본문/출처로 노출 | 비공개 파생 | critical | 비공개로 답한 특정 고객·계약 |
| L4 | 출처 표기/역추적(source_post_id) 인용 시 원 게시물 식별자·프로젝트·업체명 노출 | 출처 식별 | medium | 원 문의 고객사 |
| L5 | 안내글(staff 작성)에 특정 고객·계약·내부 정책·가격 언급이 고객에게 그대로 노출 | 내부표현 | high | 언급된 특정 고객사 + 회사 영업기밀 |
| L6 | 다른 고객 정보 교차 노출 — A 고객 문의에서 수집된 답변에 B 고객 식별정보가 인용 | 교차 노출 | critical | 무관한 제3 고객 |
| L7 | 매칭/생성 시 OpenAI(AI Gateway 경유) 전송 = 개인정보 국외 이전. 본문에 PII가 남아있으면 그대로 국외 전송 | 국외 이전 | high | 본문에 남은 모든 정보주체 |
핵심 원칙: 승인(
approval_status='approved')은 챗봇 사용의 필요조건이지 PII 안전의 충분조건이 아니다. 승인 단계에 PII·비공개 가드를 명시적으로 끼워 넣지 않으면 "승인됨 = 그대로 노출"이 되어 L1·L3·L5·L6이 그대로 흐른다.
2. 노출 가드 규칙 (챗봇 인용·노출 전 검사)
표준답변/안내글이 P2 고객 챗봇 응답에 인용·노출되기 전 아래 4중 가드를 통과해야 한다. 1차는 승인 시점(저장 게이트), 2차는 노출 시점(런타임 가드) — 이중화한다(승인 후 본문 수정·정규식 갱신을 흡수).
2-1. G1 — PII 마스킹 (본문·캡션, hp_setting safety 재사용)
- 재사용 자산:
hp_settingsafety 그룹의pii_masking(on/off) +pii_patterns. 현 시드는 3종뿐(주민번호\d{6}-[1-4]\d{6}· 전화\d{3}-\d{3,4}-\d{4}· 이메일 정규식). 별도 정규식 세트를 새로 만들지 않고 이 시드를 정본으로 공유한다(REQUIREMENTS NFR-1 AC-1.3·§9 safety 시드와 정합). - 보강 필요 패턴(현 시드 미포함 → 3종에서 6종으로 — §8 dba/api 핸드오프, §7-2 P5):
- 사업자등록번호
\d{3}-\d{2}-\d{5}— 마스킹 대상 추가([사업자번호]). 고유식별정보는 아니나 법인·개인사업자 식별이 가능하므로 마스킹한다. - 계좌번호 — 은행별 자릿수가 제각각이라 단일 정규식 오탐이 크다. 보수적 패턴 + "계좌/입금/예금주" 키워드 근접으로만 후보화하고, 최종 판정은 C2 사람 검수가 보완한다.
- 카드번호
\d{4}-\d{4}-\d{4}-\d{4}— 16자리 하이픈 구분 형태. 일반 숫자열 오탐을 줄이기 위해 키워드 근접(카드/승인번호)으로 보강하고 C2 사람 검수가 보완한다. - (기존) 이름+연락처 근접 결합.
- 사업자등록번호
- 계좌·카드는 정규식 단독으로 오탐/미탐이 큰 영역이라 자동 마스킹의 신뢰도가 낮다 → 키워드 근접으로 후보를 좁히되 최종 안전판은 §4-2 C2 사람 검수로 둔다.
- 적용 면:
answer/body본문 + 인용 이미지의description캡션 + 출처 표기 문자열. 임베딩 생성 입력에도 동일 적용(마스킹 후 임베딩 — 그래야 벡터·국외전송에 PII가 남지 않는다, L7). - 마스킹 표기: 값 자체를 제거하고
[연락처]·[이메일]·[사업자번호]류 플레이스홀더로 치환(부분 노출010-****-1234는 재식별 위험 — 전체 치환 권장). - 고유식별정보 특칙: 주민등록번호가 발견되면 마스킹이 아니라 해당 표준답변/안내글을 차단(노출 불가) 후 운영자 알림. 주민번호는 원칙적 처리 금지 대상이라 "마스킹해서 노출"이 아니라 "원천 제거 후 재검토"가 맞다(개인정보보호법 §24의2).
2-2. G2 — 비공개 출처 파생 차단 (L3·L4)
- 차단 조건: 표준답변/안내글의
source_post_id가 가리키는 원 게시물의 답변이 비공개 댓글(private_yn='Y')에서 파생됐으면 → P2 노출 후보에서 제외. 비공개 댓글 본문은 이미 api에서 LLM 입력·외부 반환이 차단돼 있으나(src/index.tsprivate_yn != 'Y'필터·content: isPrivate ? null), 수집 단계에서 비공개 내용이 사람 손으로 본문에 옮겨졌을 가능성을 승인 게이트에서 사람이 확인해야 한다(자동 탐지 불가 영역). - 비공개 출처 플래그(C1 자동):
source_post_id가 비공개 댓글에서 파생된 자산이면 C1 자동 스캔이private_source_flag를 세운다. 이 플래그는 자동 차단이 아니라 승인 화면에 경고를 띄워 사람 확인을 강제하는 신호다(일반화 녹임 여부는 자동 판정 불가이므로 C2 승인자가 §4-2 체크리스트에서 직접 판단). 컬럼은 §4-B에 정의. - 출처 표기 마스킹(L4): P2 응답에 출처를 노출할 때 원 게시물 ID·프로젝트명·고객사명을 그대로 인용하지 않는다. 출처는 "검증된 표준답변" 수준의 일반화된 라벨만 노출(예: 토픽·서비스 라벨).
source_post_id는 admin 내부 역추적 전용이며 P2 응답 페이로드에 포함 금지. - 봇 가시성 연계: FR-10 AC-10.1 — P2 고객 노출 봇은
visibility=public고정(ADMIN-PLAN §4-13). 비공개 파생 표준답변은internal봇(상담사 보조)에서만 허용.
2-3. G3 — 직원 내부표현 필터 (안내글 특유, L5)
안내글은 staff가 작성한 글이라 고객 직접 노출이 부적절한 표현이 섞인다. §3에서 상술.
2-4. G4 — 교차 고객/일반화 검증 (L6)
- 본문이 특정 1개 고객·계약·1회성 사례에 묶여 있으면 P2 노출 부적합 → 일반화(고객 식별정보 제거·범용 안내문 재작성)된 버전만 승인. CURATION §5-1 "재사용성" 판단과 동일 게이트에서 PII 관점을 함께 본다.
- 한 표준답변에 원 문의자 외 제3 고객이 언급되면(L6) 무조건 차단·재작성.
3. 안내글(hp_announce) 특유 위험과 가드
안내글은 직원(staff) 작성 공지·안내문이라 Q&A와 위험 프로파일이 다르다. HARVEST §5-3에서 안내글을 별도 테이블·별도 승인 메뉴로 분리했으므로, 안내글 승인 게이트에 아래 3종 추가 검사를 둔다.
| 위험 | 설명 | 위험도 | P2 노출 적절성 | 가드 |
|---|---|---|---|---|
| A1. 특정 고객·계약 언급 | "○○공단 환급과정은…" 류 특정 고객사·계약 직접 지칭 | high | 부적절 | 고객사명 제거·일반화 후 승인. 일반화 불가하면 internal 한정 |
| A2. 내부 정책·가격 | 단가·할인율·내부 운영 기준·미공개 로드맵 | high (영업기밀) | 부적절 | 가격·내부정책 라인 제거 또는 공개 가능 범위로 재작성. 미정 시 차단 |
| A3. "비공개로 처리"류 표현 | "이 건은 비공개로 안내드렸습니다", "내부적으로만 공유" 등 비공개 신호어 | medium | 부적절 | 비공개 신호어(blocked_words 확장 후보) 탐지 → 자동 플래그 + 사람 확인 |
- 안내글 출처·말투 가드(H8): 안내글이 P2에 노출될 때는 "검증된 안내"로 일반화된 말투로만 인용하고, 원 작성 직원·내부 게시물을 출처로 노출하지 않는다. 안내글의
valid_from/valid_to(유효기간) 경과분은 P2 노출 후보에서 자동 제외(노후 정책의 고객 오안내 방지). - 분류 근거 가드: 안내글/표준답변의 staff·customer 분류는
classify.ts의 명시 규칙(@malgnsoft.com/company='맑은소프트')만 사용한다. 이름·말투·도메인 패턴으로 개인을 추정해 분류하지 않는다(추정 금지 — HARVEST §5-5 프롬프트 규약과 정합).
4. 승인 워크플로 연계 — 어디에 게이트를 두는가
approval_status 전이(draft → reviewing → approved, CURATION §3-3) 중 reviewing → approved 전이에 PII/노출 체크를 강제한다. 3계층으로 둔다(자동 스캔 + 사람 체크리스트 + 런타임 가드).
4-1. 계층별 책임
| 계층 | 시점 | 주체 | 내용 |
|---|---|---|---|
| C1 자동 스캔 | draft 저장 시 + 승인 진입 시 | api(자동) | pii_patterns(6종) 매치 → 본문/캡션 PII 후보 하이라이트, 주민번호 발견 시 승인 차단, 비공개 출처(source_post_id → private_yn='Y') private_source_flag 세움, 안내글 비공개 신호어(A3) 플래그, 이미지는 §4-A I1 Vision 1차 트리아지(suspect 플래그)까지만 |
| C2 사람 체크리스트 | reviewing → approved 직전 | 승인자(admin/developer) | §4-2 체크리스트 전 항목 확인 — admin UI에 필수 체크박스로. 미체크 시 승인 버튼 비활성 |
| C3 런타임 가드 | P2 챗봇 노출 시점 | api(자동) | 노출 직전 pii_masking·출처 마스킹 재적용 + 비공개/유효기간 경과 재확인(승인 후 변경 흡수) |
C2(사람)는 책임 소재를 명확히 한다 — 승인자가 체크리스트에 체크하면 그 표준답변/안내글의 P2 노출 적합성에 대한 승인자 책임이 감사 로그(
hp_audit_log)에 기록된다(누가·언제 승인). agent는 승인 권한이 없으므로(CURATION §1-3) PII 게이트의 최종 책임은 admin/developer.
4-2. 승인 체크리스트 (admin UI 필수 체크박스)
reviewing → approved 전이 시 승인자가 확인:
- 본문·이미지 캡션에 이름·연락처·이메일·주소·사업자번호 등 PII가 없다(또는 마스킹됨). 자동 스캔 하이라이트 0건 또는 검토 완료.
- 주민등록번호 등 고유식별정보가 없다(있으면 승인 불가 — 원천 제거 후 재상신).
- (이미지 보유 시) 인용 이미지/스크린샷 PII 검수(§4-A)가 완료되어 모든 인용 이미지의
image_pii_status ∈ clear/removed/masked다(롤업 기준 동일).pending·suspect·blocked가 하나라도 포함되면 승인 불가. 이 항목 미체크 시 승인 버튼 비활성. - 비공개 댓글(
private_yn='Y')에서 파생된 내용이 본문에 없다(출처 게시물 확인).private_source_flag경고 시 본문 일반화 녹임 여부 직접 확인. - 원 문의자 외 제3 고객 정보가 인용되지 않았다(교차 노출 L6).
- (안내글) 특정 고객사·계약·내부 가격/정책·"비공개" 표현이 없다(또는 일반화됨).
- 출처로 원 게시물 ID·프로젝트·고객사명이 노출되지 않는다(일반화 라벨만).
- (안내글) 유효기간이 유효하다(만료 공지를 P2에 승인하지 않음).
체크리스트 전 항목 통과 시에만
approved. 하나라도 불확실하면 반려(rejected, 사유 필수) 또는internal한정 승인(상담사 보조 전용, P2 비노출).이미지 게이트는 하드 게이트다 — 이미지 보유 자산은
image_pii_status롤업(인용 이미지 최악값, §4-B)이clear/removed/masked가 아니면 admin UI에서 승인 버튼이 비활성화되며 강제 우회 불가. 승인자·판정 결과는 감사 로그(hp_audit_log)에 누가·언제 기록.
4-3. 단정 불가 영역 (법무/DPO 확인 필요)
- 비공개 댓글 내용이 일반화돼 본문에 녹은 경우 자동 탐지 불가 — 사람 판단 의존. 운영 중 누락 사례가 발견되면 법무/DPO와 일반화 허용 경계를 재합의.
- 사업자번호·법인명의 "개인정보" 해당 여부는 개인사업자 여부에 따라 갈린다 — 법무/DPO 확인 필요. 본 정책은 보수적으로 마스킹 대상에 포함.
4-A. 이미지/스크린샷 PII 검수 기준 (L2 — 사람 검수 기본)
표준답변/안내글이 인용하는 이미지(hp_image_asset)에는 관리화면 스크린샷·고객 명단 표·캡처 등이 섞이며, 본문 텍스트와 달리 정규식 마스킹이 닿지 않는다. 재큐레이션 복원 자산 580건 중 345건(51.3%)이 이미지를 보존하고 있고, 본문 텍스트는 마스킹됐어도 스크린샷 속 PII는 자동 제외되지 않았다. 따라서 이미지 PII 검수의 기본은 사람 검수다(사용자 방침).
- Vision 자동은 검수 보조(트리아지)일 뿐 자동 통과 금지. Vision 1차는 사람 검수 우선순위를 매기는 트리아지로만 쓴다. Vision이 "PII 없음"으로 본 것을 근거로 자동 통과시키지 않는다 — Vision 미탐(false negative) = PII 노출이므로, 자동 통과는 미탐 리스크를 그대로 떠안는다.
처리 순서 (I1→I2→I3)
| 단계 | 주체 | 내용 | 산출 |
|---|---|---|---|
| I1 Vision 1차 | api(자동, 보조) | AI Gateway→OpenAI Vision으로 PII 의심 이미지 플래그 → image_pii_status='suspect' 후보화(검수 큐 우선순위용) | suspect 플래그(통과 권한 없음) |
| I2 사람 검수 | admin 승인자 | admin 미리보기에서 이미지 확인(suspect 우선). 아래 체크리스트로 유형·위치 판단 | 검수 의견 |
| I3 판정 | admin 승인자 | clear / removed(이미지 인용 자체 삭제) / masked(가림 처리본 교체) / blocked(자산 노출 차단) 확정 + pii_checked_by·pii_checked_at 기록 | 최종 image_pii_status |
검수 체크리스트 (값 전사 금지 — 유형·위치만 기록)
검수자는 화면에 보이는 PII 값을 절대 텍스트로 옮겨 적지 않는다(전사 자체가 2차 노출). 발견 시 유형 라벨과 위치(이미지 ID·대략 영역)만 기록한다.
- 인명·연락처·이메일·주소가 화면에 보인다
- 고객 명단·표(여러 고객 행이 한 번에 노출되는 관리화면 리스트)가 보인다
- 계좌·카드·사업자번호가 보인다
- 주민등록번호 등 고유식별정보가 보인다 → 있으면 즉시
blocked·제외(마스킹 아님, §2-1·5-3 고유식별정보 특칙 동일) - 내부 관리화면(고객 비노출 전용 화면)이 그대로 캡처돼 있다
- 제3자 정보가 교차 노출된다(원 문의자 외 고객, L6)
- 일반 조작안내(메뉴·버튼 위치 등)로서 적합한가 — 적합하면
clear후보
판정 규칙
clear— PII 없음·일반 조작안내로 적합. (단, 사용자 방침상 Vision 단독clear는 금지, 사람 판정 필요)masked— 일부 PII 영역을 가린 처리본으로 교체하면 노출 가능removed— 가림으로 해결 불가하거나 이미지가 본질적으로 명단/내부화면 → 인용 이미지 자체를 답변에서 제거blocked— 고유식별정보 포함 등 노출 절대 불가 → 자산 차단·운영자 알림
국외 이전 유의(Vision 1차): I1은 이미지를 AI Gateway→OpenAI(국외) 로 보낸다 = 개인정보 국외 이전(§5-2 L7과 동일 쟁점). Vision 프롬프트에 값을 전사하도록 요구하지 않으며(유형·위치만 반환), Gateway 프롬프트/응답 로그에 PII가 잔존하지 않는지 api-developer가 점검(§7-2 P7).
표본 검수 운영(cs-operator): (1) 이미지 보유 345건은 100% I1 1차 큐에 적재해 사람 검수 대상으로 올린다. (2) clear 판정분은 무작위 재검수(주 10~20% 표본)로 미탐을 사후 회수. (3) 신규 인용 승인 전 동일 게이트(I1→I3)를 통과시켜 백필 이후 유입분도 동일 기준 적용.
4-B. PII 게이트 상태 컬럼 (DB 영속화 — §8 dba 핸드오프)
승인 게이트(C1·C2)와 이미지 검수(§4-A) 결과를 영속화하는 컬럼. 컬럼 ENUM 값은 최종 통합본으로 고정한다.
| 테이블 | 컬럼 | 값/타입 | 의미 |
|---|---|---|---|
hp_standard_answer, hp_announce | pii_text_status | ENUM pending/clear/masked/blocked | 본문 텍스트 PII 판정(C1 스캔 + C2 확인). 텍스트가 있는 자산에 적용 |
hp_standard_answer, hp_announce | private_source_flag | TINYINT(0/1) | 비공개 출처 파생 경고(§2-2 C1 자동) |
hp_standard_answer, hp_announce | image_pii_status | ENUM none/pending/suspect/clear/removed/masked/blocked | 인용 이미지 롤업(아래) |
hp_standard_answer, hp_announce | pii_checked_by, pii_checked_at | 사용자ID, DATETIME | 텍스트 게이트 검수자·시각 |
hp_image_asset | image_pii_status | ENUM none/pending/suspect/clear/removed/masked/blocked | 이미지 단위 판정(§4-A I3) |
hp_image_asset | pii_checked_by, pii_checked_at | 사용자ID, DATETIME | 이미지 검수자·시각 |
hp_image_asset | pii_finding_types | 유형 라벨 목록(아래 타입 주석) | 발견 유형 라벨만(예: name,phone,account) — 값 전사 금지 |
- 롤업 규칙: 답변/안내글의
image_pii_status= 인용한 이미지들의image_pii_status중 최악값. 우선순위(나쁨→좋음):blocked>pending>suspect>removed/masked/clear. 이미지가 없으면none. 승인은 롤업이clear/removed/masked(또는none)일 때만 가능(§4-2). - MySQL 5.6 제약: 실서버 MySQL 5.6은 JSON 타입을 지원하지 않으므로
pii_finding_types는 LONGTEXT(콤마 구분 라벨 또는 JSON 문자열)로 저장한다. - 백필: 재큐레이션 580건은 텍스트
pii_text_status='pending'으로, 이미지 보유 345건의 이미지 자산은image_pii_status='pending'으로 백필 후 §4-A 게이트를 거쳐 확정한다.
5. 적법성 (한국 개인정보보호법·정보통신망법)
5-1. 수집·인용의 근거 (원 문의자 동의 범위)
- PMS 문의·답변은 상담·고객지원 목적으로 수집된 개인정보다. 이를 표준답변/안내글 자산으로 2차 가공해 챗봇에 노출하는 것은 원 수집 목적(해당 고객 상담)과 다른 목적일 수 있다 → 목적 외 이용 소지.
- 완화책: 표준답변/안내글은 개인 식별정보를 제거한 일반화 형태(가명/익명화) 로만 P2에 노출한다. 식별정보가 제거되면 더 이상 특정 개인의 개인정보가 아니므로 목적 외 이용 쟁점이 해소된다. → §2~4 가드의 적법성 근거 = "P2 노출본은 식별정보 없는 일반화본"이 전제.
- 식별정보를 제거할 수 없는(특정 고객사에만 유효한) 답변은 P2 노출 부적합 →
internal한정. 위험도 high, 정보주체 범위 = 원 문의 고객.
5-2. 국외 이전 (OpenAI / AI Gateway 경유) — L7
- 챗봇 매칭·생성·임베딩 시 본문이 AI Gateway → OpenAI(국외) 로 전송된다 = 개인정보 국외 이전(개인정보보호법 §28의8).
- 가드: P2 노출 후보 본문은 §2-1 마스킹을 임베딩·프롬프트 전송 전에 적용해 PII가 국외로 나가지 않게 한다. 마스킹된 일반화본만 전송되면 국외이전 대상 개인정보가 최소화된다.
- AI Gateway 로깅: Gateway가 프롬프트/응답을 캐싱·로깅하므로(
malgn-helper게이트) 로그에 PII가 남지 않도록 전송 전 마스킹이 선결이다. 로깅 보존기간·PII 잔존 여부는 api-developer와 별도 점검(현행 메모와 동일 포인트). - 위탁·국외이전 고지/동의: Cloudflare(처리위탁)·OpenAI(국외이전)·AWS는 개인정보처리방침에 위탁·국외이전 항목(수탁자·이전국가·항목·목적·보유기간) 고지가 필요하다. P2 고객 대상 서비스 오픈 전 개인정보처리방침 정비 필요 — 위험도 high, 법무/DPO 확인 필요.
5-3. 보존기간·파기
| 자산 | 권고 보존 | 근거 |
|---|---|---|
| 표준답변/안내글 본문 | 무기한(soft delete) — 단 식별정보 제거 후 보존 | ADMIN-PLAN §9 "자료·표준답변 무기한"은 자산 가치 전제이며 식별정보 없는 일반화본 한정으로 해석. 식별정보 잔존본은 자산이 아니라 위험 |
source_post_id 등 출처 역추적 메타 | admin 내부 보존 가능, P2 페이로드 비노출 | L4 |
| 안내글 유효기간 경과분 | 보존하되 P2 노출 제외(valid_to 경과) | §3 |
| 챗 로그·LLM 로그 PII | 본문 90일/메타 1년 후 익명화(ADMIN-PLAN §9) — 마스킹 후 저장이 선결 | NFR-6 |
- 민감정보·고유식별정보(주민번호 등)는 자료·로그에서 발견 시 즉시 제거·차단(보존 대상 아님). 위험도 critical.
6. 위험도·정보주체 범위 요약
| ID | 위험 | 위험도 | 정보주체 | 1차 가드 |
|---|---|---|---|---|
| L1 | 본문 PII 잔존 | high | 원 문의 고객 | G1 마스킹 + C2 체크 |
| L2 | 이미지 캡션·스크린샷 PII | high | 캡처 화면 내 다수 고객 | G1(캡션) + §4-A 이미지 사람 검수(I1 Vision 보조→I2/I3 사람 판정) + §4-2 이미지 하드 게이트(image_pii_status) |
| L3 | 비공개 댓글 파생 | critical | 비공개 응답 받은 특정 고객 | G2 차단 + C2 체크 |
| L4 | 출처 식별자 노출 | medium | 원 문의 고객사 | G2 출처 마스킹 |
| L5 | 안내글 내부표현(고객·가격·정책) | high | 특정 고객사 + 회사 영업기밀 | G3 + A1~A3 |
| L6 | 교차 고객 노출 | critical | 무관한 제3 고객 | G4 + C2 체크 |
| L7 | OpenAI 국외 이전 PII | high | 본문 내 전 정보주체 | G1(전송 전 마스킹) + 처리방침 |
| 주민번호 등 고유식별정보 | — | critical | 해당 개인 | 마스킹 아닌 차단·제거 |
7. 결정 사항 (이 문서로 확정) / 미정
7-1. 결정
| 결정 | 근거 |
|---|---|
승인 ≠ PII 안전. reviewing→approved에 PII/노출 체크리스트 필수 게이트(C2) | L1·L3·L5·L6 |
| 가드는 승인 시점(C1·C2) + 노출 시점(C3) 이중화 | 승인 후 본문 수정·정규식 갱신 흡수 |
PII 마스킹은 hp_setting safety pii_patterns 재사용(별도 세트 안 만듦) + 3종→6종 보강(사업자번호 마스킹·계좌·카드 키워드 근접) | REQUIREMENTS NFR-1 AC-1.3 정합·§2-1 |
| 이미지/스크린샷 PII는 사람 검수 기본 — Vision 자동은 트리아지 보조만, 자동 통과 금지(미탐=노출) | §4-A·사용자 방침 |
이미지 보유 자산은 image_pii_status 롤업(최악값)이 clear/removed/masked일 때만 승인 — 미체크 시 승인 버튼 비활성(하드 게이트) | §4-2·4-B |
비공개 출처 파생은 private_source_flag로 승인 화면 경고(자동 차단 아닌 사람 확인 강제) | §2-2 C1 |
| 주민번호 등 고유식별정보는 마스킹이 아니라 차단·원천 제거(본문·이미지 동일) | 개인정보보호법 §24의2 |
비공개 출처(private_yn='Y') 파생분은 P2 노출 제외(internal 한정) | FR-10 AC-10.1·10.2 |
출처는 일반화 라벨만 노출, source_post_id·프로젝트·고객사명 P2 페이로드 비노출 | L4 |
| P2 노출본은 식별정보 제거된 일반화/가명본만 — 목적 외 이용·국외이전 쟁점 완화 | §5-1·5-2 |
| 임베딩·프롬프트 전송 전 마스킹(국외이전·Gateway 로그에 PII 미잔존) | §5-2 |
staff/customer 분류는 classify.ts 명시 규칙만(이름·패턴 추정 금지) | HARVEST §5-5 |
7-2. 미정 (법무/DPO·후속 협의)
| # | 항목 | 누가 | 영향 |
|---|---|---|---|
| P1 | 비공개 내용이 일반화돼 본문에 녹은 경우 허용 경계 | 법무/DPO + 기획 | §4-3 |
| P2 | 사업자번호·법인명의 개인정보 해당 여부(개인사업자) | 법무/DPO | §2-1·4-3 |
| P3 | 개인정보처리방침 위탁·국외이전(Cloudflare·OpenAI·AWS) 고지문 정비 | 법무/DPO + planner | §5-2 |
| P4 | AI Gateway 로그 PII 잔존·보존기간 실측 점검 | api-developer | §5-2 |
| P5 | 마스킹 정규식 보강(사업자번호·계좌·카드, 3종→6종) 시드 추가 | dba + api | §2-1 |
| P6 | 안내글 "비공개 신호어" 사전(A3) — blocked_words 확장 vs 별도 키 | 기획 + api | §3 |
| P7 | 이미지 Vision 1차(I1) 국외이전 — 프롬프트/응답 값 미전사·Gateway 로그 PII 잔존 점검 | api-developer + 법무/DPO | §4-A·5-2 |
| P8 | 이미지 마스킹(가림) 처리 도구·masked 산출물 교체 방식(R2 처리본 관리) | api + admin + dba | §4-A I3 |
8. 핸드오프 — 후속 작업 (코드는 담당 에이전트가 구현)
| 대상 | 넘기는 것 |
|---|---|
| api-developer | (1) reviewing→approved 전이에 PII 자동 스캔(C1) — pii_patterns(6종) 매치 하이라이트·주민번호 차단·비공개 출처(source_post_id→private_yn='Y') private_source_flag 세움·안내글 신호어(A3) 플래그. (2) 이미지 I1 Vision 1차 트리아지(§4-A) — suspect 플래그까지만(자동 통과 금지), 값 미전사 프롬프트, Gateway 로그 PII 잔존 점검(P7). (3) C3 런타임 가드 — P2 노출/임베딩/프롬프트 전송 직전 마스킹·출처 마스킹·유효기간/비공개·image_pii_status 재확인. (4) P2 응답 페이로드에서 source_post_id·프로젝트·고객사명 제거, 일반화 라벨만. (5) AI Gateway 로그 PII 잔존 실측(P4). (6) 이미지 마스킹 처리본 교체 방식(P8). 실제 마스킹 함수·취약점은 security-reviewer와 분리 검토 |
| admin(frontend) | /standard-answers·/announces 상세에 승인 전 PII 체크리스트(§4-2) 필수 체크박스 + 자동 스캔 하이라이트 패널 + 이미지 미리보기 검수 UI(§4-A I2/I3, suspect 우선·판정 버튼 clear/removed/masked/blocked). 이미지 롤업 image_pii_status가 clear/removed/masked가 아니면 승인 버튼 비활성(하드 게이트). 승인자·이미지 판정 결과 감사 로그 기록 |
| dba | (1) pii_patterns 시드에 사업자번호·계좌·카드 정규식 보강(3종→6종, P5). (2) §4-B 컬럼 추가 — hp_standard_answer/hp_announce에 pii_text_status(ENUM pending/clear/masked/blocked)·private_source_flag·image_pii_status(ENUM none/pending/suspect/clear/removed/masked/blocked, 롤업)·pii_checked_by/at; hp_image_asset에 image_pii_status(동일 ENUM)·pii_checked_by/at·pii_finding_types(MySQL 5.6 → LONGTEXT, 라벨만). (3) 백필 — 580건 pii_text_status='pending'·이미지 345건 image_pii_status='pending'. (4) 안내글 신호어 사전 저장처(P6) |
| cs-operator | (1) 이미지 보유 345건 100% I1 1차 큐 적재·사람 검수 수행(§4-A I2/I3). (2) clear 판정분 무작위 재검수(주 10~20% 표본). (3) 신규 인용 승인 전 동일 게이트 운영. (4) 검수 시 값 전사 금지(유형·위치 라벨만) |
| planner | (1) 본 정본을 CURATION §8-D/T8·HARVEST H8/§9-E·REQUIREMENTS Q3 해소로 상호참조 갱신. (2) 개인정보처리방침 위탁·국외이전 고지문 정비를 P2 오픈 전 마일스톤으로(P3, 법무/DPO 협업) |
| 법무/DPO | §7-2 P1·P2·P3·P7 확정 — 일반화 허용 경계·사업자번호 해석·처리방침 국외이전 고지·이미지 Vision 1차 국외이전 적법성 |
| security-reviewer | 마스킹 정규식 우회(부분 일치·인코딩)·런타임 가드 누락·이미지 게이트 강제 우회(image_pii_status 검증 누락) 등 보안 취약점 검토(본 문서는 정책, 취약점은 분리) |
9. 정합 — 다른 정본과의 관계
| 정본 | 관계 |
|---|---|
| REQUIREMENTS.md | FR-10.3·NFR-6.3·Q3가 본 문서로 해소. 본 문서가 비공개·PII 세부 규칙 정본 |
| STANDARD-ANSWER-CURATION.md | §8-D·T8(비공개 출처 P2 가드)를 본 문서로 위임. 승인 워크플로(§3)에 §4 PII 게이트를 얹음 |
| PMS-INQUIRY-HARVEST.md | H8·§9-E(안내글 P2 가드)를 본 문서 §3으로 해소. 수집 단계에서 비공개 본문 미혼입은 HARVEST 책임, 노출 가드는 본 문서 |
| ADMIN-PLAN.md | §4-9 안전 가드(pii_patterns)·§4-13 봇 가시성(public/internal)과 G1·G2 연계 |
| HP-SCHEMA.md | private_yn 마스킹 관례·source_post_id 역추적과 정합. §4-B PII 게이트 컬럼(pii_text_status·image_pii_status·private_source_flag·pii_checked_by/at·pii_finding_types)을 dba가 추가 시 HP-SCHEMA 현행화 필요(이번 편집 범위 외) |