엑셀 명단에서 전화번호를 찾는 것은 쉬워 보입니다. “010으로 시작하는 숫자”만 찾으면 될 것 같습니다. 그런데 실제 파일을 생각하면 금방 복잡해집니다. 하이픈 없이 붙여 쓴 번호, 숫자 칸에 넣어서 앞의 0이 사라진 번호, 주문번호 한가운데에 우연히 들어 있는 010, 날짜처럼 생긴 계좌번호가 섞여 있습니다.
엑셀 개인정보 마스킹은 이런 경우를 규칙으로 하나씩 나눠 처리합니다. 이 글은 그 규칙을 정리한 것입니다. 숨긴 시트, 메모, 작성자 정보처럼 화면에 안 보이는 곳 이야기는 엑셀 파일에 보이지 않게 남는 개인정보에 따로 썼습니다. 여기서는 셀 안의 글자에서 개인정보를 골라내는 방법만 다룹니다.
글에 나오는 번호는 모두 지어낸 예시입니다.
1. 확실과 후보, 두 단계로 나눈다
가장 먼저 정한 것은 “찾았다”를 한 가지로 말하지 않는 것이었습니다. 찾은 값마다 확실 또는 후보 표시가 붙습니다.
- 확실: 모양과 검증이 모두 맞아 개인정보로 봐도 되는 것. 결과 화면에서 기본으로 선택됩니다.
- 후보: 개인정보일 수도 있지만 다른 숫자일 가능성도 있는 것. 기본으로는 선택되지 않고, 사용자가 “후보 포함”을 켜야 가려집니다.
자동으로 다 가리지 않고 찾은 위치를 목록으로 보여 준 뒤 사용자가 고르게 한 것도 같은 이유입니다. 숫자 모양만으로는 확신할 수 없는 경우가 분명히 있기 때문에, 그 판단을 숨기지 않고 화면에 드러내기로 했습니다.
2. 유형별로 찾는 규칙
지금 찾는 유형은 8가지입니다. 기본 가리기(부분 가리기)를 했을 때의 모양과 함께 정리하면 다음과 같습니다.
| 유형 | 찾는 방법 | 부분 가리기 결과 예 |
|---|---|---|
| 주민등록번호·외국인등록번호 | 앞 6자리가 실제 날짜, 7번째 자리 1~8, 검증 숫자 | 900101-1****** |
| 휴대전화 | 01x, +82 국제 표기, 하이픈·점·공백·붙여 쓰기 |
010-****-0000 |
| 일반전화 | 지역번호(02, 031 등)와 070 | 02-***-0000 |
| 이메일 | 표준 이메일 모양 | so***@example.com |
| 카드번호 | 13~19자리, Luhn 검사, 4자리씩 묶인 모양 | 4111-****-****-1111 |
| 계좌번호 | 숫자 10~16자리 + 은행 이름·“계좌” 같은 단서 | ***-***-**0000 (뒤 4자리만 남김) |
| 주소 | 주소 열이거나, 시·도 + 도로명·동 + 번지 모양 | 서울특별시 강남구 *** |
| 이름 | 이름 열에서만 | 홍*동, 남궁** |
| 생년월일 | 생년월일 열에서만 | 1990-**-** |
유형마다 오탐(개인정보가 아닌데 잡는 것)과 누락(개인정보인데 놓치는 것)을 줄이려고 붙인 규칙이 조금씩 다릅니다.
주민등록번호: 날짜와 검증 숫자
주민등록번호는 YYMMDD-GNNNNNN 모양입니다. 13자리 숫자만 보면 주문번호나 일련번호와 구별이 안 되므로 세 가지를 더 확인합니다.
- 앞 6자리가 실제로 있는 날짜인지. 13월이나 2월 30일이면 주민번호가 아닙니다. 7번째 자리로 1900년대(1·2·5·6)인지 2000년대(3·4·7·8)인지 정해서 날짜를 계산하고, 오늘보다 뒤인 생일도 제외합니다.
- 7번째 자리가 1~8인지. 그 밖의 숫자면 제외합니다.
- 마지막 자리 검증 숫자가 맞는지. 앞 12자리에 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5를 차례로 곱해 더한 값으로 마지막 자리를 계산할 수 있습니다. 외국인등록번호는 계산식이 조금 달라서 따로 처리합니다.
검증 숫자가 맞으면 확실입니다. 여기서 고민이 하나 있었습니다. 2020년 10월 이후 새로 받은 번호는 뒷자리가 임의로 정해져 검증 숫자가 맞지 않을 수 있습니다. 그래서 검증 숫자가 틀려도 하이픈으로 6-7자리가 나뉘어 있으면 후보로는 잡습니다. 반대로 하이픈 없이 붙여 쓴 13자리는 다른 긴 숫자와 헷갈리기 쉬워 검증 숫자가 맞을 때만 잡습니다. 열 제목이 “주민등록번호”라면 검증 숫자가 틀려도 확실로 봅니다.
전화번호: 앞뒤 경계와 구분자
휴대전화는 01[016789]로 시작하는 번호를 하이픈, 점, 공백, 붙여 쓰기 모두 찾고, +82 10-…처럼 국제 표기도 찾습니다. 일반전화는 서울 02와 031·042·051·064 같은 지역번호, 그리고 070을 봅니다.
오탐을 막는 장치는 두 가지입니다.
- 더 긴 숫자의 일부는 잡지 않습니다. 번호 앞뒤에 다른 숫자가 붙어 있으면 전화번호로 보지 않습니다. 그래서 16자리 주문번호 한가운데에 010이 들어 있어도 전화번호가 되지 않습니다.
1010-0000-0000처럼 앞에 숫자가 하나 더 붙은 값도 전화번호가 아니라 계좌번호 후보로 분류됩니다. - 구분자 없는 일반전화는 후보입니다.
02-000-0000처럼 하이픈이 있으면 확실이지만,0310000000처럼 붙여 쓴 일반전화는 다른 숫자와 헷갈리기 쉬워 후보로 둡니다. 휴대전화는 붙여 써도 확실입니다.
이메일: 숫자 아이디도 이메일 하나로
이메일은 표준 모양 하나로 찾고 항상 확실입니다. 여기서 신경 쓴 것은 01000000000@example.com처럼 휴대전화 번호를 아이디로 쓴 주소입니다. 한 값이 여러 유형에 걸리면 우선순위로 하나만 남기는데, 이메일이 가장 앞이라 이 값은 전화번호와 이메일로 두 번 잡히지 않고 이메일 하나로 처리됩니다.
카드번호: Luhn 검사와 모양
카드번호는 13~19자리 숫자이고, 마지막 자리가 Luhn이라는 계산법으로 검증됩니다. Luhn을 통과하지 못하면 카드번호로 보지 않습니다. 다만 아무 숫자나 대략 10개 중 1개는 우연히 Luhn을 통과하므로, 통과만으로는 확실로 보지 않습니다. 4자리씩 묶인 모양, 아멕스의 4-6-5 묶음, 붙여 쓴 15·16자리처럼 카드번호다운 모양까지 맞아야 확실이고, 그 밖의 경우는 후보입니다.
계좌번호: 단서가 있어야 확실
계좌번호는 은행마다 자릿수와 하이픈 위치가 달라 모양만으로는 판단하기 가장 어렵습니다. 그래서 단서를 봅니다.
- 열 제목이 “계좌”, “입금 계좌” 같은 계좌류일 때
- 같은 셀 안에 은행 이름이나 “계좌”, “입금”, “예금주” 같은 말이 있을 때 (
국민 000000-00-000000) - 바로 옆 열이 은행·예금주 열일 때 (그 열의 제목과 같은 행의 값을 함께 단서로 봅니다)
단서가 있으면 숫자 10~16자리를 확실로 잡고, 하이픈 없이 붙여 쓴 긴 숫자도 잡습니다. 단서가 없으면 하이픈으로 묶인 숫자만 후보로 잡고, 하이픈 없는 긴 숫자는 아예 잡지 않습니다. 단서 없이도 주민번호 모양(6-7)이나 카드 모양(4-4-4-x)인 숫자는 계좌 후보에서 뺍니다. 2026-10-06 같은 날짜는 숫자가 8개뿐이라 처음부터 대상이 아닙니다.
주소: 번지까지 있어야
주소 열이 아닌 곳에서는 “시·도 이름 + (시·군·구) + 도로명이나 동·리 + 번지”가 이어진 모양만 주소로 봅니다. 뒤에 붙은 동·호수, 아파트 이름, 괄호 안 참고 항목까지 함께 잡습니다. 번지가 빠진 “서울 강남구 역삼동”이나 시·도가 빠진 “테헤란로 123”은 주소 열이 아니면 잡지 않습니다. 동네 이름이나 도로 이름은 문장에 흔히 나오기 때문입니다.
부분 가리기는 시·도와 시·군·구까지만 남기고 나머지를 ***로 바꿉니다. 어느 지역 고객인지 정도는 남겨 두는 편이 쓸모 있다고 봤습니다.
3. 열 제목이 가장 큰 단서다
이름과 생년월일은 글자 모양만으로는 찾을 수 없습니다. “홍길동”은 사람 이름이지만 “김치전”도 한글 세 글자입니다. 날짜는 어느 표에나 있습니다. 그래서 이 둘은 열 제목이 이름류·생년월일류인 열에서만 찾습니다.
머리글 행은 시트의 앞 10행 중에서 개인정보 열 제목이 가장 많은 행으로 정합니다. 표 위에 제목이나 설명 행이 몇 줄 있는 파일이 많아서, 첫 행을 무조건 머리글로 보지 않습니다. 머리글 행 자체는 가리지 않습니다.
열 제목은 공백, 밑줄, 괄호, 점 등을 지우고 소문자로 바꾼 뒤 정해진 말이 들어 있는지 봅니다.
- 이름: 이름, 성명, 성함, 고객명, 수령인, 받는 분, 주문자, 신청자, 담당자, 보호자, 예금주, name 등
- 전화: 연락처, 전화, 휴대폰, HP, Phone, mobile 등
- 그 밖에 이메일, 주민·외국인등록, 카드번호, 계좌, 생년월일·생일, 주소·배송지·거주지
검사하는 순서도 의미가 있습니다. “담당자 연락처”에는 “담당자”가 들어 있지만 연락처 열이고, “이메일 주소”에는 “주소”가 들어 있지만 이메일 열입니다. 그래서 전화·이메일 규칙을 이름·주소 규칙보다 먼저 봅니다. 또 “상품 이름”, “파일 이름”, “IP 주소”처럼 사람이 아닌 것을 가리키는 말이 함께 있으면 이름·주소 열로 보지 않습니다.
이름 열 안에서도 몇 가지를 더 처리합니다.
- 한 칸에 “홍길동, 김철수”처럼 여러 이름이 있으면 각각 잡습니다.
- “홍길동님”의 “님”이나 “씨”는 떼고 이름만 가립니다.
- “본인”, “미정”, “없음”, “N/A”처럼 이름 칸에 자주 들어가는 이름 아닌 말은 건너뜁니다.
- 영문 이름은 단어마다 첫 글자만 남깁니다 (
G****** H***). - 두 글자 이름은
이*, 네 글자 이름은김**무, 남궁·제갈 같은 두 글자 성은남궁**처럼 성을 남깁니다.
열 제목은 다른 유형에도 단서가 됩니다. 연락처 열에서는 구분자 없는 일반전화도 확실로 보고, 카드번호 열에서는 Luhn 검사에 실패한 값도 잡습니다.
4. 숫자 칸에서 사라진 0
엑셀에 전화번호를 숫자로 입력하면 앞의 0이 빠집니다. 010-0000-0000을 하이픈 없이 숫자 칸에 넣으면 1000000000이 됩니다. 2000년대생 주민번호도 같은 일이 생겨 13자리가 12자리가 됩니다.
이런 값은 그냥 숫자와 구별할 방법이 없으므로, 숫자 칸이면서 열 제목이 연락처류나 주민번호일 때만 잡습니다. 가릴 때는 빠진 0을 다시 붙여 010-****-0000, 050101-3******처럼 원래 모양으로 바꿔 씁니다. 생년월일 열의 날짜 칸은 엑셀 안에서 날짜 일련번호로 저장되어 있어서, 이 번호를 연도로 바꾼 뒤 1990-**-**처럼 연도만 남깁니다.
5. 한 칸에 여러 개가 섞여 있을 때
“홍길동 010-0000-0000 someone@example.com”처럼 한 칸에 여러 정보가 들어 있으면 각각 따로 찾고, 찾은 부분만 바꿉니다. 칸 전체를 지우지 않으니 “보호자”, “메일” 같은 주변 글자는 그대로 남습니다.
찾은 범위가 겹치면 정해진 순서로 하나를 고릅니다. 확실이 후보를 이기고, 그다음은 유형 순서(이메일, 주민번호, 카드, 전화, 계좌, 주소, 이름, 생년월일), 그다음은 더 긴 쪽입니다. 예외가 하나 있습니다. 주소 열에 “서울시 강남구 테헤란로 1 (010-0000-0000)“처럼 전화번호가 함께 적혀 있으면, 칸 전체를 주소로 잡지 않고 전화번호는 전화번호로, 나머지는 주소로 나눠 가립니다.
6. 가린 결과와 다시 검사
가리는 방식은 유형마다 고를 수 있습니다.
| 방식 | 010-0000-0000의 결과 |
|---|---|
| 부분 가리기 (기본) | 010-****-0000 |
| 이름표로 바꾸기 | [전화번호] |
| 일관된 가명 | 전화번호1 |
| 지우기 | 빈 값 |
일관된 가명은 같은 값에 같은 가명을 붙입니다. 표기가 달라도 같은 번호면 같은 가명입니다. 010-0000-0000, 01000000000, +82 10-0000-0000, 숫자 칸의 1000000000이 모두 전화번호1이 됩니다. 고객별 건수를 세는 것처럼 “누가 누구인지”는 몰라도 “같은 사람인지”는 알아야 하는 작업에 쓰라고 만든 방식입니다.
정리된 파일을 받으면 같은 엔진으로 그 파일을 다시 검사해 결과를 보여 줍니다. 이때 별표가 들어간 값, [이름] 같은 이름표, 이름3 같은 가명은 다시 개인정보로 잡지 않도록 했습니다. 네 가지 방식 모두 가린 뒤 다시 검사하면 아무것도 나오지 않는지 테스트로 확인합니다.
같은 테스트에서 시드를 고정한 가짜 데이터 1,600건(유형별 200건, 구분자 섞음)을 만들어, 확실로 찾아야 할 값을 하나도 놓치지 않는지와 가린 뒤 다시 검사하면 0건인지 확인했습니다. 다만 이 가짜 데이터는 감지 규칙을 아는 상태에서 만든 것입니다. 실제 파일에는 생각하지 못한 표기가 있을 수 있어서, 이 결과를 “실제 파일에서도 다 찾는다”는 뜻으로 받아들이면 안 됩니다.
7. 일부러 하지 않는 것, 아직 못 하는 것
- 열 제목이 없는 이름은 찾지 않습니다. 성씨 목록과 한글 2~4자로 추측하는 방법도 생각했지만, “김치전” 같은 오탐이 쏟아지면 도구 전체를 믿기 어려워집니다. 그래서 비고 칸이나 문장 속에 섞인 이름은 찾지 못합니다.
- 생년월일 열이 아닌 날짜는 생일로 보지 않습니다. 가입일, 주문일과 구별할 수 없기 때문입니다.
- 번지가 없는 주소나 시·도가 없는 주소는 주소 열이 아니면 놓칩니다.
- AI로 판단하지 않습니다. 파일을 서버로 보내지 않는 것이 원칙이라 모든 판단은 브라우저 안에서 정해진 규칙으로 합니다. 그래서 문맥을 이해해 “이건 사람 이름이다”라고 판단하지는 못합니다.
- 여권번호, 운전면허번호, 사번·학번처럼 기관마다 다른 번호는 아직 찾는 유형에 없습니다.
- 머리글이 없는 표나 한 시트에 표가 여러 개인 경우 머리글 판단이 틀릴 수 있습니다. 이 경우 열 제목에 기대는 이름·생년월일 감지가 빠질 수 있습니다.
- 계좌번호와 카드번호는 후보가 많습니다. 후보는 기본으로 꺼져 있으니 목록에서 직접 확인해 주셔야 합니다.
이런 한계 때문에 다시 검사해 남은 것이 없을 때도 “없어요”라고 하지 않고 “찾지 못했어요”라고 씁니다. 규칙은 사람이 손으로 하던 일을 빠르고 빠짐없이 도와줄 수 있지만, 마지막 확인까지 대신하지는 못합니다.
셀 값뿐 아니라 수식의 저장된 계산 결과와 메모 안의 글자도 같은 규칙으로 검사합니다. 직접 파일을 넣어 보고 싶다면 엑셀 개인정보 마스킹에서 해 볼 수 있습니다. 검사는 브라우저 안에서만 이루어지니, 찾은 위치 목록을 보면서 어떤 값이 확실이고 어떤 값이 후보로 나오는지 확인해 보시면 됩니다.