NOTES · 2026.10.07 · EXP-02

엑셀 파일에 보이지 않게 남는 개인정보 — 숨은 데이터 이야기

셀을 가려도 숨긴 시트, 메모, 작성자 정보, 수식 계산 결과에 개인정보가 남습니다. 엑셀 개인정보 마스킹을 만들며 파일 안을 직접 고치기로 한 이유와 확인한 방법을 정리했습니다.

엑셀에서 주민번호나 전화번호를 별표로 바꾸는 방법은 검색하면 많이 나옵니다. REPLACE 함수로 뒷자리를 가리는 강좌가 여럿 있을 만큼, 함수로 직접 처리하는 경우가 많습니다. 그런데 보이는 셀만 고치면 끝나지 않습니다. 화면에는 없지만 파일 안에는 남아 있는 곳이 있기 때문입니다.

개인정보보호위원회와 KISA가 2024년 4월 펴낸 홈페이지 개인정보 노출방지 안내서도 엑셀 첨부파일의 노출 원인을 따로 정리해 두었습니다. 행·열·시트 숨기기, 시트 보호만 믿고 남겨 둔 데이터, REPLACE 같은 함수로 가린 뒤 지우지 않은 원본 열, 메모, 배경색과 같은 색으로 칠한 글자, OLE 개체, 외부 파일 참조, 이렇게 일곱 가지입니다.

엑셀 개인정보 마스킹은 이런 “숨은 데이터”를 찾는 것을 핵심으로 잡고 만들었습니다.

1. 화면에 안 보여도 파일에는 남는 것

xlsx 파일은 사실 여러 개의 XML 파일을 zip으로 묶은 것입니다. 열어 보면 화면에서 보지 못한 것들이 들어 있습니다.

2. 엑셀 개인정보 마스킹이 하는 일

위의 위치를 열어 보고, 찾은 것을 화면에 보여 준 뒤 사용자가 처리 방법을 고르게 했습니다.

위치 하는 일
숨긴 시트 안의 개인정보를 함께 가립니다. 시트를 통째로 지울 수도 있습니다
숨긴 행·열 안의 개인정보를 함께 가립니다. 원하면 보이게 바꿉니다
메모 메모 속 개인정보를 가립니다. 메모를 통째로 지울 수도 있습니다
작성자 정보 문서 속성의 작성자·마지막 수정자·회사·관리자, 메모 작성자, 메모 본문 앞의 “작성자 이름:“을 비웁니다
수식의 계산 결과 저장된 결과에 개인정보가 있으면 수식은 두고 결과 값만 가립니다
공유 문자열 어느 셀도 쓰지 않는데 개인정보가 든 문자열, 지운 시트에서만 쓰던 문자열을 비웁니다
피벗 테이블, 다른 파일 연결, 그림·포함 개체 있다는 사실만 알려 줍니다

처음 화면에서는 숨긴 시트 지우기와 작성자 정보 비우기가 켜져 있고, 숨긴 행·열 보이기와 메모 지우기는 꺼져 있습니다. 숨긴 시트를 지울 때는 문서 속성의 시트 이름 목록도 함께 지웁니다.

3. 왜 xlsx를 직접 고치기로 했나

처음에는 엑셀 파일을 읽고 쓰는 라이브러리를 쓰는 방법부터 따져 봤습니다.

방식 장점 문제
SheetJS(무료판)로 읽고 다시 쓰기 쉬움 다시 쓸 때 서식·차트 등이 빠짐
ExcelJS 서식 상당 부분 유지 피벗·차트 등 일부 요소 유실, 숨은 데이터를 세밀하게 다루기 어려움
zip을 열어 XML을 직접 수정 바꾼 부분 외에는 그대로 직접 구현할 양이 많음

원칙이 두 가지였습니다. 가린 셀과 지운 숨은 데이터 외에는 파일을 그대로 둘 것, 그리고 숨은 데이터가 있는 위치를 정확히 다룰 것. 둘 다 지키려면 파일 안을 직접 고치는 방법밖에 없었습니다.

