본문 바로가기
Tools2026년 9월 25일17분 읽기

코드 서명 없는 Windows 프로그램 배포 — SmartScreen 경고를 정직하게 안내하는 법

YS
김영삼
조회 14
코드 서명 없는 Windows 프로그램 배포 — SmartScreen 경고를 정직하게 안내하는 법

코드 서명 인증서 없이 배포한 Windows 프로그램은 처음 실행할 때 SmartScreen의 "Windows의 PC 보호" 창을 거의 피할 수 없다. 개인 개발자가 할 수 있는 최선은 경고를 숨기는 요령이 아니라, 왜 뜨는지 솔직하게 설명하고 해시·안전한 업데이트 방식으로 신뢰를 대신 주는 것이다.

나는 BoltPDF, BoltMemo, 한칸(HanKan) 같은 무료 Windows 프로그램을 서명 없이 배포한다. 이 글은 그렇게 배포하면서 정한 원칙, 프로그램 페이지에 실제로 넣는 안내, 그리고 서명에 대한 내 솔직한 입장을 정리한 기록이다.

3줄 요약
  • SmartScreen 경고는 파일과 게시자의 평판이 쌓이지 않아서 뜨는 것이지, 프로그램이 위험하다는 판정이 아니다. 이 차이를 사용자에게 그대로 설명한다.
  • 프로그램 페이지마다 SHA-256 해시를 공개하고, 받은 파일의 해시를 직접 확인하는 법과 "추가 정보 → 실행" 안내를 함께 둔다.
  • 서명이 없는 앱은 설치 파일을 스스로 받아 실행하는 자동 업데이트를 하지 않는다. 새 버전이 있으면 내 사이트의 프로그램 페이지만 열어 준다.

PART 01왜 내 프로그램에는 "Windows의 PC 보호"가 뜨나

처음 BoltPDF를 올렸을 때, 내 PC에서는 아무 문제 없이 돌던 설치 파일이 다른 PC에서는 파란 창부터 띄웠다. "Windows의 PC 보호 — Microsoft Defender SmartScreen에서 인식할 수 없는 앱의 시작을 차단했습니다." 실행 버튼은 보이지 않고 "실행 안 함"만 덩그러니 있다. 처음 보는 사람은 당연히 바이러스라고 생각한다.

SmartScreen은 기본적으로 평판 기반으로 동작하는 것으로 알려져 있다. 인터넷에서 받은 실행 파일을 열 때, 그 파일(해시)과 서명한 게시자가 그동안 얼마나 많이, 문제없이 실행되었는지를 본다. 서명이 없으면 게시자 평판이란 게 아예 없고, 새 버전을 낼 때마다 해시가 바뀌니 파일 평판도 매번 0에서 시작한다. 그래서 개인 개발자의 무료 프로그램은 새 버전을 낼 때마다 이 창을 다시 만난다.

중요한 건 이 경고가 "악성이라고 판정했다"가 아니라 "아직 잘 모르는 파일이다"라는 의미라는 점이다. 백신이 실제로 악성 코드를 잡은 경우와는 화면도 의미도 다르다. 나는 이 차이를 사용자에게 정확히 전달하는 게 배포 페이지의 첫 번째 일이라고 본다.

비슷해 보이지만 성격이 다른 세 가지 경고
구분사용자가 보는 화면의미내가 안내하는 대응
SmartScreen 미인식 앱파란 "Windows의 PC 보호" 창평판이 아직 없음(위험 판정 아님)해시 확인 후 "추가 정보 → 실행"
백신의 악성 탐지Defender/백신의 위협 알림, 파일 격리서명·패턴상 위협으로 판단실행하지 말고 제보해 달라고 안내
브라우저 다운로드 경고"일반적으로 다운로드되지 않는 파일"다운로드 평판이 낮음공식 페이지에서 받았는지, 해시가 맞는지 확인
삽질 기록 · 다운로드 페이지에 "추가 정보" 한 줄을 넣기까지
처음에는 프로그램 페이지에 다운로드 버튼만 두었다. 그런데 프로그램을 받은 사람 입장에서 생각해 보면, 파란 창이 뜨는 순간 할 수 있는 건 창을 닫는 것뿐이다. "실행" 버튼은 "추가 정보"를 눌러야 나타나기 때문이다. 그래서 지금은 BoltPDF, BoltMemo, 한칸 페이지 모두에 같은 안내를 넣는다. "코드 서명 인증서가 없어서 첫 실행 때 Windows의 PC 보호 창이 뜰 수 있습니다. 아래 SHA-256 값과 받은 파일이 같은지 확인한 뒤, '추가 정보' → '실행'을 누르면 됩니다." 길게 쓰지 않는다. 이유, 확인 방법, 실행 방법 세 가지만 쓴다.

