본문 바로가기
/ 학습 / 안내서 / 보안·윤리
L1 입문 · 11분 읽기

개인정보, AI에 넣기 전에 점검하기

2026.07.12 갱신 데이터를 공개·업로드·AI 입력 전에 다루는 실무자
#개인정보#PII#마스킹#공개점검
검토 상태: 전문 검토 전 위험도 미분류

이 안내서는 공식 절차·법령·현장 판단을 대체하지 않으며, 적용 전 소속 기관 기준과 담당자 검토를 확인하세요.

119 데이터에는 신고자·환자·요구조자 정보가 섞여 있습니다. 이런 데이터를 외부 AI 도구에 붙여넣거나 공개 저장소에 올리면, 한 번의 실수로 개인정보가 영구히 노출됩니다. 이 안내서는 데이터를 내보내기 전에 로컬에서 1차 점검하는 방법입니다.

🎯 이 장의 목표
  • 직접 식별자와 문맥상 식별 위험을 구분할 수 있습니다.
  • 외부 전송 전에 로컬 개인정보 점검을 실행할 수 있습니다.
  • block과 warn 결과에 맞춰 중단·확인 행동을 선택할 수 있습니다.
  • 자동 점검이 놓치는 이름·주소·사건 서사를 사람 검토로 식별할 수 있습니다.

배경지식

개인정보는 주민번호처럼 한 값만으로 사람을 가리키는 직접 식별자만 뜻하지 않습니다. 날짜·장소·드문 직책처럼 각각은 평범해도 함께 놓이면 특정 사람이나 사건을 떠올릴 수 있는 정보가 있습니다. 퍼즐 한 조각은 모호하지만 여러 조각을 맞추면 그림이 드러나는 것과 같습니다.

그래서 첫 원칙은 데이터 최소화입니다. 점검 도구로 잘 가릴 자신이 있어서 많이 가져오는 것이 아니라, 업무에 꼭 필요한 항목만 남긴 뒤 점검합니다. 삭제는 값을 없애는 일이고, 마스킹은 일부를 가려 원래 값을 바로 읽지 못하게 하는 일입니다. 둘 다 원본을 외부로 보내도 된다는 자동 허가는 아닙니다.

정규식은 전화번호처럼 모양이 일정한 문자열을 찾습니다. 빠르고 재현 가능하지만 이름·상세주소처럼 모양이 없는 정보는 놓칩니다. 따라서 로컬 자동 탐지는 첫 번째 그물이고, 문맥 점검과 사람 확인이 뒤를 이어야 합니다.

왜 내보내기 전에 거르는가

이메일은 부치기 전에는 몇 번이고 고쳐 쓸 수 있지만, 보내기를 누르는 순간 상대의 받은편지함에 박혀 되돌릴 수 없습니다. 개인정보 공개도 똑같습니다. 공개 저장소에 한 번 올라간 파일은 나중에 지워도 누군가 이미 내려받았거나, 검색엔진·중계 서비스가 사본을 떠 갔을 수 있습니다. 외부 AI에 붙여넣은 문장도 전송을 누른 순간 우리 손을 떠납니다.

그래서 점검의 자리는 내보내기 직전, 그리고 내 컴퓨터 안입니다. 점검하겠다고 데이터를 외부 검사 서비스에 올리면, 점검 행위 자체가 유출입니다. 이 안내서의 도구가 표준 라이브러리만 쓰는 로컬 스크립트인 것은 그 때문입니다 — 점검하는 동안 데이터가 기기 밖으로 한 발짝도 나가지 않습니다.

점검은 3단입니다

개인정보를 한 겹으로 막는 도구는 없습니다. 공항 보안검색이 문틀 탐지기 하나로 끝나지 않는 것과 같습니다. 문틀 탐지기가 큰 금속을, 손 검색이 탐지기가 놓친 것을, 엑스레이가 가방 속을 봅니다. 겹치는 그물이라 앞이 놓쳐도 뒤가 받습니다. 개인정보 점검도 성격이 다른 세 그물을 겹칩니다.

  1. 정규식 점검 — 주민번호·전화번호 같은 패턴을 로컬에서 기계가 1차로 찾습니다 (아래 PII 가드)
  2. 문맥 점검 — 패턴은 없지만 "날짜+장소+사건유형" 조합처럼 맥락으로 식별되는 위험을 점검합니다
  3. 사람 최종 확인 — 이름·상세주소·사건 서사처럼 기계가 못 잡는 것을 사람이 봅니다

