⚡ Electron6. 패키징 & 배포📖 개요

06-packaging-distribution — binary로 배포하고, 신뢰 체인을 직접 짓는다

웹은 URL 하나로 끝난다. 사용자가 새로고침하면 새 버전이 떠 있다. Electron은 binary 하나를 사용자 디스크에 깔고, OS가 그 binary를 신뢰하게 만들고, 그 binary가 스스로 갱신되도록 인프라를 직접 세워야 한다. 이 챕터는 그 인프라의 7개 결정을 분해한다.


한 줄 답 (Pyramid Top)

Electron 배포는 단일 단계가 아니라 7개 결정의 사슬이다 — ① bundler 선택 → ② asar 패키징 → ③ OS별 installer → ④ code signing → ⑤ macOS notarization → ⑥ auto-update → ⑦ 멀티 아키텍처/채널 publishing. 이 사슬에서 한 고리만 빠져도 사용자는 “열 수 없는 앱”·“오래된 버전”·“보안 경고”를 만난다.


Why — 왜 패키징이 별도 챕터인가

웹 개발자가 Electron으로 넘어올 때 가장 과소평가하는 영역이다. 세 가지 비대칭이 이유다.

비대칭Electron
갱신 모델서버에 push → URL 새로고침 → 끝binary 빌드 → 서명 → notarize → 업데이트 서버 → 클라이언트 다운로드 → 재시작
신뢰 체인TLS 인증서 한 장코드 서명 인증서 + (mac) notarization + (Windows) SmartScreen 평판
장애 반경”어제 배포가 깨졌어요” → rollback push”오래된 버전이 두 달째 깔려 있어요” → 강제 업데이트 불가능하면 영원히 못 고침

이 비대칭의 핵심은 — 사용자 디바이스에 binary가 살기 시작하는 순간 운영의 책임이 시작된다는 점이다. 보안 패치, OS 업데이트, 인증서 만료, CDN 비용까지 전부 내 책임이 된다.

05 보안에서 다룬 런타임 격리가 “공격면을 좁힌다”라면, 이 챕터는 배포 체인에서 “binary가 도중에 변조되지 않았음을 증명한다”이다. 둘은 보완 관계다.


How — 어떻게 정리했나

이 챕터는 배포 파이프라인의 흐름 순서로 7개 문서를 배치했다.

#파일다루는 결정핵심 질문
101-bundler-comparison.mdbundler 선택electron-builder · forge · packager 중 무엇을 언제 쓰는가?
202-asar-archive.md소스 패키징 포맷asar는 무엇이고, 무엇을 unpack해야 하고, 왜 보안이 아닌가?
303-installers.mdOS별 설치 포맷NSIS·MSIX·dmg·pkg·AppImage·deb·rpm·snap·flatpak — 무엇을 고르나?
404-code-signing.md신뢰 체인 (서명)Authenticode EV vs OV, Apple Developer ID — 비용·발급·갱신
505-macos-notarization.md신뢰 체인 (검증)Gatekeeper, hardened runtime, entitlements, notarytool 실패 사례
606-auto-update.md갱신 메커니즘Squirrel · electron-updater · GitHub Releases/S3/Hazel/Nucleus
707-publishing-and-cdn.md다중 아키텍처 & 채널Intel·Apple Silicon·Win arm64, delta update, stable/beta/canary

What — 핵심 개념 한 줄 요약

개념한 줄 요약
electron-builderyaml/json 설정 한 파일로 all-OS installer + 서명 + 업데이트 메타를 생성하는 사실상 표준
electron-forgeElectron 팀 공식. plugin 모델, Vite/Webpack 템플릿 통합
asartar 비슷한 단일 아카이브 — 암호화가 아니라 그냥 묶음이다
app.asar.unpacked네이티브 모듈(.node), ffmpeg 등 런타임에 fs로 접근해야 하는 파일을 풀어두는 디렉터리
NSISWindows의 사실상 표준 installer 컴파일러 (electron-builder 기본)
Squirrel.Windows관리자 권한 없이 사용자 폴더에 설치 + 자동 업데이트가 기본 — Slack/Discord 모델
MSIXMicrosoft Store의 새 패키지 포맷 (구 .appx 후속)
AuthenticodeWindows 코드 서명 — EV 인증서는 SmartScreen 평판을 즉시 얻음
Developer IDApple의 App Store 밖 배포용 인증서 (Apple Developer Program $99/yr 필요)
hardened runtimemacOS의 추가 격리 — JIT, dyld 변조, library injection 차단
entitlements카메라·마이크·dyld 등 권한 요청 매니페스트
notarizationApple 서버에 binary 업로드 → malware 스캔 → 통과 시 ticket 발급 → stapler로 ticket을 binary에 부착
GatekeepermacOS의 처음 열 때 검증기 — 서명·notarization·quarantine 비트를 확인
Squirrel.MacmacOS auto-update 프레임워크 — Electron autoUpdater의 백엔드
electron-updaterelectron-builder가 제공하는 cross-platform 업데이트 SDK — Squirrel.Windows/Mac을 추상화
delta update전체 binary가 아닌 변경 블록만 다운로드 — 100MB 앱이 5MB 패치로 갱신
channelstable / beta / canary — 같은 앱이 다른 업데이트 stream을 따름

