코드 서명 인증서 없이 배포한 Windows 프로그램은 처음 실행할 때 SmartScreen의 "Windows의 PC 보호" 창을 거의 피할 수 없다. 개인 개발자가 할 수 있는 최선은 경고를 숨기는 요령이 아니라, 왜 뜨는지 솔직하게 설명하고 해시·안전한 업데이트 방식으로 신뢰를 대신 주는 것이다.
나는 BoltPDF, BoltMemo, 한칸(HanKan) 같은 무료 Windows 프로그램을 서명 없이 배포한다. 이 글은 그렇게 배포하면서 정한 원칙, 프로그램 페이지에 실제로 넣는 안내, 그리고 서명에 대한 내 솔직한 입장을 정리한 기록이다.
- SmartScreen 경고는 파일과 게시자의 평판이 쌓이지 않아서 뜨는 것이지, 프로그램이 위험하다는 판정이 아니다. 이 차이를 사용자에게 그대로 설명한다.
- 프로그램 페이지마다 SHA-256 해시를 공개하고, 받은 파일의 해시를 직접 확인하는 법과 "추가 정보 → 실행" 안내를 함께 둔다.
- 서명이 없는 앱은 설치 파일을 스스로 받아 실행하는 자동 업데이트를 하지 않는다. 새 버전이 있으면 내 사이트의 프로그램 페이지만 열어 준다.
PART 01왜 내 프로그램에는 "Windows의 PC 보호"가 뜨나
처음 BoltPDF를 올렸을 때, 내 PC에서는 아무 문제 없이 돌던 설치 파일이 다른 PC에서는 파란 창부터 띄웠다. "Windows의 PC 보호 — Microsoft Defender SmartScreen에서 인식할 수 없는 앱의 시작을 차단했습니다." 실행 버튼은 보이지 않고 "실행 안 함"만 덩그러니 있다. 처음 보는 사람은 당연히 바이러스라고 생각한다.
SmartScreen은 기본적으로 평판 기반으로 동작하는 것으로 알려져 있다. 인터넷에서 받은 실행 파일을 열 때, 그 파일(해시)과 서명한 게시자가 그동안 얼마나 많이, 문제없이 실행되었는지를 본다. 서명이 없으면 게시자 평판이란 게 아예 없고, 새 버전을 낼 때마다 해시가 바뀌니 파일 평판도 매번 0에서 시작한다. 그래서 개인 개발자의 무료 프로그램은 새 버전을 낼 때마다 이 창을 다시 만난다.
중요한 건 이 경고가 "악성이라고 판정했다"가 아니라 "아직 잘 모르는 파일이다"라는 의미라는 점이다. 백신이 실제로 악성 코드를 잡은 경우와는 화면도 의미도 다르다. 나는 이 차이를 사용자에게 정확히 전달하는 게 배포 페이지의 첫 번째 일이라고 본다.
PART 02경고를 숨기는 요령 대신 이유를 쓴다
검색해 보면 "SmartScreen 끄는 법", "경고 안 뜨게 하는 법" 같은 글이 많다. 레지스트리를 고치거나, 압축 파일 속성에서 차단 해제를 하거나, 아예 Defender 설정에서 SmartScreen을 끄라고 한다. 나는 이걸 내 프로그램 페이지에 절대 쓰지 않는다.
이유는 간단하다. 내 프로그램 하나를 실행시키려고 사용자 PC의 보안 기능 전체를 끄라고 하는 건, 나를 믿어 달라는 게 아니라 아무나 믿으라고 가르치는 일이다. 그렇게 꺼 둔 SmartScreen은 다음에 진짜 악성 파일을 받을 때도 꺼져 있다. 무료 프로그램을 쓰려고 들어온 사람에게 그런 습관을 심어 주는 건 개발자로서 할 짓이 아니라고 본다.
그래서 내 안내는 딱 하나의 예외만 허용한다. "이 파일 하나"에 대해서만 사용자가 스스로 판단해 실행하는 것. 그 판단을 돕는 재료가 해시와 공식 다운로드 경로다. 시스템 설정을 바꾸는 방법은 안내하지 않는다.
PART 03SHA-256 해시는 귀찮아도 공개한다
서명이 없는 프로그램에서 사용자가 "이 파일이 개발자가 올린 그 파일이 맞나"를 확인할 수 있는 거의 유일한 방법이 해시다. 그래서 나는 프로그램 페이지마다 설치판과 무설치판 각각의 SHA-256 값을 적어 둔다. 새 버전을 낼 때마다 갱신해야 해서 솔직히 번거롭다. 그래도 빼지 않는다.
해시 확인은 생각보다 어렵지 않다. Windows에는 PowerShell의 Get-FileHash가 기본으로 들어 있다. 다운로드 폴더에서 PowerShell을 열고 아래처럼 실행하면 된다.
# 다운로드 폴더로 이동
cd $env:USERPROFILE\Downloads
# SHA-256 해시 계산 (기본 알고리즘도 SHA256이지만 명시해 두는 편이 헷갈리지 않는다)
Get-FileHash .\BoltPDF-Setup.exe -Algorithm SHA256
# 페이지에 적힌 값과 바로 비교하기
$expected = "페이지에 적힌 64자리 값을 여기에 붙여 넣기"
(Get-FileHash .\BoltPDF-Setup.exe -Algorithm SHA256).Hash -eq $expected.ToUpper()
# PowerShell이 낯설다면 명령 프롬프트에서
certutil -hashfile BoltPDF-Setup.exe SHA256마지막 줄의 비교 결과가 True면 내가 올린 파일과 한 바이트도 다르지 않다는 뜻이다. certutil은 소문자에 공백이 섞여 나올 수 있어서 눈으로 비교할 땐 PowerShell 쪽이 편하다. 파일 이름은 예시이고, 실제로는 받은 파일 이름을 그대로 쓰면 된다.
PART 04업데이트 확인 기능은 "알려 주기"까지만 한다
서명 없는 배포에서 가장 조심한 부분이 업데이트다. 프로그램에 새 버전 확인 기능을 넣으면서 처음 떠올린 건 흔한 방식이었다. 앱이 새 설치 파일을 백그라운드로 받아서 실행하는 것. 사용자 입장에선 편하다. 그런데 서명이 없는 앱이 인터넷에서 실행 파일을 받아 스스로 실행한다? 이건 행동만 보면 전형적인 다운로더 악성 코드와 구분이 안 된다. SmartScreen과 백신 오탐을 스스로 불러들이는 구조다.
그래서 원칙을 정했다. 앱은 새 버전이 있다는 사실만 알려 주고, 버튼을 누르면 내 사이트의 프로그램 페이지를 브라우저로 연다. 설치 파일은 사용자가 직접 받는다. 한 단계 더 번거롭지만, 사용자는 매번 해시와 안내가 있는 공식 페이지를 거치게 된다.
PART 05서명 없음 · OV · EV · 클라우드 서명 서비스 비교
그럼 서명을 하면 되지 않느냐는 질문을 자주 받는다. 맞는 말이고, 나도 언젠가는 해야 한다고 생각한다. 다만 선택지마다 얻는 것과 드는 것이 꽤 다르다. 아래는 내가 알아본 범위에서 정리한 것이고, 가격은 업체와 시기마다 달라서 일부러 적지 않았다. 정책은 바뀔 수 있으니 실제로 고를 땐 각 업체와 Microsoft 문서를 직접 확인해야 한다.
표에서 내가 가장 주목한 건 마지막 열이다. 어떤 서명을 하든 "서명하는 순간 경고가 사라진다"는 보장은 없다는 게 내가 이해한 현재 상황이다. 서명은 평판이 쌓일 수 있는 그릇을 만들어 주는 것이고, 평판 자체는 다운로드와 실행이 쌓여야 생긴다. 서명 없이도 같은 파일이 충분히 많이 실행되면 경고가 줄어들 수 있다고 알려져 있지만, 나처럼 자주 업데이트하는 사람은 그 효과를 거의 못 본다.
클라우드 서명 서비스는 키 보관 부담이 없다는 점에서 1인 개발자에게 가장 현실적인 선택지로 보인다. 다만 서비스 이름이 바뀌기도 하고 가입 조건이 지역에 따라 달라서, 나는 아직 "지켜보는 중"이다.
PART 06정직한 배포 페이지 체크리스트
지금 내 프로그램 페이지에 공통으로 넣는 항목을 정리하면 이렇다. 프로그램마다 디자인은 조금씩 달라도 이 목록은 빠지지 않는다. 특히 설치판과 무설치(포터블)판을 둘 다 주는 건, 설치 프로그램을 돌리는 것 자체가 부담스러운 사람을 위한 선택지다. 무설치판은 압축만 풀어 쓰면 되니 레지스트리를 건드리지 않고, 지우고 싶으면 폴더째 지우면 된다.
Get-FileHash로 직접 확인하는 방법을 한 줄 명령으로 보여 준다.이 목록을 다 지켜도 경고 창은 여전히 뜬다. 그건 바꿀 수 없다. 내가 바꿀 수 있는 건 그 창을 본 사람이 "이 개발자는 숨기는 게 없구나"라고 느끼게 하는 것뿐이다. 그리고 나는 그게 서명 없는 개발자가 쌓을 수 있는 가장 확실한 신뢰라고 본다.
- SmartScreen 경고는 "위험하다"가 아니라 "평판이 아직 없다"는 뜻임을 사용자에게 그대로 설명한다.
- 경고를 끄는 요령 대신 SHA-256 해시와 직접 확인하는 방법을 준다. 귀찮아도 매 버전 갱신한다.
- 업데이트는 알려 주기까지만. 앱이 설치 파일을 받아 실행하지 않고, 프로그램 페이지를 연다.
- 확인은 시작 몇 초 뒤 하루 1회, 버전 문자열만 보내고, 실패는 조용히 넘기고, 건너뛰기를 준다.
- 서명은 언젠가 할 숙제로 두되, 지금 비용 대비 효과는 냉정하게 따진다.
자주 묻는 질문
Windows의 PC 보호 창이 뜨면 바이러스인가요?
꼭 그렇지는 않다. SmartScreen의 "Windows의 PC 보호" 창은 파일이나 게시자의 평판이 충분히 쌓이지 않았을 때 뜨는 것으로, 악성 코드라는 판정과는 다르다. 다만 출처가 불분명하다면 실행하지 말고, 공식 페이지에 공개된 해시와 받은 파일의 해시가 같은지 먼저 확인하는 게 좋다.
코드 서명이 없는 프로그램을 안전하게 실행하려면 어떻게 하나요?
개발자의 공식 페이지에서 받았는지 확인하고, PowerShell에서 Get-FileHash 파일명 -Algorithm SHA256 으로 해시를 계산해 페이지에 적힌 값과 비교한다. 값이 같으면 "추가 정보"를 누른 뒤 "실행"을 선택하면 된다. SmartScreen 자체를 끌 필요는 없다.
코드 서명 인증서를 사면 SmartScreen 경고가 바로 사라지나요?
바로 사라진다고 장담하기 어렵다. 서명은 게시자 평판이 쌓일 수 있게 해 주지만, 평판 자체는 다운로드와 실행이 쌓여야 생기는 것으로 알려져 있다. 예전에는 EV 인증서가 즉시 평판을 받는다고 알려졌지만, 2024년 무렵부터 그렇지 않은 방향으로 바뀌었다고 알려져 있다.
무료 프로그램 개발자도 코드 서명을 해야 하나요?
장기적으로는 하는 게 맞다고 본다. 다만 비용과 신원 확인, 키 관리 부담이 있어서 1인 무료 배포라면 당장은 해시 공개와 정직한 안내로 대신하는 것도 현실적인 선택이다. 유료 판매나 사용자 규모가 커지면 서명을 미루지 않는 게 좋다.
서명 없는 앱에 자동 업데이트를 넣어도 되나요?
새 버전 알림은 괜찮지만, 앱이 설치 파일을 스스로 받아 실행하는 방식은 권하지 않는다. 서명 없는 실행 파일이 다른 실행 파일을 내려받아 실행하는 동작은 백신 오탐을 부르기 쉽고, 업데이트 경로가 공격받으면 피해가 커진다. 알림 후 공식 페이지를 열어 사용자가 직접 받게 하는 편이 안전하다.

댓글 0