앞의 두 단계는 기계가 빠르게 훑어 '분명한 것'과 '의심스러운 것'을 걸러 주고, 마지막 판단은 사람이 합니다. 뒤로 갈수록 기계가 약하고 사람이 강한 영역이라, 순서를 바꾸면 사람이 기계도 잡을 것을 손으로 뒤지느라 지칩니다.

무엇을 잡는가 — block과 warn

PII 가드는 표준 라이브러리만 쓰는 로컬 스크립트입니다. 발견한 값은 절대 다시 출력하지 않고 가립니다(마스킹).

등급잡는 패턴의미
block주민·외국인등록번호, 여권번호실행 중단 대상
warn휴대전화, 이메일, 차량번호, 카드번호 추정사람이 확인 후 진행

두 등급을 가르는 기준은 "공개될 이유가 있는가"입니다. 주민등록번호나 여권번호는 어떤 경우에도 공개 문서에 실릴 이유가 없습니다 — 발견되면 곧 사고이므로 실행을 멈춥니다(block, 빨간불). 반면 전화번호·이메일은 부서 대표번호나 공개된 민원 창구처럼 정당하게 공개되는 경우도 있습니다 — 그래서 무조건 막지 않고 사람이 성격을 확인하게 합니다(warn, 노란불). 등급을 나누는 이유는, 모든 것을 block으로 막으면 경고가 잦아 무뎌지고, 모든 것을 warn으로 흘리면 정작 막아야 할 것이 지나가기 때문입니다.

실제 패턴은 이렇게 정의돼 있습니다(필요할 때 참고).

PYTHON
BLOCK_PATTERNS = {
    "주민/외국인등록번호": re.compile(r"\b\d{6}[-\s]?[1-8]\d{6}\b"),
    "여권번호": re.compile(r"\b[MSRODG]\d{8}\b"),
}
WARN_PATTERNS = {
    "휴대전화": re.compile(r"\b01[016789][-\s]?\d{3,4}[-\s]?\d{4}\b"),
    "이메일": re.compile(r"[\w.+-]+@[\w-]+\.[\w.-]+"),
    "차량번호": re.compile(r"\b\d{2,3}[가-힣]\d{4}\b"),
    "카드번호추정": re.compile(r"\b(?:\d[ -]?){15,16}\b"),
}

종료 코드가 곧 판정입니다

스크립트를 실행하면 종료 코드로 결과를 알려줍니다.

BASH
python pii_guard.py sample.csv memo.txt
종료 코드의미다음 행동
0 (표시 없음)알려진 패턴 없음그래도 이름·상세주소·사건 서사는 사람이 본다
0 + warn전화·이메일 등 확인 필요공개 필요성·마스킹 수준을 기록
1 (block)차단 패턴 발견공개·업로드·AI 입력 중단
2파일 없음·사용법 오류현재 위치와 파일명 확인

종료 코드로 판정을 돌려주는 이유는 사람의 기억에 의존하지 않기 위해서입니다. 눈으로 훑어 "괜찮아 보인다"는 판단은 바쁠수록 흔들리지만, 종료 코드가 1이면 뒤에 이어지는 공개·업로드 단계를 아예 진행되지 않게 묶어 둘 수 있습니다. 사람이 "확인했다고 착각"하는 자리를 기계 신호가 대신 지키는 것입니다.

▸ 소방 활용 포인트
119 데이터는 신고자·환자 정보가 섞이기 쉽습니다. 외부 AI나 공개 저장소에 올리기 전 반드시 이 점검을 거치고, 공개하지 않을 자료는 외부 AI에도 넣지 마세요. warn은 통과가 아니고 block은 중단 신호이며, 가드는 보조 장치일 뿐 최종 확인은 사람입니다.

가상 상황 — 업로드 5분 전

