사내 공용 폴더에서 잘 돌아가던 정산용 엑셀 매크로가, 담당자에게 메일로 보내자마자 빨간 띠와 함께 막힙니다. 파일을 다시 보내도, 압축해서 보내도 결과는 똑같습니다.
이때 대부분은 파일이 깨졌다고 보고 매크로 코드부터 들여다봅니다. 그런데 코드는 멀쩡합니다. 바뀐 것은 파일 내용이 아니라, 그 파일이 직원 PC 까지 도착한 경로입니다.
파일이 깨진 것이 아니라 꼬리표가 하나 붙은 것입니다
윈도우는 인터넷 영역이나 제한된 사이트 영역에서 받은 파일에 '웹 표시(Mark of the Web)' 라는 꼬리표를 붙입니다. 브라우저 다운로드와 메일 첨부가 대표적입니다. 이 꼬리표는 파일 내용이 아니라 NTFS 파일 시스템이 따로 보관하는 정보입니다.
엑셀은 이 꼬리표를 보고 매크로만 막습니다. 시트와 수식은 그대로 열립니다. 그래서 파일이 손상된 것처럼 보이지 않고, 오히려 원인을 찾기가 더 어렵습니다.
예전 노란 띠에 있던 '콘텐츠 사용' 버튼도 사라졌습니다. 이 기본 동작은 Current Channel 기준 2022년 7월 27일 버전 2206 부터, 반기 기업 채널은 2023년 1월 10일 버전 2208 부터 적용됐습니다.
차단 여부는 파일에 적힌 영역 번호 하나로 갈립니다
꼬리표 안에는 ZoneId 라는 숫자가 들어 있습니다. 0은 내 컴퓨터, 1은 로컬 인트라넷, 2는 신뢰할 수 있는 사이트, 3은 인터넷, 4는 제한된 사이트입니다.
공식 문서 기준으로 기본 차단 대상은 3과 4뿐입니다. 값이 2 이하이면 매크로는 그대로 실행됩니다. 문제가 생긴 파일의 번호는 명령 프롬프트에서 바로 확인할 수 있습니다.
notepad 파일이름.xlsm:Zone.Identifier
내 PC 에서 되는 이유는 그 파일이 한 번도 밖에 나간 적이 없기 때문입니다
작성자 PC 에 있는 원본에는 꼬리표가 없습니다. 본인이 직접 만들어 저장한 파일이기 때문입니다. 같은 파일이 메일이나 클라우드를 한 번 거치는 순간 ZoneId 3 이 붙습니다.
IP 주소로 접근하는 사내 공유 폴더도 같은 취급을 받습니다. 인트라넷 안에 있어도 신뢰할 수 있는 사이트나 로컬 인트라넷 영역에 등록돼 있지 않으면 차단됩니다.
매크로가 직원 PC 에서만 막힌다면, 의심할 대상은 코드가 아니라 그 파일이 지나온 경로입니다.
그래서 처음 질문의 답은 분명합니다. 파일 문제가 아니라 배포 방식 문제입니다. 고쳐야 할 대상은 매크로가 아니라 전달 경로입니다.
엑셀은 정해진 순서로 실행 여부를 판단합니다
오피스는 네 가지를 차례대로 확인합니다. 먼저 신뢰할 수 있는 위치에 있는 파일인지 봅니다. 다음으로 매크로에 서명이 있고 그 인증서가 PC 에 등록돼 있는지 봅니다.
그다음이 조직 정책이고, 마지막이 예전에 '콘텐츠 사용' 을 눌러 둔 문서인지입니다. 여기까지 전부 해당하지 않으면 매크로는 차단됩니다.
배포 설계는 이 순서를 그대로 따라가면 됩니다. 앞의 두 단계 중 하나에서 통과시키면 직원은 아무것도 누를 필요가 없습니다.
직원마다 차단 해제를 누르게 하는 방식은 곧 무너집니다
파일 속성 창의 '차단 해제' 체크박스나 PowerShell 의 Unblock-File 명령은 확실히 동작합니다. 다만 파일 하나당 한 번씩 해야 합니다. 매달 새 파일이 나가면 매달 반복입니다.
네트워크 공유에 있는 파일은 체크박스가 아예 보이지 않는 경우가 있습니다. 보이더라도 그 공유가 인터넷 영역으로 판정되면 체크해도 소용없습니다.
더 큰 비용은 따로 있습니다. 직원이 '빨간 띠가 뜨면 해제한다' 를 학습하면, 진짜 악성 첨부 파일에도 같은 손이 나갑니다.
신뢰할 수 있는 위치는 가장 빠르지만 검사를 통째로 건너뜁니다
신뢰할 수 있는 위치로 지정한 폴더의 파일은 웹 표시 검사를 건너뜁니다. 그것만이 아닙니다. 파일 차단 설정과 보호된 보기까지 함께 건너뛰고, 서명 없는 추가 기능과 외부 데이터 연결도 전부 켜집니다.
그룹 정책에는 '신뢰할 수 있는 위치 #1' 부터 20개까지 슬롯이 있습니다. 엑셀용 정책은 사용자 구성\정책\관리 템플릿\Microsoft Excel 2016\Excel 옵션\보안\트러스트 센터\신뢰할 수 있는 위치 아래에 있습니다.
신뢰할 수 있는 위치는 '이 폴더는 검사하지 않겠다' 는 선언입니다. 폴더 권한 관리가 곧 보안 수준이 됩니다.
네트워크 폴더는 기본적으로 신뢰할 수 있는 위치로 인정되지 않습니다. 마이크로소프트 보안 기준선도 '네트워크의 신뢰할 수 있는 위치 허용' 을 사용 안 함으로 두라고 권합니다. 로컬 폴더를 쓰고, 그 폴더에 파일을 넣을 수 있는 사람을 좁히세요.
코드 서명은 파일이 어디로 옮겨져도 따라갑니다
VBA 프로젝트에 디지털 서명을 하고, 그 인증서를 직원 PC 의 '신뢰할 수 있는 게시자' 저장소에 넣어 두는 방식입니다. 이러면 웹 표시가 붙은 파일도 두 번째 단계에서 통과합니다.
인증서 배포는 그룹 정책의 컴퓨터 구성\정책\Windows 설정\보안 설정\공개 키 정책\신뢰할 수 있는 게시자에서 가져오기로 합니다. 도메인 환경이 아니면 certutil 명령의 -addstore 옵션을 스크립트로 돌려도 됩니다.
주의할 점이 있습니다. 같은 인증서로 서명된 매크로는 전부 신뢰됩니다. 게다가 신뢰할 수 있는 게시자는 오피스 전용이 아니라 윈도우 전체에 적용되는 설정입니다.
인증서는 자체 서명과 상용 CA 중 하나를 골라야 합니다
오피스에는 SelfCert.exe 라는 자체 서명 인증서 생성 도구가 들어 있습니다. 다만 이 인증서는 만든 PC 에서만 신뢰되므로, 직원 PC 마다 따로 배포하지 않으면 아무 효과가 없습니다. 테스트나 소수 PC 용으로 보세요.
상용 CA 인증서는 2023년 6월 1일부터 개인 키를 하드웨어에 보관해야 발급됩니다. FIPS 140-2 레벨 2 또는 Common Criteria EAL 4+ 이상 토큰이나 HSM 이 필요합니다. 서명 담당자와 토큰 보관 책임을 먼저 정하세요. 금액은 CA 공식 페이지에서 확인하세요.
서명할 때 타임스탬프를 넣는 것을 잊지 마세요. 타임스탬프가 있으면 인증서가 만료돼도 기존 서명은 유효합니다. 없으면 만료일에 전 직원의 파일이 한꺼번에 막힙니다.
두 방법은 이렇게 나눠서 쓰세요
선택 기준은 하나입니다. 그 파일이 회사 밖으로 나가는지 여부입니다. 아래 기준으로 나누면 대부분 정리됩니다.
- 사내 직원만 쓰고 파일이 매달 새로 생성됩니다 → 신뢰할 수 있는 위치
- 메일과 클라우드로 파일이 돌아다니거나 외부 고객사에 나갑니다 → 코드 서명
- 파일 종류가 적고 저장 위치가 고정돼 있습니다 → 신뢰할 수 있는 위치로 충분합니다
- 매크로를 만드는 사람이 여럿이라 책임을 구분해야 합니다 → 코드 서명
서명 방식으로 갈 경우 'VBA 매크로 알림 설정' 정책을 사용으로 두세요. 그리고 '디지털 서명된 매크로를 제외한 모든 매크로 사용 안 함' 과 '신뢰할 수 있는 게시자가 서명하도록 요구' 를 함께 켜세요.
이럴 때는 이 방법이 맞지 않습니다
엑셀 추가 기능 파일(.xla, .xlam)은 예외입니다. 웹 표시가 붙어 있으면 서명을 하고 게시자를 신뢰해도 동작하지 않습니다. 2016년 보안 업데이트 MS16-088 이후로 그렇습니다. 이 경우에는 웹 표시를 제거하거나 신뢰할 수 있는 위치에 두는 방법만 남습니다.
정책 자체를 못 쓰는 경우도 있습니다. 여기서 말한 그룹 정책과 클라우드 정책은 Microsoft 365 Apps for enterprise 기준이고, business 요금제에서는 사용할 수 없습니다. 소규모 사업장이라면 PC 마다 트러스트 센터에서 직접 설정해야 합니다.
이 차단은 윈도우용 오피스에만 있습니다. Mac, 웹, 안드로이드와 iOS 오피스는 해당하지 않습니다. FAT32 로 포맷된 USB 를 거치면 꼬리표가 사라지는데, 이것은 해결책이 아니라 진단 단서로만 쓰세요.
사내 파일 배포와 업무 자동화 설계는 실무 가이드 에서 이어집니다. 정책 이름과 버전별 적용 시점은 마이크로소프트 공식 문서 에서 확인할 수 있습니다. 배포 구조를 함께 설계할 곳이 필요하면 Codeforest 로 문의하세요.
결론: 매크로가 아니라 전달 경로를 고치세요
직원 PC 에서만 매크로가 막히는 것은 파일 결함이 아닙니다. 메일과 클라우드를 거치면서 붙은 웹 표시 때문이고, 이것은 배포 방식으로만 풀립니다. 코드를 고쳐서는 해결되지 않습니다.
파일이 사내에만 머문다면 신뢰할 수 있는 위치를 정책으로 지정하고 그 폴더의 쓰기 권한을 좁히세요. 파일이 밖으로 나간다면 코드 서명이 맞습니다. 직원에게 차단 해제를 누르게 하는 방식만은 선택지에서 빼세요.