보험 도메인 심화 · 누구인지 모르게 내보내기 · 이론
이름을 지웠는데 그 사람이 누구인지 알 수 있었다
한 줄 요약
비식별은 이름을 지우는 일이 아니라 남은 값들의 조합으로도 한 사람이 지목되지 않게 만드는 일이고, 그것이 됐는지는 기분이 아니라 k를 세어 확인한다.
왜 이게 필요했나
청구 지급이 왜 늦어지는지 분석하겠다며 자료를 달라는 요청이 들어온다. 요청하는 쪽은 사내 분석팀일 수도, 외부 컨설팅일 수도 있다. 이름과 회원번호를 지우고 넘기면 될 것 같지만, 남은 것만으로도 사람이 드러나는 경우가 많다. 생년월일과 성별과 사는 곳 우편번호, 이 세 가지가 붙어 있으면 대부분의 사람은 자기 자료를 알아볼 수 있고, 동창회 명부나 사내 주소록을 가진 사람은 남의 자료도 알아본다. 이것이 준식별자(quasi-identifier) 문제다. 직접 식별자는 혼자서 사람을 가리키고, 준식별자는 여럿이 모여 사람을 가린다.
건강 정보는 여기에 한 겹이 더 있다. 진단코드는 분석에 꼭 필요한 값인데 동시에 가장 민감한 값이다. 국내에서는 [개인정보 보호법](https://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4%20%EB%B3%B4%ED%98%B8%EB%B2%95)이 건강에 관한 정보를 민감정보로 따로 규정해 더 엄하게 다루도록 하고([제23조](https://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4%20%EB%B3%B4%ED%98%B8%EB%B2%95/%EC%A0%9C23%EC%A1%B0)), 그래서 "이름만 지웠다" 는 설명으로는 반출 승인을 받기 어렵다.
어떻게 동작하나
점검 항목의 본보기로 자주 인용되는 것이 미국 HIPAA 의 비식별 기준이다. [45 CFR 164.514](https://www.ecfr.gov/current/title-45/part-164/section-164.514)는 두 가지 길을 준다. 하나는 전문가 판단(expert determination)이고, 다른 하나는 Safe Harbor 다. Safe Harbor 는 식별자 18가지를 없애라고 열거하는데, 그 안에 눈여겨볼 규칙이 셋 있다.
- 주보다 작은 지역 단위는 뺀다. 예외는 우편번호 앞 세 자리인데, 그 앞자리를 공유하는 지역의 인구가 20,000명을 넘을 때만이다. 20,000명 이하면 앞 세 자리도
000으로 바꾸라고 적는다. - 연도를 뺀 모든 날짜 요소를 없앤다. 생년월일, 입원일, 퇴원일, 사망일이 모두 여기 해당한다.
- 89세를 넘는 나이는 전부 한 칸으로 묶는다. 아주 많은 나이는 그 자체로 드물어서, 연도 하나만으로도 사람이 좁혀지기 때문이다.
- 마지막 18번째 항목은 "그 밖의 고유한 번호·특성·코드" 다. 목록을 다 지켜도 남는 구멍을 인정하는 조항이고, 같은 조문은 "다른 정보와 합치면 개인을 알아볼 수 있다는 것을 알면서" 내보내면 안 된다는 조건을 함께 건다.
이 규정은 미국 의료기관과 그 협력사에 적용되는 것이고, 한국 보험사에 그대로 적용되지 않는다. 하지만 "무엇을 빠뜨렸는가" 를 확인하는 목록으로는 여전히 쓸모가 있다.
목록을 다 지켜도 남는 위험을 재는 자가 k-익명성 이다. 준식별자 조합이 같은 줄이 몇 개나 있는지 세어, 그 최솟값을 k라고 부른다. k가 1이면 그 조합을 아는 사람은 한 줄을 정확히 집어낼 수 있다. k를 올리는 방법은 두 가지뿐이다. 값을 뭉개거나(일반화) 줄을 빼거나(억제). 일반화는 정보를 덜 잃고, 억제는 확실하지만 분석에 쓸 자료가 줄어든다. 그래서 순서가 중요하다. 먼저 일반화하고, 그래도 남는 작은 조합만 억제한다. 반대로 하면 버리는 줄이 눈덩이처럼 늘어난다.
원본: 1971-04-02 · F · 80712 → 이 조합을 가진 줄이 1개 (k=1)일반화: 1971 · F · 807 → 이 조합을 가진 줄이 9개 (k=9)작은 지역: 1943 · M · 000 → 인구가 적어 앞자리까지 지움억제: 조합이 5개 미만인 줄은 반출하지 않음현장에서 만나는 모습
가장 흔한 사고는 한 파일만 보고 안전하다고 판단하는 것 이다. 지난달 보낸 추출본과 이번 추출본을 나란히 놓으면, 두 번 모두 나온 사람의 조합이 줄어들어 서로를 좁혀 준다. 그래서 반출 기록에 무엇을 언제 누구에게 어떤 규칙으로 내보냈는지를 남긴다. 기록이 없으면 다음 요청이 왔을 때 위험을 다시 계산할 수도 없다.
두 번째는 k만 보고 안심하는 것 이다. k가 5여도 그 다섯 줄의 진단코드가 전부 같으면, 누구인지는 몰라도 그 사람이 어떤 병으로 청구했는지는 드러난다. 값 자체가 새는 이 문제는 k로 막히지 않는다. 민감한 열은 조합 안에서 값이 몇 종류인지를 따로 보는 편이 좋다.
세 번째는 되돌리기 위한 열쇠를 함께 보내는 것 이다. 같은 조문의 재식별 조항은, 되돌릴 수 있는 코드를 붙이더라도 그 코드가 원래 값에서 유도되지 않아야 하고 그 방법을 공개하지 말아야 한다고 적는다. 회원번호를 그대로 쓰거나 회원번호를 해시해 붙이면 이 조건을 어긴다.
실무에서 진짜 중요한 것
- 직접 식별자 제거는 시작일 뿐이다. 남은 조합으로 k를 세기 전에는 아무것도 증명되지 않았다.
- 일반화가 먼저, 억제는 나중. 버린 줄의 비율을 함께 보고해야 "얼마나 잃었는가" 를 말할 수 있다.
- 재식별을 직접 시도해 본다. 자기 데이터로 공격해 보지 않은 비식별은 검증되지 않은 것이다.
- 반출 기록을 남긴다. 원본과 반출본의 해시, 적용한 규칙, 목적, 보관 기간까지.
- 기준을 인용할 때는 적용 범위도 함께 적는다. 남의 나라 규정을 우리 규정인 것처럼 쓰면 감사에서 먼저 걸린다.
다음 실습에서 할 것
합성 청구 자료 800건을 만들어, 직접 식별자를 걷어 내고 k를 세어 본 뒤, 날짜 일반화와 고령 묶기, 작은 지역과 드문 진단코드 처리를 차례로 적용한다. 그러고 나서 k가 5 미만인 조합을 억제해 반출본을 만들고, 재식별을 직접 시도해 그 사람이 몇 명 속에 숨었는지 재고, 반출 기록과 점검 목록을 남긴다. 채점기는 단계마다 앞 단계 파일에서 결과를 다시 계산해 한 줄씩 대조한다.