가상의 상황을 하나 들어 보겠습니다. 한 담당자가 교육 자료로 쓸 출동 사례 CSV를 정리해 공개 깃 저장소에 올리려 합니다. 개인정보는 "당연히 지웠다"고 생각했지만, 파일 300줄 가운데 한 줄의 비고란에 민원인이 남긴 연락처가, 다른 한 줄에는 신고자 주민등록번호가 그대로 남아 있습니다. 눈으로 300줄을 다시 읽을 시간은 없습니다.

이때 올리기 직전 python pii_guard.py cases.csv 한 줄이면, 기계가 300줄을 훑어 그 두 줄을 집어냅니다. 주민등록번호는 block으로 잡혀 종료 코드 1이 떨어지고, "지금 올리면 안 된다"가 분명해집니다. 사람의 눈이 놓치기 쉬운 '단 한 줄'을 기계가 받쳐 주는 것 — 이것이 자동 1차 점검의 값어치입니다. 반대로, 눈으로만 훑고 올렸다면 그 한 줄은 저장소 기록에 영원히 남았을 것입니다.

가상 사례: 교육 설문 요약 전 입력 줄이기

다음은 실제 교육생이나 설문과 무관한 가상 사례입니다. 교육 담당자는 합성 설문 메모를 외부 AI로 주제별 요약하려 합니다. 메모 본문에는 교육 의견뿐 아니라 이름을 떠올리게 하는 직책, 회신용 주소, 소속을 함께 적은 행이 섞여 있습니다.

담당자는 원문 전체를 곧바로 넣지 않습니다. 로컬에서 정해진 패턴을 점검하고, 요약에 필요 없는 회신 정보와 소속 열을 제거합니다. warn이 나온 행은 공개 연락 창구인지 개인 정보인지 확인하고, 이름처럼 패턴이 없는 표현은 문맥을 읽어 일반 표현으로 바꿉니다.

종료 코드가 0이어도 그대로 전송하면 실패입니다. 패턴 점검이 직책과 상황의 조합까지 안전하다고 보증하지 않기 때문입니다. 담당자는 최소화된 합성 요약문만 입력하고, 결과에도 식별 단서가 되살아나지 않았는지 사람이 다시 확인합니다.

직접 해보기 (안전한 연습 파일)

실제 신고자·환자 자료가 아니라, 합성 문자열로 만든 연습 파일로만 시험합니다.

POWERSHELL
("연습용 경고: " + "010-" + "0000-" + "0000") | Set-Content -Encoding UTF8 sample_warn.txt
("연습용 차단: " + "000000-" + "1000000") | Set-Content -Encoding UTF8 sample_block.txt
python pii_guard.py sample_block.txt

차단 패턴이 있으면 값을 가린 채 이렇게 알려 줍니다.

TEXT
⛔ 차단 1건 — 제거 전에는 진행할 수 없습니다:
  - [주민/외국인등록번호] sample_block.txt 1행: 000███████████
ℹ️ 가드는 보조 장치입니다. 이름·주소는 기계가 못 잡습니다 — 최종 확인은 사람이 합니다.

값을 통째로 다시 찍지 않고 앞 세 자리만 남긴 채 가리는 것도 원칙입니다. 점검 결과 화면·로그 자체가 또 하나의 유출 통로가 되지 않도록, 도구는 찾은 값을 절대 온전히 되돌려 주지 않습니다.

무엇이 잡히고 무엇이 놓치는가

패턴 점검의 힘과 한계는 예시로 봐야 분명합니다. 아래는 전부 가상의 문자열이며, PII 가드가 어떻게 판정하는지 보여 줍니다.

예시(전부 가상)판정왜 그런가
901010-1000000block6자리+7자리 주민번호 꼴이 정확히 맞음
010-0000-0000warn휴대전화 꼴 — 대표번호일 수도 있어 사람이 확인
홍길동 소방관못 잡음이름은 고정된 모양이 없음
마포구 성산동 12-3못 잡음상세주소는 문맥이라야 사람으로 이어짐
010.0000.0000놓칠 수 있음구분자가 점이라 전화번호 패턴과 어긋남

마지막 두 줄이 핵심 교훈입니다. 정규식은 미리 정해 둔 모양만 잡습니다. 이름·주소는 애초에 고정된 모양이 없어 못 잡고, 같은 전화번호라도 점이나 특이한 구분자로 적으면 패턴을 비켜 갑니다. 그래서 종료 코드 0(표시 없음)은 "개인정보가 없다"가 아니라 "알려진 패턴이 안 걸렸다"일 뿐입니다.