What-if — 한 고리만 빠지면

빠진 고리결과
서명 없는 macOS 빌드Gatekeeper가 “확인되지 않은 개발자” 경고 → 사용자가 우클릭 → 열기로 강제해야 함. 기업 배포에서는 사실상 차단
서명만 하고 notarize 안 함 (macOS 10.15+)“Apple이 악성 소프트웨어가 없는지 확인할 수 없습니다” → 열 수 없음
Windows EV 인증서 없이 새 도메인 배포SmartScreen이 “잘 알려지지 않은 앱” 경고 → 평판 누적까지 몇 주
auto-update 없음두 달 뒤 사용자의 30%가 옛 버전. 보안 패치 못 내림
delta update 없음매 패치마다 100MB+ 다운로드 → CDN 비용 폭증 + 사용자 체감 나쁨
인증서 만료 방치새 서명은 가능하지만 이전에 빌드한 installer가 갑자기 “신뢰할 수 없음”이 됨 (timestamping이 답)
arm64 빌드 누락M1/M2/M3 맥에서 Rosetta로 돌아 2배 메모리·1.5배 CPU — 사용자 컴플레인 누적

Insight — 흥미로운 이야기

“Squirrel은 다람쥐가 도토리를 옮기듯 조용히 업데이트하라는 뜻이다”

GitHub이 2014년 Atom 에디터를 위해 만든 Squirrel는 사용자가 인지하지 못하는 사이에 업데이트를 받는다는 디자인 철학에서 이름이 왔다. Slack·Discord·VS Code가 모두 Squirrel(.Windows) 모델을 채택했고 — 그래서 이 앱들은 관리자 권한 없이 사용자 폴더(%LOCALAPPDATA%)에 설치되고, 재시작할 때마다 새 버전이 들어가 있는 경험을 만든다.

“asar는 보안이 아니다 — 누구나 풀 수 있다”

npx @electron/asar extract app.asar ./out 한 줄이면 모든 JS 소스가 그대로 나온다. Electron 앱의 비즈니스 로직을 가리고 싶다면 난독화V8 bytecode 컴파일 (bytenode 등)을 별도로 적용해야 한다. asar의 역할은 “수만 개의 작은 파일을 fs 시스템 콜 한 번에 읽는 성능 최적화”지 보안 봉인이 아니다.

“Apple Developer Program $99/yr이 사실상 macOS 배포의 입장료다”

Microsoft Store, Mac App Store, Apple Developer Program이 전부 별도 비용이다. 게다가 Apple은 개인 인증서로는 notarize 불가 — 반드시 organization 단위 enrollment가 필요하다. Electron 앱을 출시한다는 결정은 곧 400+(Apple400+ (Apple 99 + Windows EV $300+) 의 운영 비용 시작이라는 뜻이다.


다음 챕터로 가는 다리

이 챕터의 결과물은 다음과 직접 연결된다.

  • 07 성능 & 메모리delta update는 그 자체로 시작 시간/네트워크 절감 — 성능 챕터의 일부
  • 08 생태계 & 대안Tauri는 OS webview를 쓰므로 binary가 5MB, Electron은 100MB+ — 배포 비용 비교
  • 05 보안 → 런타임 격리(context isolation)와 배포 신뢰(code signing)는 동일한 신뢰 문제의 두 끝

한 단락 요약

Electron 배포는 한 번 빌드해서 끝이 아니라 7개 결정의 사슬을 운영하는 일이다. bundler를 고르고 → asar로 묶고 → OS별 installer를 만들고 → 코드를 서명하고 → (mac) notarize하고 → auto-update를 깔고 → 다중 아키텍처와 채널로 배포한다. 이 사슬은 한 고리만 빠져도 사용자에게 부러진다 — 그래서 패키징은 마지막에 하는 일이 아니라 설계 첫날부터 같이 가는 인프라다. 이 챕터의 7개 문서는 그 사슬을 하나씩 분해한다.