119 데이터에는 신고자·환자·구조 대상자(요구조자) 정보가 섞여 있습니다. 이 안내서는 데이터를 내보내기 전에 내 PC 안에서 개인정보가 섞였는지 1차로 점검하는 방법을 다룹니다. 외부 AI에 넣어도 되는지는 자료 종류와 넣을 곳에 따라 생성형 AI 입력 확인에서 근거 문서를 보고 판단합니다.
- 직접 식별자와 문맥상 식별 위험을 구분할 수 있습니다.
- AI에게 점검 코드를 맡기고, 실제 자료는 기관 PC에서만 점검할 수 있습니다.
- block과 warn 결과에 맞춰 중단·확인 행동을 선택할 수 있습니다.
- 자동 점검이 놓치는 이름·주소·사건 서사를 사람 검토로 식별할 수 있습니다.
AI에게 맡기는 프롬프트
점검할 파일을 외부 AI에 올려 "개인정보가 있는지 봐 달라"고 하면 점검하는 일이 곧 외부 전송이 됩니다. 그래서 AI에게는 점검 규칙과 합성 시험 문자열만 주고 점검 코드를 받습니다. 받은 코드는 기관 PC에서 실제 파일에 실행하고, AI에게 다시 보여 줄 것은 건수처럼 값이 없는 결과뿐입니다. 코드를 실행할 수 있는 AI(파일 분석 기능이나 코딩 에이전트)에게, 실제 자료가 없는 빈 작업 폴더에서 맡깁니다.
[목적] 텍스트·CSV 파일에 개인정보 패턴이 섞였는지 점검하는 Python 스크립트가 필요합니다. 실제 파일은 드리지 않고, 만든 스크립트는 제가 기관 PC에서 실행합니다. [자료] 점검 규칙은 https://119-ai-studio.kr/pii-guard.html 안내서의 block·warn 표와 예시 패턴을 씁니다. 개인정보·비식별 기준의 맥락은 https://119-ai-studio.kr/kg/topic-privacy-deid.txt 에서 먼저 파악하고, 근거는 원문 주소와 함께 정리해 주세요. [완성 기준] - Python 표준 라이브러리만 쓰고 줄 단위로 점검합니다. 번호 앞뒤에 한글이 붙어도 찾도록 숫자 경계를 씁니다. - 찾은 값은 앞 3자만 남기고 가려 파일 이름·줄 번호와 함께 출력합니다. - 종료 코드는 block 있음 1, 파일 없음·읽기 실패·사용법 오류 2, 그 밖 0입니다. - 안내서 '점검으로 잡히는 것과 놓치는 것' 표의 문자열로 합성 시험 파일을 만들어 실행하고, 줄마다 기대 결과와 실제 결과를 표로 보여 주세요. [하지 말 것] 실제 자료를 요청하지 마세요. 인터넷 연결·외부 전송·파일 삭제 코드를 넣지 말고, 찾은 값을 그대로 출력하거나 로그로 남기지 마세요. 읽지 못한 파일이나 줄을 건너뛰고 0을 돌려주지 마세요. 외부 AI에 넣어도 되는지는 판단하지 말고 확인할 원문과 담당을 적어 주세요. 확인 기준은 https://119-ai-studio.kr/pii-guard.html 안내서를 따릅니다. 작업 전에 빠진 정보가 있으면 먼저 질문해 주세요.
결과를 받은 뒤 확인할 것은 다음과 같습니다.
- 같은 합성 시험 파일로 한 번 직접 실행해, AI가 보여 준 결과표와 종료 코드가 같은지 봅니다.
- 코드에 인터넷 연결·전송·삭제 부분이 없는지, 출력에 원래 값이 그대로 찍히지 않는지 봅니다.
- 실제 파일을 점검한 뒤 AI에게 보여 줄 것은 "block 0건, warn 3건" 같은 건수뿐입니다. 가린 값과 줄 내용은 붙이지 않습니다.
배경지식
개인정보는 주민번호처럼 한 값만으로 사람을 가리키는 직접 식별자만 뜻하지 않습니다. 날짜·장소·드문 직책처럼 각각은 평범해도 함께 놓이면 특정 사람이나 사건을 떠올릴 수 있는 정보가 있습니다. 개인정보보호위원회의 생성형 AI 이용자 가이드도 여러 단서가 결합되면 개인이 드러날 수 있고, 여러 번 나눠 입력한 내용이 결합돼 식별될 수 있다고 설명합니다.
그래서 첫 원칙은 데이터 최소화입니다. 개인정보 보호법 제3조도 목적에 필요한 범위에서 최소한으로 처리하는 것을 보호 원칙으로 둡니다. 업무에 꼭 필요한 항목만 남긴 뒤 점검합니다. 삭제는 값을 없애는 일이고, 마스킹은 일부를 가려 원래 값을 바로 읽지 못하게 하는 일입니다. 삭제나 마스킹을 했다고 외부로 보내도 되는지가 정해지지는 않습니다.
정규식은 전화번호처럼 모양이 일정한 문자열을 찾고, 이름·상세주소처럼 모양이 없는 정보는 놓칩니다. 그래서 자동 탐지 뒤에 문맥 점검과 사람 확인이 이어집니다.
내보내기 전에 거르는 이유
공개 저장소에 올라간 파일은 나중에 지워도 이미 누군가 내려받았거나 사본이 남았을 수 있고, 외부 AI에 보낸 문장도 되돌릴 수 없습니다. 요즘은 붙여 넣기 말고도 자료가 나가는 경로가 늘었습니다.
- 파일 첨부: 대화창에 올린 파일은 내용 전체가 서비스로 전송됩니다.
- 에이전트: 코딩·업무 에이전트가 폴더나 메일을 직접 읽으면 연 파일과 메일이 모델이 보는 맥락에 들어가 서비스로 전송됩니다. AI 에이전트 허브도 119 신고 내용·환자 정보·개인정보를 에이전트에 넣지 않도록 적습니다.
- 점검 의뢰: "이 파일에 개인정보 있는지 찾아 줘"라며 외부 AI나 외부 검사 서비스에 원본을 올리면 점검 자체가 외부 전송입니다.
그래서 점검은 내보내기 직전에 내 컴퓨터 안에서 합니다.
점검은 3단입니다
개인정보를 한 번의 점검으로 모두 찾는 도구는 없습니다. 그래서 성격이 다른 세 단계를 차례로 거칩니다.
- 정규식 점검: 주민번호·전화번호 같은 패턴을 내 PC에서 기계가 1차로 찾습니다 (아래 점검 스크립트)
- 문맥 점검: 패턴은 없지만 "날짜+장소+사건유형" 조합처럼 맥락으로 식별되는 위험을 점검합니다
- 사람 최종 확인: 이름·상세주소·사건 서사처럼 기계가 못 잡는 것을 사람이 봅니다
기계가 잘 찾는 것을 먼저 거르면 사람은 기계가 못 찾는 이름·주소·사건 서사에 시간을 쓸 수 있습니다.
무엇을 잡는가: block과 warn
점검 스크립트는 찾은 값을 다시 출력하지 않고 가립니다(마스킹).
| 등급 | 잡는 패턴 | 의미 |
|---|---|---|
| block | 주민·외국인등록번호, 여권번호(옛 형식) | 실행 중단 |
| warn | 휴대전화, 이메일, 차량번호, 카드번호 추정 | 사람이 확인 후 진행 |
두 등급을 가르는 기준은 공개될 이유가 있는가입니다. 주민등록번호나 여권번호는 공개 문서에 실릴 이유가 없으므로 발견되면 block으로 실행을 멈춥니다. 전화번호·이메일은 부서 대표번호나 공개된 민원 창구처럼 공개되는 경우도 있어서 warn으로 표시하고 사람이 성격을 확인하게 합니다. 모든 것을 block으로 막으면 경고가 잦아 무뎌지고, 모든 것을 warn으로 두면 막아야 할 것이 지나갑니다.
소방청 개인정보 보호규정은 고유식별정보를 주민등록번호, 여권번호, 운전면허의 면허번호, 외국인등록번호로 정합니다. 아래 예시 패턴은 운전면허번호를 찾지 않고, 2021년 12월부터 발급된 차세대 전자여권 번호는 체계가 바뀌어 놓칠 수 있습니다. 개인정보위 가이드는 주민등록번호·여권번호·계좌번호·비밀번호·인증코드를 생성형 AI에 아예 입력하지 않도록 권합니다. 특정 개인의 위치를 알 수 있는 정보는 개인위치정보로 따로 정의돼 있습니다.
아래는 프롬프트로 만든 코드가 따라야 할 확인 기준을 보여 주는 예시 패턴입니다. Python의 \b는 한글도 글자로 보기 때문에 "주민번호는 901010-…이고"처럼 한글이 바로 붙은 번호를 놓칩니다. 그래서 \b 대신 앞뒤에 숫자가 없는지를 보는 숫자 경계를 씁니다.
BLOCK_PATTERNS = {
"주민/외국인등록번호": re.compile(r"(?<!\d)\d{6}[-\s]?[1-8]\d{6}(?!\d)"),
"여권번호(옛 형식)": re.compile(r"(?<!\d|[A-Za-z])[MSRODG]\d{8}(?!\d)"),
}
WARN_PATTERNS = {
"휴대전화": re.compile(r"(?<!\d)01[016789][-.\s]?\d{3,4}[-.\s]?\d{4}(?!\d)"),
"이메일": re.compile(r"[\w.+-]+@[\w-]+\.[\w.-]+"),
"차량번호": re.compile(r"(?<!\d)\d{2,3}\s?[가-힣]\s?\d{4}(?!\d)"),
"카드번호추정": re.compile(r"(?<!\d)(?:\d[ -]?){15,16}(?!\d)"),
}
종료 코드가 곧 판정입니다
점검 스크립트는 종료 코드로 결과를 알려 줍니다.
| 종료 코드 | 의미 | 다음 행동 |
|---|---|---|
| 0 (표시 없음) | 알려진 패턴 없음 | 그래도 이름·상세주소·사건 서사는 사람이 본다 |
| 0 + warn | 전화·이메일 등 확인 필요 | 공개 필요성·마스킹 수준을 기록 |
| 1 (block) | 차단 패턴 발견 | 공개·업로드·AI 입력 중단 |
| 2 | 파일 없음·읽기 실패·사용법 오류 | 파일 이름과 인코딩 확인 |
종료 코드를 쓰면 공개·업로드 단계 앞에 점검을 두고, 1이 나오면 다음 단계를 멈추게 할 수 있습니다.
가상 상황: 업로드 직전
가상의 상황을 하나 들어 보겠습니다. 한 담당자가 교육 자료로 쓸 출동 사례 CSV를 정리해 공개 깃 저장소에 올리려 합니다. 개인정보는 다 지웠다고 생각했습니다. 그런데 파일 300줄 가운데 한 줄의 비고란에는 "연락처는 010-…입니다"처럼 민원인 연락처가, 다른 한 줄에는 신고자 주민등록번호가 남아 있습니다. 300줄을 다시 읽을 시간은 없습니다.
올리기 직전 기관 PC에서 점검 스크립트를 실행하면 문장 안에 붙은 번호까지 그 두 줄이 표시됩니다. 주민등록번호가 block으로 잡혀 종료 코드 1이 나오므로 담당자는 올리지 않고 그 줄부터 고칩니다.
가상 사례: 교육 설문 요약 전 입력 줄이기
다음은 실제 교육생이나 설문과 무관한 가상 사례입니다. 교육 담당자는 합성 설문 메모를 외부 AI로 주제별 요약하려 합니다. 메모 본문에는 교육 의견뿐 아니라 이름을 떠올리게 하는 직책, 회신용 주소, 소속을 함께 적은 행이 섞여 있습니다.
담당자는 원문 전체를 곧바로 넣지 않습니다. 내 PC에서 정해진 패턴을 점검하고, 요약에 필요 없는 회신 정보와 소속 열을 지웁니다. warn이 나온 행은 공개 연락 창구인지 개인 정보인지 확인하고, 이름처럼 패턴이 없는 표현은 문맥을 읽어 일반 표현으로 바꿉니다.
종료 코드가 0이어도 그대로 전송하면 실패합니다. 패턴 점검은 직책과 상황의 조합까지 보지 않으므로, 담당자는 줄인 요약문만 입력하고 결과에 식별 단서가 되살아나지 않았는지 다시 확인합니다.
직접 해보기: 받은 코드 시험하기
프롬프트로 받은 코드는 실제 파일에 쓰기 전에 합성 문자열로 먼저 시험합니다. 차단 패턴이 있으면 값을 가린 채 이렇게 알려 주면 됩니다.
⛔ 차단 1건: 제거 전에는 진행하지 않습니다. - [주민/외국인등록번호] sample_block.txt 1행: 000███████████ ℹ️ 이름·주소는 패턴으로 찾지 못합니다. 최종 확인은 사람이 합니다.
점검 결과 화면과 로그가 또 하나의 유출 경로가 되지 않도록, 찾은 값은 앞 세 자리만 남기고 가립니다.
점검으로 잡히는 것과 놓치는 것
아래는 전부 가상의 문자열이며, 위 예시 패턴으로 점검했을 때의 결과입니다. 프롬프트의 시험 문자열로 그대로 씁니다.
| 예시(전부 가상) | 판정 | 왜 그런가 |
|---|---|---|
주민번호는 901010-1000000이고 | block | 숫자 경계로 찾으므로 한글이 붙어도 잡힘. \b 패턴은 놓침 |
010-0000-0000 | warn | 휴대전화 꼴. 대표번호일 수도 있어 사람이 확인 |
2026012300001234 | warn | 16자리라 카드번호 추정으로 잡힘. 출동번호 같은 업무 번호도 걸리므로 사람이 성격 확인 |
공일공-0000-0000 | 못 잡음 | 숫자를 한글로 적으면 모양이 달라짐 |
홍길동 소방관 | 못 잡음 | 이름은 정해진 모양이 없음 |
○○구 ○○동 12-3 | 못 잡음 | 상세주소는 문맥으로만 사람과 이어짐 |
정규식은 미리 정해 둔 모양만 찾고, 16자리 업무 번호처럼 개인정보가 아닌 값이 걸리기도 합니다. 종료 코드 0은 알려진 패턴이 걸리지 않았다는 뜻일 뿐, 개인정보가 없다는 뜻은 아닙니다.
사람이 끝까지 봐야 하는 것
자동 점검을 통과해도 다음은 사람이 직접 확인합니다.
- [ ] 신고자명, 환자명, 요구조자명, 연락처, 상세주소를 제거했습니다. - [ ] 운전면허번호, 계좌번호, 비밀번호, 인증코드, API 키를 제거했습니다. - [ ] 사건번호, 출동번호, 내부 보고번호가 실제 건을 특정하지 않는지 확인했습니다. - [ ] 공개용 예제 데이터는 합성 데이터 또는 공개 가능한 데이터만 사용했습니다. - [ ] AI 도구에 넣을 텍스트는 필요한 최소 정보만 남겼습니다.
정규식이 못 잡는 것
점검 스크립트는 알려진 패턴만 찾습니다. 다음은 자동 탐지가 실패할 수 있어 사람의 판단이 필요합니다.
- 이름·상세주소·드문 직책과 상황의 조합
- 실제 신고 내용·현장 사진 설명·사진 속 글자
- 의료정보·수사정보·내부 작전정보 (패턴이 없어도 공개 대상이 아닐 수 있음)
이름·주소 후보를 자동으로 표시하려면 텍스트 속 개인정보를 탐지하고 가리는 오픈 소스 Presidio나, 인터넷 연결 없이 PC 안에서 돌리는 로컬 AI를 씁니다. 로컬 실행에서 확인할 조건은 생성형 AI 입력 확인의 '내 PC 로컬 AI' 항목에 있고, 건수가 많으면 개인정보 비식별 파이프라인으로 이어집니다.
용어 한 줄 사전
| 용어 | 한 줄 설명 |
|---|---|
| 개인정보 | 한 사람을 직접 또는 다른 정보와 결합해 알아볼 수 있게 하는 정보입니다. |
| 직접 식별자 | 값 하나만으로 개인을 가리킬 수 있는 번호·연락처 같은 정보입니다. |
| 데이터 최소화 | 업무 목적에 꼭 필요한 정보만 남기는 원칙입니다. |
| 정규식 | 일정한 글자 모양을 규칙으로 표현해 문자열을 찾는 방법입니다. |
| 마스킹 | 원래 값을 바로 읽지 못하도록 일부 또는 전부를 가리는 처리입니다. |
| 문맥 점검 | 여러 단서의 조합이 사람·사건을 드러내는지 살피는 검토입니다. |
자주 묻는 질문
Q. 종료 코드가 0이면 외부 AI에 넣어도 되나요?
종료 코드 0은 알려진 패턴이 발견되지 않았다는 뜻일 뿐입니다. 이름·상세주소·드문 상황 조합을 사람이 확인하고, 넣어도 되는지는 생성형 AI 입력 확인에서 자료 종류와 넣을 곳을 골라 근거 문서와 먼저 할 일을 확인합니다.
Q. warn은 무조건 삭제하라는 뜻인가요?
공개 대표번호처럼 업무상 공개된 값일 수도 있으므로 사람이 성격을 확인하라는 신호입니다. 확인 근거가 없거나 목적에 필요하지 않으면 지웁니다.
Q. 값을 일부 가리면 안전한가요?
다른 열과 결합해 사람을 알아볼 수 있거나, 가린 부분을 쉽게 추정할 수 있으면 충분하지 않습니다. 목적에 필요 없는 열은 삭제하고 남은 문맥까지 봅니다.
Q. 점검 결과 로그를 보관해도 되나요?
로그 자체에 원래 값이 다시 나타나지 않게 해야 합니다. 로그에는 검토 대상·판정·조치만 기록하고, 발견한 개인정보 원문은 복사해 남기지 않습니다.
핵심 정리
- 필요한 정보만 남기는 최소화가 자동 탐지보다 먼저입니다.
- 점검할 파일은 외부 AI에 올리지 않고, AI에게는 코드만 받아 기관 PC에서 실행합니다.
- 정규식은 모양 있는 값만 찾으므로 종료 코드 0은 안전 보증이 아닙니다.
- block은 즉시 중단하고 warn은 공개 필요성과 마스킹 수준을 확인합니다.
- 문맥상 식별 위험과 외부 전송 여부는 사람이 근거 문서를 보고 판단합니다.
다음 단계
- 개인정보 비식별 파이프라인 — 이름·지명처럼 패턴 없는 개체를 대량으로 다루는 심화 방법으로 이어집니다.
- 119 합성 데이터로 안전하게 연습하기 — 실제 신고·환자 자료 없이 점검과 분석 흐름을 연습합니다.
- AI 결과, 제출 전 확인 사항 — 입력을 줄인 뒤 출력에 민감정보가 다시 나타나지 않았는지 최종 확인합니다.