PART 02경고를 숨기는 요령 대신 이유를 쓴다

검색해 보면 "SmartScreen 끄는 법", "경고 안 뜨게 하는 법" 같은 글이 많다. 레지스트리를 고치거나, 압축 파일 속성에서 차단 해제를 하거나, 아예 Defender 설정에서 SmartScreen을 끄라고 한다. 나는 이걸 내 프로그램 페이지에 절대 쓰지 않는다.

이유는 간단하다. 내 프로그램 하나를 실행시키려고 사용자 PC의 보안 기능 전체를 끄라고 하는 건, 나를 믿어 달라는 게 아니라 아무나 믿으라고 가르치는 일이다. 그렇게 꺼 둔 SmartScreen은 다음에 진짜 악성 파일을 받을 때도 꺼져 있다. 무료 프로그램을 쓰려고 들어온 사람에게 그런 습관을 심어 주는 건 개발자로서 할 짓이 아니라고 본다.

영삼
내 생각
나는 "경고를 우회하는 요령"을 가르치는 배포 페이지를 신뢰하지 않는다. 경고가 왜 뜨는지, 내가 왜 서명을 하지 않았는지, 사용자가 무엇으로 확인할 수 있는지를 솔직하게 쓰는 쪽이 길게 보면 훨씬 큰 신뢰를 만든다. 숨기려는 순간 오히려 수상해 보인다.

그래서 내 안내는 딱 하나의 예외만 허용한다. "이 파일 하나"에 대해서만 사용자가 스스로 판단해 실행하는 것. 그 판단을 돕는 재료가 해시와 공식 다운로드 경로다. 시스템 설정을 바꾸는 방법은 안내하지 않는다.

PART 03SHA-256 해시는 귀찮아도 공개한다

서명이 없는 프로그램에서 사용자가 "이 파일이 개발자가 올린 그 파일이 맞나"를 확인할 수 있는 거의 유일한 방법이 해시다. 그래서 나는 프로그램 페이지마다 설치판과 무설치판 각각의 SHA-256 값을 적어 둔다. 새 버전을 낼 때마다 갱신해야 해서 솔직히 번거롭다. 그래도 빼지 않는다.

해시 확인은 생각보다 어렵지 않다. Windows에는 PowerShell의 Get-FileHash가 기본으로 들어 있다. 다운로드 폴더에서 PowerShell을 열고 아래처럼 실행하면 된다.

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과 백신 오탐을 스스로 불러들이는 구조다.

그래서 원칙을 정했다. 앱은 새 버전이 있다는 사실만 알려 주고, 버튼을 누르면 내 사이트의 프로그램 페이지를 브라우저로 연다. 설치 파일은 사용자가 직접 받는다. 한 단계 더 번거롭지만, 사용자는 매번 해시와 안내가 있는 공식 페이지를 거치게 된다.

1
시작 후 몇 초 뒤, 하루 한 번만
앱을 켜자마자 네트워크를 붙잡지 않는다. 화면이 다 뜬 뒤 잠시 기다렸다가 확인하고, 마지막 확인 시각을 저장해 하루에 한 번을 넘기지 않는다.
2
보내는 건 버전 문자열뿐
요청에는 현재 버전 외에 아무것도 싣지 않는다. 기기 정보, 사용 통계, 식별자 같은 건 보내지 않는다.
3
실패하면 조용히 무시
오프라인이거나 서버가 응답하지 않으면 오류 창을 띄우지 않는다. 다음 날 다시 확인하면 그만이다.
4
새 버전이 있으면 페이지만 연다
"새 버전이 있습니다" 안내와 함께 프로그램 페이지를 여는 버튼을 준다. 다운로드·실행은 앱이 하지 않는다.
5
"이 버전 건너뛰기" 제공
지금 버전이 마음에 드는 사람도 있다. 건너뛴 버전은 다시 묻지 않고, 그다음 버전이 나왔을 때만 알린다.
영삼
내 생각
서명 없는 개인 개발자에게 "자동으로 받아서 자동으로 실행하는 업데이트"는 독이라고 본다. 편의성은 조금 얻지만, 오탐 한 번이면 "이 프로그램 바이러스 아니냐"는 평판이 남는다. 그리고 업데이트 경로가 털리면 내 사용자 전원에게 악성 코드를 뿌리는 통로가 된다. 서명이 없다면 업데이트는 알림까지만 하는 게 맞다.

