PII Scanner & Microsoft SEAL Demo
Presidio 로 민감정보를 감지하고 등급을 자동 분류, Microsoft SEAL 동형암호로 데이터를 보호한 채 연산합니다.
1. 파일 업로드
보안등급 분류
요약
| # | Entity | Match | Start | End | Score | Recognizer |
|---|
본문 미리보기 (감지된 부분 하이라이트)
파일을 업로드하면 미리보기가 표시됩니다.
활성 인식기
SEAL 컨텍스트
SEAL 이란?
Microsoft SEAL 은 동형암호(Homomorphic Encryption) 라이브러리입니다. 데이터를 복호화하지 않은 상태로 덧셈/뺄셈/곱셈 등의 연산을 수행할 수 있어 개인정보를 외부 서버에 노출하지 않고 처리하는 시나리오에 사용됩니다. 이 데모는 브라우저(node-seal WASM) 에서 모든 키 생성/암호화/연산을 수행합니다.
1. 평문 입력 → 암호화
2. 암호문에 직접 연산
3. 복호화 & 검증
| Decrypted | - |
|---|---|
| Expected (plaintext) | - |
| Match | - |
파라미터
키 (Keys)
모두 base64 직렬화 (save()) 결과입니다. 비밀키는 실서비스에서 절대 외부로 유출 금지.
암호문 (Ciphertexts)
실행 로그
이 데모가 보여주는 것
문서 내부에 특정 주민등록번호가 들어있는지를, 문서를 복호화하지 않고 동형암호 연산만으로 검사합니다.
후보 RRN 들은 클라이언트에서 13자리 숫자 벡터로 BFV 암호화되어 서버로 전달되고,
서버는 비밀키 없이 (ct − target)² 만 계산해 결과 암호문을 돌려줍니다.
클라이언트만이 결과를 복호화할 수 있고, 13개 슬롯이 모두 0 이면 일치(MATCH) 입니다.
※ BFV 스킴이 필요합니다. SEAL 탭이 아직 초기화되지 않았다면 자동으로 BFV/4096 으로 초기화됩니다.
1. 입력
2. 결과
| # | 위치 | 후보 | 검사값 | 결과 |
|---|---|---|---|---|
| 실행 후 표시됩니다. | ||||
Exact: 13개 슬롯의 절댓값 합 (0 → MATCH). · Pattern: (g-1)(g-2)(g-3)(g-4) 의 슬롯 6 값 (0 → 유효한 RRN 형식).
프라이버시 경계
[ EXACT MATCH ]
┌─────────── CLIENT ───────────┐
│ regex /\d{6}-?[1-4]\d{6}/g │
│ 각 후보 → [d0..d12] → BFV enc │
└──────────────↓────────────────┘
┌─────────── SERVER (no sk) ────┐
│ diff = ct - Plain(target) │
│ sq = diff * diff │
│ relinearize │
└──────────────↓────────────────┘
┌─────────── CLIENT ───────────┐
│ 슬롯 0..12 합 = 0 ⇒ MATCH │
└──────────────────────────────┘
[ PATTERN MATCH ]
┌─────────── CLIENT ───────────┐
│ regex /\d{6}-?\d{7}/g │
│ (성별 자리 필터링 X — 모두 통과) │
│ 각 후보 → [d0..d12] → BFV enc │
└──────────────↓────────────────┘
┌─────────── SERVER (no sk) ────┐
│ d1 = ct - 1 d2 = ct - 2 │
│ d3 = ct - 3 d4 = ct - 4 │
│ m12 = d1 * d2 (depth 1) │
│ m34 = d3 * d4 (depth 1) │
│ p = m12 * m34 (depth 2) │
│ → p(g)=(g-1)(g-2)(g-3)(g-4) │
└──────────────↓────────────────┘
┌─────────── CLIENT ───────────┐
│ 슬롯 6 의 값 = 0 │
│ ⇒ 성별자리 ∈ {1,2,3,4} │
│ ⇒ 유효한 RRN 형식 │
└──────────────────────────────┘
키 (Keys)
SEAL 탭과 동일한 컨텍스트의 키. 비밀키는 실서비스에서 외부 유출 금지.
암호문 (Ciphertexts)
후보별로 입력 암호문 (클라이언트가 전송) 과 서버 결과 암호문 (동형연산 후) 두 개가 짝지어 표시됩니다.
실행 로그
이 데모가 보여주는 것
문서 안에 임의의 키워드 또는 와일드카드 패턴 이 들어있는지를, 토큰을 BFV 암호화한 채로 검사합니다.
길이가 같은 토큰들이 후보가 되며 서버는 (ct − target)² × mask 만 동형연산해 결과 ct 를 돌려줍니다.
클라이언트만이 복호화로 매치 여부를 확인합니다.
※ 본 데모는 ASCII 문자 (코드포인트 ≤ 127) 에 한해 동작합니다 — plain modulus 가 20bit 라 비ASCII 코드는 제곱 시 오버플로 가능. 한국어 패턴 검색은 PII Scanner 탭의 사용자 정의 룰을 사용하세요.
1. 입력
2. 결과
| # | Pattern | Token | 위치 | 슬롯합 | Match |
|---|---|---|---|---|---|
| 실행 후 표시됩니다. | |||||
패턴과 같은 길이의 토큰들이 후보. 슬롯합 = 마스킹된 squared diff 의 합 (0 → MATCH).
프라이버시 경계
┌─────────── CLIENT ───────────┐ │ 공백 단위 토큰화 │ │ 패턴 P (길이 L) 와 같은 길이만 추림 │ │ 각 토큰 → 코드포인트 벡터 → BFV │ │ [c0, c1, ..., cL-1, 0, 0, ...] │ └──────────────↓────────────────┘ ┌─────────── SERVER (no sk) ────┐ │ target = Plain([P0..PL-1]) │ │ (와일드카드 자리는 0) │ │ mask = Plain([m0..mL-1]) │ │ (mi=1 if Pi 리터럴, 0 if *) │ │ diff = ct − target │ │ sq = diff × diff (depth 1) │ │ relinearize │ │ out = sq × mask (depth 2) │ │ → 와일드카드 자리는 0 유지 │ └──────────────↓────────────────┘ ┌─────────── CLIENT ───────────┐ │ 슬롯 0..L-1 합 = 0 ⇒ MATCH │ └──────────────────────────────┘
키 (Keys)
SEAL/RRN 탭과 동일한 컨텍스트의 키.
암호문 (Ciphertexts)
패턴별로 후보 토큰의 입력 ct 와 서버 결과 ct 가 나열됩니다.
실행 로그
학습 / 이력 — 사용자 정정으로 분류기 자동 개선
사용자가 AI 권고를 [C][S][O] 버튼으로 정정한 데이터를 모아, 분류기 가중치를 자동으로 갱신합니다. 자동화이지만 사용자가 "학습 라운드 실행" 버튼으로 트리거.
📖 초보 가이드 — 학습이 어떻게 동작하나요?
핵심 흐름 (5단계):
- 결정 누적 — 파일 분석 탭에서 [C][S][O] 버튼으로 사용자 최종 분류 기록.
- 학습 조건 검사 —
labeled ≥ 10(총 결정),per-class ≥ 3(각 등급별),gap ≥ 3(AI와 다른 결정). 조건 통과해야 학습 가능. - "학습 라운드 실행" 클릭 → 1-step SGD on linear score → gradient 계산.
- 결과 확인 — 가중치 변화 (Δw 차트) + 학습 전후 정확도/SSE 비교.
- "핫스왑" 채택 — 새 가중치로 즉시 분류기 갱신 (서버 재시작 X).
학습 vs Rule Mining (운영 탭) 의 차이:
- 학습 (이 탭) = 자동 — gradient 계산해서 모든 entity 가중치 일괄 갱신.
- Rule Mining (운영) = 제안만 — 후보를 표시, 사용자가 각각 검토 후 채택.
하이퍼파라미터 (위 입력창):
η(learning rate) — 가중치 변화 속도. 크면 빠르지만 진동, 작으면 학습 더딤. 기본 0.05.max|Δw|— 단일 라운드의 가중치 변화 한계 (안전망). 기본 0.5.
모델 버전 이력: 모든 학습 라운드 결과가 model_versions 테이블에 영속 보존. 잘못된 학습은 이전 버전으로 롤백 가능.
강제 실행 (force): 학습 조건 미달이어도 실험 목적으로 실행. 데이터 적어서 결과는 노이즈가 클 수 있음.
SPEC 출처: §1 기능 5/6/7/8/10 + §10 학습 파이프라인.
학습 조건
학습 결과
결정 이력 (사용자 라벨)
| # | 파일 | AI | User | gap | score | conf | 일시 |
|---|---|---|---|---|---|---|---|
| 결정 없음 | |||||||
이전 학습 라운드 이력
| # | 일시 | 샘플 | acc | SSE | 상태 |
|---|---|---|---|---|---|
| 학습 이력 없음 | |||||
📚 모델 버전 이력
Neural 모델 (KoELECTRA + mDeBERTa)
SPEC §3.4 의 신경망 백본 — frozen 상태로 CLS 임베딩 추출 후 선형 헤드로 분류. 학습 데이터 0건이어도 프로토타입 zero-shot 모드로 동작.
현재 헤드 상세
익명화 / 등급강등 — PII 가린 채 안전하게 공유
분류된 문서를 외부에 보내야 하는데 PII 가 있다면? 정책에 따라 마스킹/치환/일반화 → 등급 강등까지 자동 반복. 가명화 framework 탭 과는 다릅니다 (아래 가이드 참조).
📖 초보 가이드 — 익명화가 어떻게 동작하나요?
핵심 흐름 (3단계):
- 입력 — 파일 분석 결과 가져오기 또는 텍스트 직접 붙여넣기.
- "1회 익명화" — 현재 정책 1번 적용 → entity 별 치환된 텍스트 출력.
- "target 등급까지 반복" — 정책을 반복 적용해 목표 등급에 도달 (최대 N번).
익명화 (이 탭) vs 가명화 framework (별도 탭) 의 차이:
| 측면 | 익명화 (이 탭) | 가명화 framework |
|---|---|---|
| 기준 | HE-TEST 자체 정책 | ISO 20889 + 27559 + DPV 2.0 + 4개 관할 법령 |
| 목적 | 빠른 등급 강등 (내부 공유) | 컴플라이언스 보고 (외부 송신) |
| 출력 | 치환된 텍스트 + 새 등급 | + 관할별 준수 판정 (KR/JP/US/EU) |
| 엄격함 | 중간 (PoC 단순화) | 높음 (법령 매핑) |
6가지 처리 방법 (method):
mask— 별표(*)로 가림. 예:800101-1234567→******-*******remove— 통째로 삭제 (AWS key 같은 자격증명)replace— placeholder. 예:hong@example.com→[EMAIL_1].consistent: true면 같은 원본은 같은 번호 (문서 내 cross-reference 보존)generalize— 상위 개념으로. 주소 구→시, 날짜 일→월shift— 날짜를 ±N일 무작위 시프트 (시간 순서는 유지)round— 숫자를 N단위로 반올림 (금액 통계용)
target 등급 의미:
- O 공개 — PII 다 가려짐. 외부 공유 가능 수준.
- S 민감 (default) — 이메일 등 약식별자 남기되 주민번호 같은 강식별자는 가림.
- C 위험 유지 — 강등 안 함. 분석 후 비교만 할 때.
정책 수정 어디서? 운영 → 정책 편집기 탭에서 entity 별 method/옵션 변경. 변경 즉시 영속 (anonymization_policy.json).
SPEC 출처: §15 익명화.
익명화 입력
최근 분석한 파일을 가져오거나 텍스트를 직접 붙여넣기. 분석 → 정책에 따라 entity 별 마스킹/치환/일반화 → 등급 재평가.
익명화 정책
entity 별 처리 방법 + target 등급 + 최대 반복 횟수. 변경 시 즉시 영속 (anonymization_policy.json).
결과
스코어링 룰 / 기준 — 분류기가 어떻게 점수를 매기는가
현재 분류기 rule-v1 의 모든 가중치·임계값·하이퍼파라미터를 한 화면에. 학습 후에는 가중치가 갱신되지만 공식 자체는 동일.
📖 초보 가이드 — 분류기가 어떻게 동작하나요?
점수 기반 분류 (rule-v1) 의 직관:
- 문서에서 PII 항목을 찾는다 (PII 분석 단계).
- 각 항목의 가중치 만큼 점수를 더한다 (주민번호 5점, 이메일 1점 등).
- 등급 키워드 (예: "비밀번호") 가 있으면 점수 추가.
- 비한국어이면 보수적으로 등급 ↑ (정보 부족 보완).
- 최종 점수와 임계값을 비교 → C / S / O 결정.
채점 공식 (단순화):
score = Σ (ENTITY_WEIGHTS[type] × count) + LANGUAGE_PENALTY + KEYWORDS_BOOST if score ≥ T_C → C (위험) if T_S ≤ score < T_C → S (민감) else → O (공개)
주요 가중치 (default — 학습으로 변경 가능):
KR_RRN(주민번호) — 5.0 (가장 위험)CREDIT_CARD— 4.5KR_PASSPORT— 4.0EMAIL_ADDRESS— 1.0 (약식별자)...더 많은 항목은 아래 표 참조
왜 룰 기반인가? — 신경망 (KoELECTRA + mDeBERTa) 와의 차이:
| 측면 | 룰 (rule-v1) | 신경망 (neural.py) |
|---|---|---|
| 설명 가능성 | ✅ 매 점수의 근거 표시 | ⚠ 블랙박스 (SHAP 으로 일부) |
| 데이터 요구 | 적음 (0~수십 건도 동작) | 많음 (수백~수천) |
| 속도 | 매우 빠름 (μs) | 느림 (수초, GPU 권장) |
| 복잡 패턴 | ⚠ 단순 합 모델 | ✅ 문맥 이해 |
HE-TEST 는 둘을 weighted ensemble (α default 0.5) 로 결합합니다.
룰 추가/수정 — 동적 편집:
custom_patterns.yaml— 정규식·키워드 인식기 자유롭게 추가- "Reload Patterns" 버튼 → 즉시 반영 (서버 재시작 X)
- API:
/api/rules/pattern,/api/rules/grade-keyword등으로 프로그래밍 방식 편집
신뢰도 (confidence): 점수가 등급 경계에서 얼마나 떨어졌는가. 경계에 가까우면 낮은 신뢰도 (사용자 검토 권장), 멀면 높은 신뢰도. 운영 → 신뢰도 보정 (Platt) 탭에서 보정 가능.
SPEC 출처: §3.4 룰엔진 + §3.5 분류기.
스코어링 공식
분류기 rule-v1 가 문서를 채점하는 방식. 학습 후에는 가중치가 갱신되지만 공식 자체는 동일.
등급 정의 (C / S / O)
| 등급 | 임계값 | 의미 |
|---|
🎯 신뢰도 (confidence)
🔧 학습 하이퍼파라미터 + 트리거
| 상수 | 값 | 설명 |
|---|
🧮 Entity 가중치
PII 인식기가 매칭한 entity 1건당 점수에 더해지는 가중치. 학습 시 갱신됨.
| Entity | 가중치 | 막대 |
|---|---|---|
| 로딩 중… | ||
🔤 등급 키워드 보너스
본문 (lowercase) 에서 매칭된 키워드 1건당 점수. 동일 키워드 누적은 3회까지만 카운트.
| 키워드 | 가중치 | 표시 라벨 |
|---|---|---|
| 로딩 중… | ||
📋 룰셋 다운로드
현재 활성 룰셋(가중치 + 임계값 + 하이퍼파라미터)을 JSON 으로 내보냅니다. 학습 후 핫스왑된 가중치도 즉시 반영됩니다.
➕ PII 정규식 패턴 추가 → custom_patterns.yaml
한국형 PII 패턴(여권 / 외국인등록 / 운전면허 / 차량번호 등)을 즉시 등록. 추가 시 분석 엔진이 자동 재구축됩니다.
➕ Deny-list (키워드 명단) 추가
VIP 명단 / 보안 프로젝트명 같이 고정된 단어 목록을 직접 매칭. 한 줄에 한 단어씩 입력.
➕ 등급 키워드 보너스 추가 → extra_grade_keywords.json
본문에 매칭되면 점수에 직접 가산되는 키워드. 빌트인 + 사용자 추가가 모두 활성됩니다.
사용자 추가 키워드 (영속 저장)
📜 현재 custom_patterns.yaml 내용
—
로딩 중…
가명화 framework (KR·JP·US·EU) — 국제 표준 + 4개 관할 매트릭스
ISO 20889 + 27559 + W3C DPV 2.0 + 4개 관할 (한국 PIPA / 일본 APPI / 미국 CCPA / 유럽 GDPR) 법령 매트릭스 기반의 정식 가명/익명화 PoC.
📖 초보 가이드 — 왜 별도 framework 가 필요한가요?
상황: 단순 익명화 (PII 가리기) 만으로는 외부 공유·해외 송신 시 법규를 만족하지 못합니다. 한국 PIPA, 유럽 GDPR, 일본 APPI, 미국 CCPA 가 각자 다른 기준을 요구.
표준의 의미:
- ISO/IEC 20889 — 가명화/익명화의 기법 표준 (masking, tokenization, generalization, suppression 등 7가지).
- ISO/IEC 27559 — 익명화 후의 재식별 위험 평가 표준 (k-anonymity 등).
- W3C DPV 2.0 — 데이터 카테고리 온톨로지 (검출된 PII 를 표준 클래스에 매핑).
- 4개 관할 법령 — 각 국가의 PII 정의·처리 요구사항·보존 기간 등.
처리 흐름 (아래 SVG 다이어그램 참조):
- 입력 — 파일/텍스트 + 관할 선택 (KR/JP/US/EU 다중 선택) + 처리 수준 (가명화/익명화)
- PII 검출 — Presidio + 한국어 NER (분류 파이프라인 재사용)
- DPV 매핑 — 검출된 PII 를 W3C DPV 카테고리에 매핑 (예: KR_RRN → dpv:NationalIdentificationNumber)
- 관할 분류 — 각 PII 를 identifier (직접식별) / quasi (준식별) / sensitive (민감) 로 분류 (관할마다 다름)
- ISO 20889 기법 적용 — masking, tokenization, generalization, suppression 등 (entity 종류에 따라 자동 선택)
- 변환문 + 관할별 준수 판정 — 결과 텍스트 + 각 관할 (KR/JP/US/EU) 의 요구사항 만족 여부 별도 평가
처리 수준 (treatment_level):
- pseudonymization (가명화) — 원본 복원 가능. 매핑 키만 별도 보관하면 추적/재식별 가능. 내부 분석/통계 목적.
- anonymization (익명화) — 비가역. 매핑 자체를 폐기. 외부 공개·연구 목적.
익명화 / 등급강등 탭과의 차이:
| 사용 상황 | 선택 |
|---|---|
| 내부 공유 / 빠른 등급 강등 | 익명화 / 등급강등 탭 |
| 외부 공개 / 컴플라이언스 보고서 | 가명화 framework 탭 (이 탭) |
| 해외 송신 (GDPR 등 적용) | 가명화 framework 탭 (관할 다중 선택) |
관할별 핵심 차이 (요약):
- KR (PIPA) — 주민번호·여권번호 등 고유식별번호 엄격. 가명정보 결합 시 동의 또는 통계 목적 제한.
- JP (APPI) — 가명가공정보 / 익명가공정보 구분. 매핑 폐기 의무.
- US (CCPA) — Personal Information 광범위. opt-out 권리. 14세 미만 추가 보호.
- EU (GDPR) — Personal Data + Special Category (인종·종교·건강 등) 구분. 가명화는 추가 보호조치 (recital 28).
SPEC 출처: 본 framework 는 origin/main 의 pseudo_framework.py 모듈 + 아래 SVG 다이어그램으로 시각화.
처리 흐름 — ISO/IEC 27559 기반 PoC
1. 입력 / 옵션
가명화: 매핑 분리 보관 시 식별 가능 (GDPR Art 4(5), KR PIPA §28-2). 익명화: 어떤 합리적 수단으로도 재식별 불가.
2. 처리 결과 — 원문 vs 변환문
| 원문 (Original) | 변환문 (Transformed) |
|---|---|
실행 후 표시됩니다. |
실행 후 표시됩니다. |
3. 검출 엔티티 → DPV → 분류 → 기법
| # | Entity | DPV (W3C) | 관할 분류 | 기법 (ISO 20889) | 변환 |
|---|---|---|---|---|---|
| 실행 후 표시됩니다. | |||||
4. 규제별 준수 판정
5. 처리 로그
🇰🇷 대한민국 — 개인정보보호법 (PIPA) 컴플라이언스
개인정보보호법 + 신용정보법 + 분야별 가이드라인. 본 페이지는 참조용 PoC — 실제 신고는 법무·DPO 검토 필수.
📖 빠른 가이드 — PIPA 의 정보 분류 (2020 개정)
- 고유식별정보 (§24) — 주민등록번호·여권번호·운전면허번호·외국인등록번호. 주민등록번호는 §24-2 별도 처리제한 (법령 근거 필수).
- 민감정보 (§23) — 사상·신념·노조·정치·건강·성생활·유전·전과. 별도 동의 또는 법령 근거 필요.
- 개인정보 (§2) — 식별 가능한 정보. 단독 또는 결합으로 특정 가능.
- 가명정보 (§28-2~7, 2020 신설) — 통계·연구·공익 목적 활용. 추가정보 별도 보관 필수.
- 익명정보 (§58-2) — 어떤 추가정보로도 복원 불가. PIPA 적용 제외.
유출신고: 72시간 내 PIPC + KISA. 트리거 — ① 1,000명 이상 / ② 민감정보 / ③ 자격증명. 위반 시: 행정처벌 + 손해배상 (법정·징벌적).
1. PII 검출기 + 정책 — 구현 현황
2. 분야별 가이드라인
3. 유출신고 양식 자동 초안 (§34)
1,000명 이상 / 민감정보 / 자격증명 유출 시 72시간 이내 PIPC + KISA 신고.
아직 생성되지 않음 — 좌측 버튼으로 생성하세요.
🇺🇸 United States — HIPAA · CCPA · GLBA Compliance
Sector-specific regulations + state laws. 본 페이지는 참조용 PoC — 실제 보고서는 outside counsel 검토 필수.
📖 Quick Guide — Federal · State · Sectoral 3축
- HIPAA (1996) — Healthcare 분야. Safe Harbor 18 식별자 모두 제거 (§164.514(b)(2)(i)). PHI 보호.
- CCPA/CPRA (California, 2018 / 2023) — opt-out 권리. Sensitive Personal Information 별도 카테고리 (§1798.140(ae)).
- GLBA (1999) — Financial 분야. NPI (Nonpublic Personal Information).
- FCRA — Consumer reports (신용보고서).
- COPPA — 13세 미만 아동.
- FERPA — 학생 교육기록.
HIPAA Breach Notification: 60일 (Individuals + HHS) / 미디어 (≥500명). State laws: 모든 50개 주가 별도 통지법 보유 (California Civ. §1798.82 등).
Penalties: HIPAA Tier 4 최대 $1.5M/year; FTC enforcement; class action 가능.
1. PII Detectors + Policy — Implementation Status
2. Sectoral Guidelines
3. HIPAA Breach Notification Draft (45 CFR §164.400-414)
Individuals: 60d / HHS: 60d / Media (≥500): 60d. State laws vary.
Not generated yet — click buttons on left.
🇯🇵 日本 — APPI / マイナンバー법 컴플라이언스
개인정보보호법 + 마이넘버법 + 분야별 가이드라인. 본 페이지는 참조용 — 실제 보고는 법무 검토 필수.
📖 빠른 가이드 — APPI 3단 계층 구조
- 기본법 — 個人情報保護法 (APPI). 2003년 제정, 2015·2020·2022 개정. 한국 PIPA 와 거의 대응.
- 특별법 — マイナンバー法. 12자리 마이넘버 전용. APPI 보다 엄격 (利用目的限定·暗号化義務).
- 분야 가이드라인 — 金融 (FSA) · 医療 (MHLW) · 電気通信 (MIC).
유출신고 (APPI §26): 速報 3-5일 / 確報 30일. 마이넘버 위반 시 §51 不正取得罪 (최대 4년 징역).
📌 한국 PIPA 와 핵심 차이: 마이넘버 = 별도법 (한국은 PIPA 통합). 유출신고 트리거가 훨씬 광범위 ("권리침해 우려 시" 무조건).
マイナンバー法 — 별도 엄격 규제 ⚠ 가장 엄격
- 利用目的限定 (§19) — 사회보장·세무·재해대책 3분야만. 그 외 보관 자체 위법.
- 안전관리조치 의무 (§12) — 암호화·접근통제·감사로그 (PPC 가이드라인 §4).
- 벌칙 (§48~57) — 부정제공 최대 4년 / 법인 ¥1억~¥2억.
HE-TEST 대응: JP_MY_NUMBER 정책을 remove 강제. my_number_act 위반 자동 판정 (verdict=insufficient). ✅ 구현
1. JP PII 검출기 + 정책 — 구현 현황
2. 분야별 가이드라인 (金融·医療·電気通信)
3. PPC 漏洩等報告 양식 자동 생성
APPI §26 + 시행규칙 §8 — 5W1H 9項目. 速報 3-5일 / 確報 30일.
아직 생성되지 않음 — 좌측 버튼으로 생성하세요.
🇪🇺 European Union — GDPR Compliance
Regulation 2016/679 + ePrivacy Directive + national implementations. 본 페이지는 참조용 PoC — 실제 신고는 DPO 검토 필수.
📖 Quick Guide — GDPR 핵심 7개 원칙 + Special Categories
- Personal Data (Art 4(1)) — 식별 가능한 자연인의 정보. IP 도 포함 (Breyer C-582/14).
- Special Categories (Art 9) — race·political·religious·trade union·genetic·biometric·health·sex life. 처리 금지 원칙, Art 9(2) 예외만 허용.
- Criminal data (Art 10) — 공식기관 또는 회원국 법령 근거 시에만.
- Pseudonymisation (Art 4(5)) — 추가정보 별도 보관. 가명화 자체로는 개인정보 지위 유지.
- Anonymisation (Recital 26) — 합리적 수단으로도 재식별 불가. GDPR 적용 제외.
7대 원칙 (Art 5): lawfulness · fairness · transparency · purpose limitation · data minimisation · accuracy · storage limitation · integrity & confidentiality · accountability.
유출신고: Art 33 (DPA, 72시간) / Art 34 (data subjects, "without undue delay" if high risk). Penalty: 최대 €20M 또는 글로벌 매출 4% (Art 83).
1. PII Detectors + Policy — Implementation Status
2. Sectoral & Cross-Border Guidance
3. GDPR Art 33 / Art 34 Breach Notification Draft
Supervisory Authority (DPA): 72 hours / Data Subjects: without undue delay if high risk.
Not generated yet — click buttons on left.
전체 구성도
HE-TEST 의 모든 데이터 흐름을 9개 파이프라인으로 정리한 지도입니다. 각 파이프라인의 부제에 적힌 SPEC 출처와 모듈 파일을 함께 보세요.
📖 초보 가이드 — 9개 파이프라인 한눈에
- 분류 추론 파이프라인 — 파일 한 개를 받아 등급(C/S/O) 으로 분류하는 메인 흐름. (탭: 파일 분석)
- 신경망 분류 — KoELECTRA + mDeBERTa 두 백본의 임베딩을 조합한 보조 분류기. rule-v1 과 가중 평균.
- 사용자 피드백 → 학습 루프 — 사용자가 [C][S][O] 버튼으로 정정한 결정을 SQLite 에 누적, 조건 도달 시 가중치 자동 갱신. (탭: 학습 / 이력)
- 가명화 framework (KR·JP·US·EU) — ISO 20889 + DPV 매핑 + 4개 관할 법령 매트릭스. (탭: 가명화 framework)
- 익명화 / 등급강등 — 정책에 따라 PII 를 placeholder 로 바꾸고 등급을 한 단계 내림. (탭: 익명화 / 등급강등, 정책 편집은 정책 편집기)
- Rule Mining — 학습이 자동이라면 Rule Mining 은 "제안만" — 사용자 검토 후 채택. (탭: Rule Mining)
- Platt Calibration — 분류기 신뢰도 숫자를 진짜 정답률에 맞춰 보정. (탭: 신뢰도 보정 (Platt))
- Drift Detection — 분류 패턴 변화 (정확도/갭/entity 분포) 자동 감지·알림. (탭: Drift 탐지)
- HE 학습 시연 — 다중 사용자의 gradient 를 BFV 동형암호로 평문 없이 합산. (탭: HE 학습 시연)
- + 별도 파이프라인: 동형암호 (HE) — RRN/Keyword 검색용 BFV/CKKS 데모. (탭: SEAL Demo / RRN Search / Keyword Search)
색상 범례 — 노드 색상이 어디서 동작하는지 의미합니다:
학습(train.py) 이 자동 갱신이라면, Rule Mining 은 "이렇게 바꿔보세요" 제안만 — 사용자 검토 → 채택. 더 안전.
학습 데이터: (score=ai_confidence, label = ai_grade==user_grade). 결과: 시그모이드 두 파라미터 (A, B). 분류 결과 카드의 신뢰도가 실제 정답률 에 맞춰 보정됨.
최근 N건(window A) vs 이전 N건(window B). 정확도 −15%p 이상 하락 시 alert, 평균 갭 +0.3 이상 증가 시 warn, entity 분포 PSI ≥ 0.1 시 info.
개별 사용자의 gradient 가 행동 패턴을 노출 → BFV 동형암호로 합산 후 평균만 노출. 일반 학습 루프의 "Gradient 계산" 단계와 결합 가능 (현재 데모).
💡 두 가지 보안 모델 — (1) 분류 / 학습 / 가명화 / 익명화 / Rule Mining 파이프라인은 local-first (서버=Flask 가 평문을 처리하지만 100% 로컬 머신에서만 동작, 외부 송신 없음). (2) 동형암호 (HE) + HE 학습 시연 은 한 단계 더 — 평문이 메모리에서도 사라지고 ciphertext 만 처리. 다중 사용자 / 다중 머신 시나리오에서 빛남. 클라이언트 WASM (node-seal) 으로 동작.
🧰 사용 모듈 / SW 스택
현재 프로세스에서 실제 import 되어 동작 중인 라이브러리 + SPEC §3 에 명시됐으나 아직 통합 안 된 항목까지 모두 표시. 어디서 동작하는지(서버 / 브라우저 / 저장소) 색상으로 구분.
✅ KoELECTRA / mDeBERTa 신경망 분류는 통합 완료 — neural.py 가 두 백본 frozen + linear head 로 동작 (SPEC §1 기능 2 · §3.4).
classifier.py rule-v1 과 weighted ensemble (α default 0.5).
⚠ 현재 미구현/부분 구현: SPEC §2.6 동형암호 학습 (gradient HE 보호) — HE 모듈은 별도 데모만,
학습 gradient 와 연결 X. SPEC §2.4 갭 활용 4가지 중 1번 (sample weight) 만 완료, 2/3/4
(Platt calibration · rule mining · drift detection) 미구현. SPEC §2.1 IndexedDB/OPFS →
현재는 서버 SQLite (decisions.db) 로 대체.
성능 대시보드
요청 timing + 시스템 메트릭. 페이지가 보이지 않으면 자동 폴링이 멈춥니다 (성능 영향 0).
⏱ Phase 별 Latency (ms)
🖥 CPU (logical core 별, %)
🌐 Browser 환경 (클라이언트)
📋 최근 30 요청
| ts | path | total ms | status |
|---|---|---|---|
| 데이터 없음 | |||
🛤 Path 별 호출 횟수
| path | count |
|---|---|
| — | |
로그 뷰어
익명화 정책 편집기
파일에서 검출된 개인정보(PII)를 어떻게 처리할지 결정하는 규칙표입니다. 이메일은 마스킹할까? 주민번호는 별표로 가릴까? 이름은 [PERSON_1] 같은 placeholder 로 바꿀까? — 각 항목별 선택을 여기서 합니다.
📖 초보 가이드 — 정책이 왜 필요한가요?
문제: "민감 등급 (S)" 으로 분류된 문서를 외부에 공유해야 한다고 합시다. 그대로 보내면 안 되고, 개인정보를 가려야 합니다. 그런데 어디까지 가려야 안전한지, 어떻게 가려야 가독성이 살아있는지 는 항목별로 다릅니다.
예시:
- 주민번호
800101-1234567→******-*******(전부 가려야 함, mask) - 이메일
hong@gmail.com→[EMAIL_1](placeholder 로 일관성 보존, replace) - 전화번호
010-1234-5678→***-****-5678(마지막 4자만 남기기, preserve_last) - 주소
서울특별시 강남구 역삼동 123-45→서울특별시 강남구(하위 단위 제거, generalize) - 날짜
2026-05-09→2026-04-21(±30일 무작위 시프트, shift)
정책의 6가지 처리 방법 (method) — 각 PII 항목에 1개씩 지정:
mask— 별표(*)로 가림.preserve_last: 4로 끝 4자 보존 가능remove— 통째로 삭제 (자격증명 등)replace— placeholder (예:[EMAIL_%d]) 로 교체.consistent: true면 같은 원본은 같은 번호generalize— 상위 개념으로 (주소 구→시, 날짜 일→월)shift— 날짜를 ±N일 무작위 시프트 (시간 순서는 보존)round— 숫자를 N단위로 반올림
등급 강등 (downgrade): 정책을 적용한 뒤 다시 분류했을 때도 등급이 안 내려가면 (예: C 등급 그대로) 더 강한 정책으로 자동 반복 적용. target_grade 까지 도달하거나 max_iterations 만큼 반복.
Entity 별 처리 정책
각 PII 항목(KR_RRN 주민번호, EMAIL_ADDRESS 이메일, …)에 어떤 method 를 쓸지 선택. 변경 후 "저장" 클릭.
| Entity Type | Method | 옵션 |
|---|---|---|
| 로딩 중… | ||
미리보기 — 정책 테스트
샘플 텍스트에 현재 정책을 적용해 결과를 확인합니다. 실제 분석/저장은 안 함.
원본
실행 후 표시
익명화 결과
실행 후 표시
Rule Mining — 갭에서 자동 룰 후보 제안
사용자가 자주 AI 와 다르게 등급을 매기는 패턴을 찾아 "이 entity 의 가중치를 ↑/↓ 하시겠습니까?" 식으로 룰 후보를 자동 제안합니다.
📖 초보 가이드 — Rule Mining 이 왜 필요한가요?
상황: AI 가 어떤 문서를 "S 민감" 등급이라 했지만, 사용자는 "C 위험" 으로 정정하는 일이 자주 발생. 왜? AI 의 룰이 그 패턴을 충분히 무겁게 안 봤기 때문.
해결: 결정 이력을 자동 분석해서:
- "
KR_RRN이 들어간 문서는 사용자가 항상 등급을 1단계 올림" → 이 entity 의 가중치를 ↑ 제안 - "
EMAIL_ADDRESS만 있는 문서는 사용자가 항상 등급을 내림" → 가중치 ↓ 제안 - "같은 파일명 패턴이 반복적으로 갭 발생" → 특별 룰 후보
학습 (train.py) 과의 차이: 학습은 가중치 자동 조정. Rule Mining 은 "이렇게 바꿔보세요" 제안만 — 사용자가 채택해야 적용. 더 안전 (자동화 X, 검토 후 적용).
SPEC 출처: §2.4 갭 활용 4가지 중 (3) Rule mining.
제안된 룰 후보
각 후보의 근거와 영향을 보고 "채택" 클릭 — 즉시 적용됩니다.
HE 학습 시연 — 평문 없이 gradient 합산
여러 사용자의 학습 결과(gradient)를 서버가 평문을 절대 안 보면서 합산할 수 있습니다. 이게 동형암호(HE) 의 핵심 가치입니다. 아래에서 직접 시연해보세요.
📖 초보 가이드 — 왜 HE 로 학습을 보호하는가?
일반 학습의 문제: 100명의 직원이 각자 회사 문서를 분류·학습하면, 각자의 gradient (가중치 변화량) 가 그 사람의 분류 패턴을 그대로 드러냅니다. "이 사람은 어떤 문서를 위험으로 봤나" → 사실상 직원 행동 추적 가능.
HE 의 해결:
- 클라이언트 (브라우저): 각자의 gradient 를 BFV 동형암호로 암호화 → 평문 사라짐
- 서버: 암호문들을 받아 그대로 덧셈 (HE 의 동형성 — 평문 없이도 덧셈 가능). 서버는 누가 뭘 학습했는지 모름.
- 관리자 (또는 일정 인원 합의): 합산 암호문을 복호화 → 전체 평균 gradient 만 노출. 개별 사용자 정보 X.
- 모델은 이 평균 gradient 로 갱신.
왜 가능한가? BFV 같은 HE 스킴은 Enc(a) + Enc(b) = Enc(a+b) 가 수학적으로 성립. 서버는 두 암호문을 곱(덧셈)만 하면 됨. 평문 a, b 는 절대 보지 않음.
본 시연: 4개 entity 의 gradient (예: [KR_RRN: +0.3, EMAIL: -0.1, PHONE: +0.05, NAME: 0.0]) 를 두 클라이언트가 각각 암호화 → 서버가 합산 → 복호화. 시각적으로 평문이 어디서 사라지고 어디서 나타나는지 보여줍니다.
SPEC 출처: §2.6 동형암호와의 연결.
클라이언트 A (사용자 1)
| Entity | Δw |
|---|---|
| KR_RRN | |
| EMAIL_ADDRESS | |
| KR_PHONE | |
| PERSON |
클라이언트 B (사용자 2)
| Entity | Δw |
|---|---|
| KR_RRN | |
| EMAIL_ADDRESS | |
| KR_PHONE | |
| PERSON |
STEP 1 클라이언트에서 BFV 컨텍스트 초기화
대기 중...
STEP 2 클라이언트 A·B 가 각자 gradient 를 BFV 로 암호화
대기 중...
STEP 3 서버: 평문 없이 두 암호문을 동형 덧셈 (Enc(A)+Enc(B))
대기 중...
STEP 4 클라이언트 (관리자): 합 암호문 복호화 → 평균 gradient
대기 중...
STEP 5 검증 — 평문 합산 결과와 일치하는가?
대기 중...
HE-FL 학습 (Phase 1) — 실제 결정 이력에서 모델까지
HE 학습 시연 탭이 가상 gradient 로 5단계 흐름만 시연했다면, 이 탭은 실제 결정 이력에서 도출한 gradient 로 1라운드 학습을 완전히 수행합니다. 모델이 진짜 갱신됩니다.
📖 초보 가이드 — 이 화면이 무엇을 보여주나요?
이 페이지의 목적: 사용자가 분류한 파일들의 정보가 어떤 경로로 모델 가중치 갱신까지 이어지는지, 그 과정에서 HE 가 어떻게 데이터를 보호하는지를 6단계로 가시화.
학습 대상 모델: classifier.ENTITY_WEIGHTS (rule-v1) — 약 20개 entity 별 가중치. 1-step linear regression SGD.
학습 데이터 정의:
- features = 결정의
findings_summary(entity → count, 예:{KR_RRN: 2, EMAIL: 1}) - target = 사용자 결정 등급 (O=0, S=1, C=2)
- pred = Σ weights[ent] × count[ent] (현재 모델 forward)
- grad[ent] = (pred − target) × count[ent] (∂MSE/∂w)
HE 의 역할: 각 클라이언트의 gradient 가 그 클라이언트의 분류 패턴을 그대로 노출 → BFV 동형암호로 암호화. 서버는 ciphertext 만 받아 합산 → 합산 결과를 복호화 → 평균. 평문 gradient 는 어느 한 머신에도 노출되지 않음 (관리자 복호화 시점에만 평균).
6단계 화면:
- STEP 1 — 결정 이력 로드 (파일별 AI/User 등급)
- STEP 2 — features + target 추출 (학습 데이터)
- STEP 3 — 클라이언트별 gradient 계산 (forward + backward)
- STEP 4 — BFV 암호화 → 서버 합산 → 복호화 (HE 학습 시연 탭의 흐름 자동 실행)
- STEP 5 — 평균 gradient → 모델 적용 (ENTITY_WEIGHTS 갱신 + 새 model_version 영속)
- STEP 6 — 학습 전후 비교 (Δw + 새 분류 결과)
SPEC 출처: §2.6 + docs/he_fl_plan.md Phase 1.
STEP 1 ⏳ 결정 이력 로드
사용자가 [C][S][O] 버튼으로 정정한 파일 분류 결과 — 학습 재료.
STEP 2 ⏳ features + target 추출
각 결정 → (entity 별 count 벡터, 등급 정수). 분류기 입력 형태.
STEP 3 ⏳ 클라이언트별 gradient 계산
각 클라이언트가 자기 데이터로 forward + backward → entity 별 Δw 벡터. 이때까지는 평문.
STEP 4 ⏳ HE 보호 — BFV 암호화 → 서버 합산 → 복호화
각 클라이언트가 gradient 를 BFV 로 암호화 → 서버는 evaluator.add() 로 합산 (평문 0 bit) → 관리자가 복호화 → /N 평균. 여기가 HE 의 핵심.
실행 후 표시
STEP 5 ⏳ 모델 적용 — ENTITY_WEIGHTS 갱신
평균 gradient × η 만큼 가중치 빼기 (gradient descent). 새 model_version 영속 + 활성화.
STEP 6 ⏳ 학습 전후 비교 + 검증
평문 합산 결과와 HE 복호화 결과 일치 확인 + 변경된 entity 별 Δw 시각화.
Phase 2 — N 라운드 자동 반복 (서버 시뮬)
Phase 1 의 1 라운드를 N 회 자동 반복합니다. 라운드별 정확도·MSE 변화를 시계열로 시각화하여 수렴 여부 확인. HE 보호는 Phase 1 가 BFV 동형성으로 검증; Phase 2 는 서버 측 평문 시뮬레이션으로 빠르게 N 라운드 돌림.
📖 초보 가이드 — Phase 2 가 Phase 1 과 다른 점
Phase 1 (위 6단계) — 실제 BFV 암호화·합산·복호화. 한 라운드 ~5초 (key gen 등 포함).
Phase 2 (이 섹션) — 같은 흐름의 평문 시뮬레이션. HE 의 효과는 Phase 1 이 보여줬으니, 이제 라운드 반복 수렴만 보는 단계. 한 라운드 ~10ms.
핵심 통찰: HE 의 동형성으로 평문 합산 결과 = HE 복호화 결과 (Phase 1 검증). 따라서 Phase 2 의 평문 시뮬도 production 의 HE 결과와 같음.
data 소스: reasons 기반 (train.py 와 동일). 결정 이력의 noise (NRP 등) 영향은 노이즈 fix commit 이후 가중치 0 으로 차단됨.
Platt Calibration — 신뢰도 숫자를 진짜 정답률에 맞추기
분류기가 "0.95 신뢰도" 라고 해도 실제 정답률은 0.7 일 수 있습니다. Platt scaling 은 결정 이력에서 학습한 작은 보정 함수로 화면에 표시되는 신뢰도가 진짜 의미 있게 만듭니다.
📖 초보 가이드 — Platt calibration 이론
문제: 분류기가 100건의 문서에 "C 등급일 확률 0.95" 라고 했는데, 실제로는 70건만 C 였다면 → 모델이 과신 (overconfident). 사용자가 "신뢰도 95%" 보고 자동 채택하면 30% 가 틀림 → 사고.
핵심 수식:
P(정답 | 점수 f) = σ(A · f + B) = 1 / (1 + exp(−(A·f + B)))
두 파라미터 A, B 의 역할:
A— 시그모이드의 가파름. 분류기 점수에 얼마나 민감한가.B— 시그모이드의 가로 이동. 어느 점수에서 0.5 가 되는가.
학습 데이터 정의:
score=ai_confidence(분류기 출력 신뢰도)label= 1 ifai_grade == user_gradeelse 0 (사용자가 동의했는지)
알고리즘: 위 두 파라미터를 결정 이력에서 logistic regression (gradient descent 800 iter) 으로 학습. sklearn 의존성 X — numpy 도 안 쓰고 순수 Python.
왜 PoC 에 적합한가? 파라미터 단 2개 → 적은 데이터 (~30개부터) 로도 의미 있게 학습. SPEC §2.4 (2) 가 명시적으로 권장.
HE-TEST 에서 효과:
- 학습 후 분류 결과 카드의 신뢰도가 실제 정답률에 맞춰 보정됨 (raw → calibrated 둘 다 표시).
- 갭이 큰 영역에서 신뢰도가 가장 부정확 → 보정 효과 큼.
- 외부 자동화 (예: 신뢰도 0.9+ 만 자동 처리) 의 안전성 ↑.
1. 학습 — 결정 이력에서 (A, B) 추출
현재 SQLite 의 decisions 테이블을 읽어 (score, label) 쌍을 만들고 logistic regression 학습. 5건 이상 필요.
2. 보정 곡선 — 원본 점수 vs 보정된 확률
학습된 σ(A·x + B) 함수의 모양. 직선(=identity, 보정 X) 과 곡선의 차이가 보정 강도.
3. 임의 점수 보정 테스트
슬라이더로 원본 점수 (raw) 입력 → 보정된 확률 (calibrated) 실시간 확인.
0.50
→
—
Drift Detection — 분류 패턴 변화 감지
시간이 지나면서 사용자가 AI 와 다르게 매기는 패턴이 변할 수 있습니다 (drift). 방치하면 분류기 정확도가 점점 떨어지지만 알아채기 어려움. Drift Detection 은 자동으로 변화를 감지·알림합니다.
📖 초보 가이드 — Drift 가 뭔가요?
상황: 처음 1개월 — AI 가 "이메일 = S 민감" 으로 분류, 사용자도 동의 (정확도 90%). 그런데 3개월 후 — 회사 정책이 변해서 "이메일 = O 일반" 으로 정정해야 함. 사용자는 매번 정정. AI 는 모름. 학습이 자동 적용되기 전까지 정확도가 계속 떨어짐.
Drift 의 정의 (ML 용어):
- Concept drift — "정답의 의미가 변함" (위 시나리오)
- Data drift — "입력 데이터 분포가 변함" (새 문서 유형 등장)
- User drift — "사용자 판단 기준이 변함" (위 두 가지의 결합)
본 모듈이 보는 3 지표:
- 정확도 drift — AI=User 비율의 변화 (최근 N건 vs 이전 N건)
- 평균 갭 drift — |AI−User| 평균 변화 (커지면 분류기가 더 자주 어긋남)
- Entity 분포 drift — 어떤 PII 가 자주 나오는지 비율 변화 (PSI 비슷한 점수)
알고리즘: 결정 이력을 시간순 정렬 → 최근 N건 (window A) vs 이전 N건 (window B) 통계 비교 → 임계값 초과 시 알림.
임계값 (기본): 정확도 −15%p 이상 하락 → alert, 평균 갭 +0.3 이상 증가 → warn, entity 분포 변화 PSI ≥ 0.1 → info
SPEC 출처: §2.4 갭 활용 4가지 중 (4) User profile drift detection — "특정 사용자의 갭이 커지면 → 정책 변경/조직 변경 신호로 알림".
런타임 설정
변경 시 즉시 적용 + settings.json 영속. 프로세스 재시작 후에도 유지.
🇰🇷 KoELECTRA-NER 모델
spaCy 한국어 NER 의 오탐을 대체하는 fine-tuned 모델. 학습/이력 탭의 신경망 로드와 별개로 단독 로드 가능.
설정 파일 위치
settings.json — 본 페이지에서 편집extra_grade_keywords.json — 룰 페이지에서 추가 키워드custom_patterns.yaml — 룰 페이지에서 정규식/Deny-listneural_head.json — 학습/이력 탭에서 신경망 head 학습 시 자동 갱신decisions.db — 사용자 결정 + 학습 이력 + 모델 버전 (SQLite)logs/app.log — rotating 로그 (1MB × 3 backup)