AI에 업무 문장을 보내기 전에 전송할 정보가 필요한지 먼저 확인하세요. 자체 로컬 함수로 예제 이메일과 휴대전화 번호 두 개를 가리고, 무엇을 탐지하지 못하는지 직접 비교했습니다. 작은 정규식의 통과를 전체 개인정보 검수 완료로 해석하지 않는 방법을 설명합니다.
전송할 문장에서 필요한 정보부터 줄인다
고객 문의를 요약하거나 긴 업무 문장을 분류할 때 연락처까지 같은 입력에 넣는 경우가 있습니다. 요약의 목적이 문의 유형을 구분하는 것이라면 연락할 수 있는 주소는 필요하지 않을 수 있습니다. 먼저 업무 목적에 필요한 문장만 별도로 만들고, 사람을 식별할 수 있는 부분을 줄인 뒤 결과를 검수하세요. 자동으로 단어를 가리는 도구는 그 과정의 작은 보조 단계입니다.
이번 예제는 실제 문의 자료를 사용하지 않습니다. tester@example.com과 010-0000-0000이라는 교육용 문자열을 입력했고 외부 모델이나 서버로 보내지 않았습니다. 개인정보 처리의 법적 적합성을 판단하는 도구도 아닙니다. 전송 대상 서비스의 조직 정책과 접근 권한은 실제 담당자가 확인해야 합니다. 이 글에서 확인하는 범위는 두 종류의 문자열을 로컬에서 치환한 결과와 그 한계입니다.
공식 로그 지침과 문자열 치환의 범위를 구분한다
OWASP의 Logging Cheat Sheet는 로그에 담는 정보와 제외할 정보를 별도로 검토하는 개발 기준을 제공합니다. MDN의 String.replace 문서는 정규식과 콜백으로 일치하는 부분을 바꿀 수 있는 JavaScript 동작을 설명합니다. 이 글은 두 문서를 참고하되 로그 설계 전체를 작은 정규식으로 해결할 수 있다고 주장하지 않습니다. 실제 함수는 아래에 모두 공개한 두 패턴만 검사합니다.
입력 검수와 로그 검수는 다른 위치에서 작동합니다. 외부 전송 전에 문장을 가려도 오류 처리에서 원문을 다시 기록하면 다른 경로에 정보가 남습니다. 반대로 로그를 잘 가린다는 사실만으로 외부 서비스에 보내는 요청이 안전해지는 것도 아닙니다. 생성·전송·오류 처리·운영 로그라는 흐름을 그린 뒤 어느 단계에서 어떤 문자열이 보존되는지 확인해야 합니다. 실습 함수는 그중 문자열 치환 한 단계의 예제입니다.
직접 실행 결과: 예제 연락처 두 항목을 가렸다
검증일은 2026-10-01입니다. Windows의 독립 Chromium 브라우저, 화면 크기 1200×675에서 자체 작성한 로컬 도구를 열었습니다. 입력은 문의: tester@example.com / 010-0000-0000입니다. 직접 검사 버튼을 누르기 전에는 입력과 대기 화면을 캡처했고, 버튼을 누른 뒤 마스킹 2건과 문의: [EMAIL] / [PHONE]이라는 반환 결과를 확인했습니다.
이메일은 EMAIL 표식, 휴대전화 번호는 PHONE 표식으로 대체됐습니다. 두 종류를 다른 표식으로 남겨 문의 문장의 형식은 볼 수 있게 했지만 같은 사람인지 추적할 수 있는 대응표는 만들지 않았습니다. 캡처와 영상은 실제 버튼을 조작한 같은 세션에서 기록했습니다. 실제 개인정보나 계정 정보는 사용하지 않았습니다. 이 관찰은 주어진 예제 두 항목의 치환을 확인한 것이며 다양한 실제 문서에서 탐지율을 측정한 실험이 아닙니다.