그래서 파일 전체를 객체로 만들었다가 다시 쓰지 않고, 바꿀 부분의 위치만 찾아 그 자리만 잘라 끼웁니다. 고치지 않은 파트는 압축된 바이트를 그대로 옮깁니다. 첫 검증에서 전화번호를 가린 파일을 보면, 바뀐 파트는 공유 문자열, 시트, 메모 3개뿐이었고 나머지 14개 파트는 바이트 단위로 원본과 같았습니다.

공유 문자열은 한 문자열을 여러 셀이 같이 쓰기 때문에 따로 규칙을 정했습니다. 그 문자열을 쓰는 셀이 모두 같은 값으로 바뀌면 목록의 문자열 자체를 바꾸고, 일부 셀만 바뀌면(사용자가 특정 칸을 가리기에서 뺀 경우 등) 바뀌는 셀만 목록에서 떼어 셀 안에 직접 적습니다.

숨긴 시트를 지울 때는 고민이 하나 더 있었습니다. 엑셀에서 시트를 지우면 그 시트를 참조하던 수식은 #REF!로 깨집니다. 엑셀 개인정보 마스킹은 대신 수식의 마지막 계산 결과 값만 남깁니다. 더 이상 다시 계산되지는 않지만, 숫자가 깨진 표보다는 낫다고 판단했습니다.

4. 실제 Excel로 열어 확인했다

xlsx를 직접 고치면 잘못 고친 파일이 나오기 쉽습니다. 엑셀이 파일을 열 때 “복구” 경고를 띄우면 실패로 보기로 하고, 결과 파일을 실제 Excel로 열어 확인하는 스크립트를 만들었습니다.

확인 결과
셀을 가린 파일 (첫 검증, Excel 16) 복구 없이 열림. 가린 값, 날짜 서식, 머리글 굵게, 열 너비, 숨긴 행·열, 숨김·매우 숨김 시트 상태, 메모 정상
가리기만, 시트 삭제, 작성자 비우기, 모두 적용, 10만 행 파일 다섯 가지 모두 복구 없이 열림
브라우저 화면에서 받은 결과 파일 복구 없이 열림. 칸 제외, 가명, 숨긴 시트 삭제가 반영됨
일부러 망가뜨린 파일 (공유 문자열 번호 범위 초과, XML 깨짐) Excel이 열기를 거부

마지막 줄이 중요했습니다. 망가진 파일을 Excel이 실제로 거부하는 것을 보고 나서야, 이 확인 방법이 손상을 잡아낸다고 믿을 수 있었습니다.

확인하면서 알게 된 것도 있습니다. 지운 시트를 가리키는 이름 정의를 #REF!$A$1처럼 주소를 남긴 채 두면 Excel이 파일 열기를 거부했습니다. 그래서 엑셀이 직접 시트를 지울 때와 같은 값인 #REF!로 바꿉니다.

5. 파일은 서버로 보내지 않는다

구조는 카톡 대화 분석기와 같습니다.

방문 통계에는 이벤트 이름과 숫자·코드·구간만 보냅니다. 셀 값, 파일 이름, 시트 이름, 열 제목은 넣지 않습니다. 파일 확장자도 알려진 것만 보내고 나머지는 other로 바꿔, 파일 이름 조각이 나가지 않게 했습니다. 배포된 사이트에서 파일을 검사하고 받아 본 뒤 브라우저 네트워크 탭으로 확인했을 때, 밖으로 데이터를 보낸 요청은 방문 통계(Google Analytics, Cloudflare Web Analytics)뿐이었고 그 안에 파일 이름·시트 이름·셀 값은 없었습니다.

6. 보증하지 않는 것

찾은 것을 보여주고 사용자가 고르게 했지만, 모든 개인정보를 찾는다고 말할 수는 없습니다. 그래서 다시 검사해 남은 것이 없을 때도 “없어요”가 아니라 “찾지 못했어요”라고 씁니다.

마지막 확인은 눈으로 해 달라고 안내하는 것도 이 때문입니다.

엑셀 숨은 데이터를 직접 확인하는 방법은 엑셀 숨긴 시트 개인정보 확인에, 홈페이지에 파일을 올리기 전 점검 순서는 홈페이지 게시 전 첨부파일 점검에 정리해 두었습니다.

제작 기록 목록