님, 이거 안전한거임? 증명 좀;;
코드 서명, 그거 뭔데 왜, 어떻게 하는건데?
요즘 새로 시작한 프로젝트는 데스크톱 앱이다.
회사에 있을 때 데스크톱 앱을 2개 정도 만들어보긴 했는데… 요즘 최신 트랜드는 또 익숙하지가 않아서, 아주 그냥 MVP 빌드부터 삐걱거리면서 고생을 좀 하고 있다.
아무튼, 이제 MVP로 어느 정도 확인을 끝내고 랜딩 페이지까지 만들어놨는데… 이젠 공증이 좀 문제다.
앱 서명.
사실 스토어에 올릴 때나 신경써서 해봤지 데스크톱 앱을 따로 퍼블릭에 올려본 적이 없어서, 데스크톱 앱 서명은 처음 해본다.
그래서 마침 블로그에 글도 올려야하고, 어차피 정리를 좀 해야하니까.
글로 끄적끄적 정리하면서 써보려고 한다.
근데 앱 서명이 뭔데
한 줄로 정리해보면 이렇게 되는 거 같다.
“이 파일 내가 만든 거 맞고, 배포 후에 아무도 안 건드렸음” 을 OS 랑 사용자한테 증명하는 도장.
그러니까 두 가지를 보증해주는 거지.
- 신원 — 누가 배포했는가
- 무결성 — 서명한 이후로 파일이 변조됐는가
플랫폼별로 이름이 다른데, 하는 일은 같아 보인다.
- Windows → Authenticode
- macOS → Developer ID
exe 든 dmg 든 배포 파일에 이 도장을 찍어 놓으면, OS 가 실행 전에 그 도장을 검사해서 “아 이 사람이 배포한 거네, OK” 하고 넘어가는 구조인 듯.
안 하면 어떻게 되냐
경고창이 뜬다. 그것도 마동석처럼 험악하게.
Windows 에서 서명 없는 exe 를 실행하면 “Windows에서 PC를 보호했습니다 / 인식할 수 없는 앱의 시작을 차단했습니다” 라는 큼지막한 파란 화면이 뜬다. 실행 버튼도 처음엔 안 보이고 “추가 정보” 링크를 눌러야 그제서야 나옴. 일반 사용자는 여기서 그냥 이탈한다.
macOS 는 더 빡빡한 것 같다. “확인되지 않은 개발자” 라면서 실행 자체가 막힌다. Catalina 이후로는 서명만 있어도 안 되고 공증 까지 되어 있어야 통과된다는 얘기가 있음.
결국 기능 문제가 아니라 신뢰 문제인 거다. 코드가 아무리 깨끗해도 OS 관점에선 “출처 불명 파일” 이니까 사용자한테 겁을 준다.
서명하면 경고가 바로 사라지냐? — 아니었다
이거 좀 찾아보다가 알게 된 건데, 서명만 하면 경고가 즉시 사라질 줄 알았다.
근데 아니라더라. 특히 Windows.
Windows SmartScreen 은 서명 여부뿐 아니라 평판 이라는 걸 본다는 것. 같은 서명자로 배포된 파일들이 다운로드가 얼마나 됐고 문제 없이 잘 실행됐는지. 새로 서명한 파일은 이 평판이 0 에서 시작해서, 서명이 있어도 처음 며칠~몇 주는 여전히 경고가 뜰 수 있다는 얘기.
그럼 서명 왜 하냐 싶은데, 그래도 이런 이점이 있는 거 같다.
- 경고가 떠도 “알 수 없는 게시자” 가 아니라 내 이름/회사명이 뜬다 → 덜 무서움
- 같은 서명자로 계속 서명하면 평판이 부분적으로 이어짐 → 서명 없으면 매 버전 0 부터
- 배포 후 누가 파일을 건드리면 서명이 깨져서 감지됨
- 타임스탬프 찍어두면 인증서 만료돼도 서명은 유효
결국 “경고 바로 없애기” 라기보단 “평판 쌓을 신원 만들기” 에 가까운 거 같다.
옛날과 지금
찾다 보니까 옛날 튜토리얼이랑 지금이 좀 다른 지점이 있는 것 같다.
옛날엔 인증서를 .pfx 파일로 다운로드받아서 그냥 내 노트북에 설치하고 서명했던 것 같은데 — 지금은 그게 안 된단다. 2023년쯤에 규칙이 바뀌면서 개인키는 반드시 하드웨어 (USB 토큰이나 HSM) 에 저장해야 한다고. 그래서 인증서 발급받으면 USB 토큰이 물리적으로 배송돼 오거나 클라우드 서명 서비스를 써야 함.
또 하나. 옛날엔 EV 인증서 (비싼 거) 사면 SmartScreen 이 첫 다운로드부터 통과시켜줬다는데, 이것도 2024년에 바뀌어서 지금은 EV 사도 즉시 평판이 안 생긴다는 것 같다. 그래서 요즘은 굳이 EV 프리미엄 낼 이유가 없다는 게 중론인 듯.
그래서 어떻게? — Windows
이것저것 찾아보니까 Windows 쪽 선택지가 대략 이런 것 같다.
| 방식 | 특징 | 대략 비용 |
|---|---|---|
| OV 인증서 (DigiCert / Sectigo / SSL.com 등) | USB 토큰 or 클라우드 HSM 필요 | 연 $200~400 |
| EV 인증서 | 신원 검증 더 강함. 드라이버 서명이나 조달 요건 있을 때 | 연 $400+ |
| Azure Artifact Signing | 클라우드 서명, 토큰 불필요, CI/CD 친화적 | 월 $9.99, 지역 제한 |
| Microsoft Store (MSIX) | Microsoft 가 재서명해줌 | 스토어에 낼 때만 |
| 자체 서명 | 공개 배포 불가 | 개발/테스트용 |
Azure Artifact Signing 이 제일 편해 보였는데 — 개인 개발자는 미국/캐나다만 가능하단다. 한국은 아웃.
그럼 결국 OV 인증서 + USB 토큰 이 현실적인 선택인 듯. DigiCert 나 Sectigo, SSL.com 중에 하나 고르는 게 일반적이라고 함.
그래서 지금은 어떻게 하나 — macOS
macOS 쪽은 흐름이 좀 정해져 있는 것 같다.
① Developer ID 서명 → ② Hardened Runtime 활성화 → ③ 공증 → ④ 스테이플
- Apple Developer Program 가입 ($99/년) 하면 Developer ID 인증서 별도 비용 없이 발급 가능
- 앱을 그 인증서로 서명 + Hardened Runtime 활성화 (공증하려면 필수)
- Apple 에 업로드해서 공증 받고 (
xcrun notarytool으로), 티켓을xcrun stapler로 앱에 붙이면 끝
찾아보니 공증이 서명을 대체하는 게 아니라 서명 위에 얹히는 개념이라고 한다. 그리고 Mac App Store 로 내면 Apple 이 재서명해줘서 이 과정 다 생략된다는 것도 있고.
Windows 랑 비교했을 때 좋은 점은 공증만 되면 첫 실행부터 깔끔하다는 거. 대신 파이프라인 세팅이 처음이라 좀 삽질할 각오는 해야 할 듯.
아오 공증시치;
이거 생각보다 더… 빡센 길이네…
정리하면서 하나씩 세어보니까 대충 이런 흐름이다.
Windows 만 놓고 봐도 —
- 인증서 발급 신청 → 신원 검증 며칠
- USB 토큰 물리 배송 기다리기 (해외 배송이면 일주일씩도)
- 도착하면 그 토큰 꽂고 서명 스크립트 붙이기
- 서명해서 배포 → 그래도 첫 몇 주는 SmartScreen 경고 뜨는 거 감수
- 유저한테는 “경고 떠도 무시하고 실행해주세요” 안내 해야 함
macOS 는 별도로 —
- Developer ID 인증서 발급
- Hardened Runtime 옵션 켜고 서명
- 공증 API Key 발급받고 CI 에 심어놓기
- 공증 → 스테이플 파이프라인 자동화
- 첫 릴리즈까지 최소 몇 번은 로컬 삽질
이거 다 하고 나야 진짜로 “다운로드 받아서 더블클릭 → 실행됨” 이 되는 거다.
MVP 만드는 것보다 배포 준비가 더 오래 걸릴 것 같은 느낌인데…
이게 원래 다 이런 거 같긴하다.
특히 요즘 보안은 열린 문마냥 뚫려대고 있는게 현실이라…
방법이 없다. 해야지 뭐…
마치며
앱 서명 자체는 뭐… 결국 하고 나면 별 거 아닌 것 같은데, 처음 하는 사람 입장에선 정보가 파편화돼 있고 옛날 자료도 많아서 진짜 헷갈린다.
일단 확실한 건, “딸깍” 혹은 “돈”으로 뚝딱 해결되는 파트는 아닌 거 같다.
데스크톱 앱 하나 배포하는 데 진짜 넘어야 할 관문이 많다.
마침