코드 서명 — macOS 공증과 Windows 서명
"코드 서명이 없으면 OS가 '알 수 없는 개발자' 경고를 띄운다" — 사용자 신뢰를 위해 코드 서명은 필수입니다.
왜 코드 서명이 필요한가
| 미서명 시 | 서명 시 |
|---|---|
| macOS: "손상될 수 있음" 경고 | 정상 실행 |
| Windows: SmartScreen 차단 | 신뢰할 수 있는 앱 |
| 자동 업데이트 불가 (macOS) | 자동 업데이트 가능 |
macOS 코드 서명
필요 사항
- Apple Developer Program 가입 ($99/년)
- Developer ID Application 인증서
- Apple ID (공증용)
electron-builder 설정
# electron-builder.yml
mac:
hardenedRuntime: true
gatekeeperAssess: false
entitlements: build/entitlements.mac.plist
entitlementsInherit: build/entitlements.mac.plist
<!-- build/entitlements.mac.plist -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
</dict>
</plist>
공증(Notarization) 설정
afterSign: scripts/notarize.js
// scripts/notarize.js
const { notarize } = require('@electron/notarize');
module.exports = async function notarizing(context) {
const { electronPlatformName, appOutDir } = context;
if (electronPlatformName !== 'darwin') return;
const appName = context.packager.appInfo.productFilename;
await notarize({
appBundleId: 'com.myapp.desktop',
appPath: `${appOutDir}/${appName}.app`,
appleId: process.env.APPLE_ID,
appleIdPassword: process.env.APPLE_ID_PASSWORD,
teamId: process.env.APPLE_TEAM_ID,
});
};
환경변수 설정
export APPLE_ID="your@email.com"
export APPLE_ID_PASSWORD="app-specific-password"
export APPLE_TEAM_ID="XXXXXXXXXX"
export CSC_LINK="path/to/certificate.p12"
export CSC_KEY_PASSWORD="certificate-password"
Windows 코드 서명
EV 코드 서명 인증서
Windows SmartScreen 경고를 제거하려면 EV(Extended Validation) 코드 서명 인증서가 필요합니다.
# electron-builder.yml
win:
signingHashAlgorithms:
- sha256
sign: scripts/sign.js # 커스텀 서명 스크립트 (HSM 사용 시)
환경변수 기반 서명
# PFX 파일 기반
export CSC_LINK="path/to/certificate.pfx"
export CSC_KEY_PASSWORD="password"
# 또는 Windows Certificate Store 사용
export CSC_NAME="My Company"
CI/CD에서의 코드 서명
# GitHub Actions 예시
jobs:
build-mac:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: 인증서 설치
env:
CSC_LINK: ${{ secrets.MAC_CERTIFICATE }}
CSC_KEY_PASSWORD: ${{ secrets.MAC_CERTIFICATE_PASSWORD }}
run: |
npm ci
npm run build
npm run package:mac
면접 포인트 정리
- macOS: Developer ID 인증서 + 공증(Notarization) 필수
- Windows: EV 코드 서명으로 SmartScreen 경고 해제
- 인증서와 비밀번호는 환경변수로 관리, 코드에 포함 금지
- CI/CD에서 시크릿으로 인증서 정보를 전달
- Hardened Runtime과 entitlements 설정이 macOS 공증의 전제 조건
코드 서명을 다뤘으면, 다음은 앱 크기 최적화를 알아봅시다.
댓글 로딩 중...