사람이 끝까지 봐야 하는 것

자동 점검을 통과해도 다음은 사람이 직접 확인합니다.

TEXT
- [ ] 신고자명, 환자명, 요구조자명, 연락처, 상세주소를 제거했습니다.
- [ ] 사건번호, 출동번호, 내부 보고번호가 실제 건을 특정하지 않는지 확인했습니다.
- [ ] 공개용 예제 데이터는 합성 데이터 또는 공개 가능한 데이터만 사용했습니다.
- [ ] AI 도구에 넣을 텍스트는 필요한 최소 정보만 남겼습니다.

정규식이 못 잡는 것

PII 가드는 알려진 패턴만 찾습니다. 다음은 자동 탐지가 실패할 수 있어 사람의 판단이 필요합니다.

  • 이름·상세주소·드문 직책과 상황의 조합
  • 실제 신고 내용·현장 사진 설명·사진 속 글자
  • 의료정보·수사정보·내부 작전정보 (패턴이 없어도 공개 대상이 아닐 수 있음)

이름·주소처럼 '모양 없는' 개인정보를 문맥으로 자동 탐지하려면 정규식만으로는 부족하고, 개체명 인식(NER)을 얹어야 합니다. 통화 몇 건이면 여기 3단 점검의 마지막에서 사람이 지우면 되지만, 수천 건을 다뤄야 한다면 개인정보 비식별 파이프라인에서 이름·지명까지 자동으로 가리는 방법으로 이어집니다. 어느 경우든 연습은 실데이터 대신 119 합성 데이터로만 하세요.

⚠️ 흔한 실수
일부만 가린 실제 번호는 block이 놓칠 수 있고, 공용 대표번호·공개 이메일은 warn이 잘못 잡을 수 있습니다. 도구의 결과는 시작점이지 결론이 아닙니다.

용어 한 줄 사전

용어한 줄 설명
개인정보한 사람을 직접 또는 다른 정보와 결합해 알아볼 수 있게 하는 정보입니다.
직접 식별자값 하나만으로 개인을 가리킬 수 있는 번호·연락처 같은 정보입니다.
데이터 최소화업무 목적에 꼭 필요한 정보만 남기는 원칙입니다.
정규식일정한 글자 모양을 규칙으로 표현해 문자열을 찾는 방법입니다.
마스킹원래 값을 바로 읽지 못하도록 일부 또는 전부를 가리는 처리입니다.
문맥 점검여러 단서의 조합이 사람·사건을 드러내는지 살피는 검토입니다.

자주 묻는 질문

Q. 종료 코드가 0이면 외부 AI에 넣어도 되나요?

아닙니다. 알려진 패턴이 발견되지 않았다는 뜻일 뿐입니다. 이름·상세주소·희귀한 상황 조합을 사람이 확인하고, 공개하지 않을 자료는 외부로 보내지 않습니다.

Q. warn은 무조건 삭제하라는 뜻인가요?

공개 대표번호처럼 업무상 공개된 값일 수도 있으므로 사람이 성격을 확인하라는 신호입니다. 확인 근거가 없거나 목적에 필요하지 않으면 제거합니다.

Q. 값을 일부 가리면 안전한가요?

다른 열과 결합해 사람을 알아볼 수 있거나, 가린 부분을 쉽게 추정할 수 있으면 충분하지 않습니다. 목적에 필요 없는 열은 삭제하고 남은 문맥까지 봅니다.

Q. 점검 결과 로그를 보관해도 되나요?

로그 자체에 원래 값이 다시 나타나지 않게 해야 합니다. 필요한 것은 검토 대상·판정·조치 기록이며, 발견한 개인정보 원문을 복사해 남기는 것이 아닙니다.

핵심 정리

  • 필요한 정보만 남기는 최소화가 자동 탐지보다 먼저입니다.
  • 정규식은 모양 있는 값만 찾으므로 종료 코드 0은 안전 보증이 아닙니다.
  • block은 즉시 중단하고 warn은 공개 필요성과 마스킹 수준을 확인합니다.
  • 문맥상 식별 위험과 최종 외부 전송 여부는 사람이 판단합니다.

다음 단계