PART 05서명 없음 · OV · EV · 클라우드 서명 서비스 비교

그럼 서명을 하면 되지 않느냐는 질문을 자주 받는다. 맞는 말이고, 나도 언젠가는 해야 한다고 생각한다. 다만 선택지마다 얻는 것과 드는 것이 꽤 다르다. 아래는 내가 알아본 범위에서 정리한 것이고, 가격은 업체와 시기마다 달라서 일부러 적지 않았다. 정책은 바뀔 수 있으니 실제로 고를 땐 각 업체와 Microsoft 문서를 직접 확인해야 한다.

코드 서명 선택지 비교 — 가격은 시기마다 달라 생략
방식얻는 것부담SmartScreen 관점(알려진 바)
서명 없음비용·절차 없음, 바로 배포변조 여부를 사용자가 해시로 직접 확인해야 함버전마다 평판이 새로 시작, 경고가 자주 뜸
OV 인증서게시자 이름 표시, 변조 탐지연간 비용, 신원 확인 절차, 최근엔 하드웨어 토큰 보관 요구가 일반적게시자 평판이 쌓이면 버전이 바뀌어도 경고가 줄어들 수 있음
EV 인증서OV보다 엄격한 신원 확인OV보다 비싸고 절차가 더 까다로움예전엔 즉시 평판을 받는다고 알려졌지만, 2024년 무렵부터 그렇지 않은 방향으로 바뀌었다고 알려져 있음
클라우드 서명 서비스마이크로소프트의 클라우드 서명 서비스 등, 키를 직접 보관하지 않음구독형 비용, 지원 국가·신원 확인 조건 제한이 있을 수 있음서명 자체는 정식, 평판은 결국 사용량으로 쌓인다고 보는 게 안전

표에서 내가 가장 주목한 건 마지막 열이다. 어떤 서명을 하든 "서명하는 순간 경고가 사라진다"는 보장은 없다는 게 내가 이해한 현재 상황이다. 서명은 평판이 쌓일 수 있는 그릇을 만들어 주는 것이고, 평판 자체는 다운로드와 실행이 쌓여야 생긴다. 서명 없이도 같은 파일이 충분히 많이 실행되면 경고가 줄어들 수 있다고 알려져 있지만, 나처럼 자주 업데이트하는 사람은 그 효과를 거의 못 본다.

클라우드 서명 서비스는 키 보관 부담이 없다는 점에서 1인 개발자에게 가장 현실적인 선택지로 보인다. 다만 서비스 이름이 바뀌기도 하고 가입 조건이 지역에 따라 달라서, 나는 아직 "지켜보는 중"이다.

영삼
내 생각
내 입장은 분명하다. 언젠가 서명은 해야 한다. 하지만 지금 무료로 배포하는 1인 개발자에게 매년 드는 비용과 절차, 키 관리 부담에 비해, 경고가 확실히 사라지는 것도 아니라면 비용 대비 효과는 애매하다. 그래서 당분간은 서명 대신 해시 공개, 정직한 안내, 안전한 업데이트 구조로 신뢰를 쌓는 쪽을 택했다. 유료 판매를 시작하거나 사용자가 훨씬 많아지면 그때는 미루지 않을 생각이다.

PART 06정직한 배포 페이지 체크리스트

지금 내 프로그램 페이지에 공통으로 넣는 항목을 정리하면 이렇다. 프로그램마다 디자인은 조금씩 달라도 이 목록은 빠지지 않는다. 특히 설치판과 무설치(포터블)판을 둘 다 주는 건, 설치 프로그램을 돌리는 것 자체가 부담스러운 사람을 위한 선택지다. 무설치판은 압축만 풀어 쓰면 되니 레지스트리를 건드리지 않고, 지우고 싶으면 폴더째 지우면 된다.

내 프로그램 페이지에 공통으로 넣는 것
✓첫 실행 때 "Windows의 PC 보호" 창이 뜰 수 있다는 사실과 그 이유(코드 서명 인증서 없음)를 다운로드 버튼 가까이에 쓴다.
✓"추가 정보" → "실행" 순서를 짧게 안내한다. SmartScreen을 끄거나 시스템 설정을 바꾸는 방법은 쓰지 않는다.
✓설치판·무설치판 각각의 SHA-256 해시를 적고, 새 버전을 올릴 때마다 함께 갱신한다.
✓PowerShell Get-FileHash로 직접 확인하는 방법을 한 줄 명령으로 보여 준다.
✓공식 다운로드 경로가 어디인지 밝히고, 다른 사이트의 재배포본은 해시가 맞는지 확인하라고 안내한다.
✓설치판과 무설치(포터블)판을 둘 다 제공한다.
✓업데이트 확인이 무엇을 보내는지(버전 문자열뿐), 얼마나 자주 하는지(하루 1회)를 밝힌다.
✓백신이 실제 위협 알림을 띄운 경우엔 실행하지 말고 알려 달라는 연락 경로를 둔다.