재현 코드와 기대 실패를 함께 확인한다
아래 함수를 정의한 뒤 본문의 예제 문자열을 넘기면 text와 masked가 반환됩니다. 원본 문자열을 수정하는 대신 새 문자열을 반환하므로 호출자가 그 결과를 실제 전송할 입력으로 선택해야 합니다. 함수를 실행해 놓고 원본 변수를 그대로 요청에 넣는 연결 실수도 점검하세요. 반환값을 읽는 코드와 외부 전송 코드 사이에 어떤 변수가 전달되는지 확인하는 것이 중요합니다.
이메일과 전화번호를 여러 번 넣은 문장에서는 각각의 일치 항목이 모두 치환되는지 확인하세요. 일치하는 부분이 없는 문장은 masked가 0이 됩니다. 이 값은 민감한 정보가 없다는 판정이 아니라 두 패턴에 맞는 문자열이 없다는 뜻입니다. 이름, 주소, 계약 내용과 다른 식별자는 여전히 남을 수 있습니다. 결과를 자동 승인 조건으로 연결하기 전에 지원하지 않는 입력 사례를 별도로 검수해야 합니다.
const check = function(value) {
let masked = 0;
let text = value.replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, () => { masked++; return '[EMAIL]'; });
text = text.replace(/\b010[- ]?\d{4}[- ]?\d{4}\b/g, () => { masked++; return '[PHONE]'; });
return { text, masked };
};
console.log(check("문의: tester@example.com / 010-0000-0000"));
console.log(check("문의 유형만 요약해주세요"));
누락과 과탐지를 실무 검수 사례로 남긴다
전화번호 패턴은 010으로 시작하는 국내 휴대전화 형식만 지원합니다. 다른 시작 번호, 국제번호, 괄호, 점으로 구분한 형식은 가리지 못합니다. 이메일 패턴도 완전한 주소 문법 검사기가 아니며 국제화 주소나 특수한 표현을 모두 처리하지 않습니다. 띄어 쓴 연락처, 이미지에 들어 있는 문자, 파일 첨부와 숨겨진 메타데이터는 입력 문자열 함수만으로 탐지할 수 없습니다.
반대로 설명용 예제나 기술 문서에서 의미를 보존해야 하는 문자열을 가릴 수도 있습니다. 마스킹 수만 많다고 검수 품질이 높아지는 것은 아닙니다. 원문을 외부에 복사하는 대신 승인된 테스트 자료로 누락과 잘못 치환한 사례를 기록하고, 담당자가 무엇이 필요한 문맥인지 판단하세요. 반복되는 실패 형식이 있으면 패턴을 무조건 늘리기 전에 입력 범위를 좁히거나 검수 도구를 바꾸는 선택도 검토할 수 있습니다.
자동화 연결과 자주 묻는 질문
검사 전후 화면을 운영 보고에 남겨도 되나요? 실습처럼 가짜 예제만 포함된 자료와 실제 사용자 정보가 담긴 자료는 다릅니다. 실제 운영에서는 캡처·오류 로그·재현 파일에 원문을 보관할 필요가 있는지 먼저 확인하세요. 검수 결과를 남길 때도 처리 단계, 패턴 종류, 결과 상태처럼 목적에 필요한 정보만 선택할 수 있습니다.
마스킹 0건이면 바로 AI에 보내도 되나요? 이 도구는 두 패턴만 검사하므로 그렇게 판단할 수 없습니다. 전송할 목적과 포함된 내용, 조직의 사용 정책을 별도로 검수해야 합니다. 이미 전송한 정보가 가려지나요? 이 함수는 다음 입력 문자열만 바꾸며 이전 요청이나 저장된 로그를 지우지 않습니다. 기존 자료의 처리에는 별도의 승인된 절차가 필요합니다.
동일한 연락처를 나중에 복원할 수 있나요? 이 예제는 대응표를 만들지 않아 복원 기능을 제공하지 않습니다. 문맥을 유지하기 위한 가명 처리나 접근 통제가 필요한 업무라면 보관 위치와 권한을 별도로 설계해야 합니다. 단순 치환 함수에 실제 연락처 대응표를 붙여 공개 예제나 공유 로그에 저장하지 마세요. 테스트는 승인된 교육용 문자열부터 시작하는 편이 좋습니다.
검수 사례 표
| 입력 조건 | 직접 검사할 기대 결과 |
|---|---|
| 교육용 이메일 + 010 번호 | 두 항목을 EMAIL·PHONE으로 치환 |
| 연락처 없는 문장 | 0건, 전체 검수 완료를 의미하지 않음 |
| 국제번호·다른 시작 번호 | 지원하지 않는 형식 |
| 이름·주소·이미지 | 이 함수의 검사 범위 밖 |
공식 출처와 함께 읽을 글
- 공식 기준 문서 — 2026-10-01 확인
- 기술 동작 참고 문서 — 2026-10-01 확인
AI 프롬프트 회귀 테스트 실전에서는 입력을 고정하고 수정 전후 차이를 확인하는 다른 검수 과정을 살펴볼 수 있습니다.