이 목록을 다 지켜도 경고 창은 여전히 뜬다. 그건 바꿀 수 없다. 내가 바꿀 수 있는 건 그 창을 본 사람이 "이 개발자는 숨기는 게 없구나"라고 느끼게 하는 것뿐이다. 그리고 나는 그게 서명 없는 개발자가 쌓을 수 있는 가장 확실한 신뢰라고 본다.

하지 말아야 할 것. 설치 파일을 압축해 확장자를 바꾸거나, 실행 파일을 다른 형식으로 감싸서 경고를 피하게 만드는 방식은 쓰지 않는 게 좋다. 경고는 피할지 몰라도 백신 입장에선 더 수상한 행동이고, 들키는 순간 신뢰는 회복하기 어렵다.
서명 없이 배포하면서 지키는 것
  1. SmartScreen 경고는 "위험하다"가 아니라 "평판이 아직 없다"는 뜻임을 사용자에게 그대로 설명한다.
  2. 경고를 끄는 요령 대신 SHA-256 해시와 직접 확인하는 방법을 준다. 귀찮아도 매 버전 갱신한다.
  3. 업데이트는 알려 주기까지만. 앱이 설치 파일을 받아 실행하지 않고, 프로그램 페이지를 연다.
  4. 확인은 시작 몇 초 뒤 하루 1회, 버전 문자열만 보내고, 실패는 조용히 넘기고, 건너뛰기를 준다.
  5. 서명은 언젠가 할 숙제로 두되, 지금 비용 대비 효과는 냉정하게 따진다.

자주 묻는 질문

Windows의 PC 보호 창이 뜨면 바이러스인가요?

꼭 그렇지는 않다. SmartScreen의 "Windows의 PC 보호" 창은 파일이나 게시자의 평판이 충분히 쌓이지 않았을 때 뜨는 것으로, 악성 코드라는 판정과는 다르다. 다만 출처가 불분명하다면 실행하지 말고, 공식 페이지에 공개된 해시와 받은 파일의 해시가 같은지 먼저 확인하는 게 좋다.

코드 서명이 없는 프로그램을 안전하게 실행하려면 어떻게 하나요?

개발자의 공식 페이지에서 받았는지 확인하고, PowerShell에서 Get-FileHash 파일명 -Algorithm SHA256 으로 해시를 계산해 페이지에 적힌 값과 비교한다. 값이 같으면 "추가 정보"를 누른 뒤 "실행"을 선택하면 된다. SmartScreen 자체를 끌 필요는 없다.

코드 서명 인증서를 사면 SmartScreen 경고가 바로 사라지나요?

바로 사라진다고 장담하기 어렵다. 서명은 게시자 평판이 쌓일 수 있게 해 주지만, 평판 자체는 다운로드와 실행이 쌓여야 생기는 것으로 알려져 있다. 예전에는 EV 인증서가 즉시 평판을 받는다고 알려졌지만, 2024년 무렵부터 그렇지 않은 방향으로 바뀌었다고 알려져 있다.

무료 프로그램 개발자도 코드 서명을 해야 하나요?

장기적으로는 하는 게 맞다고 본다. 다만 비용과 신원 확인, 키 관리 부담이 있어서 1인 무료 배포라면 당장은 해시 공개와 정직한 안내로 대신하는 것도 현실적인 선택이다. 유료 판매나 사용자 규모가 커지면 서명을 미루지 않는 게 좋다.

서명 없는 앱에 자동 업데이트를 넣어도 되나요?

새 버전 알림은 괜찮지만, 앱이 설치 파일을 스스로 받아 실행하는 방식은 권하지 않는다. 서명 없는 실행 파일이 다른 실행 파일을 내려받아 실행하는 동작은 백신 오탐을 부르기 쉽고, 업데이트 경로가 공격받으면 피해가 커진다. 알림 후 공식 페이지를 열어 사용자가 직접 받게 하는 편이 안전하다.

참고 자료

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록