"코드 서명이 없으면 OS가 '알 수 없는 개발자' 경고를 띄운다" — 사용자 신뢰를 위해 코드 서명은 필수입니다.


왜 코드 서명이 필요한가

미서명 시서명 시
macOS: "손상될 수 있음" 경고정상 실행
Windows: SmartScreen 차단신뢰할 수 있는 앱
자동 업데이트 불가 (macOS)자동 업데이트 가능

macOS 코드 서명

필요 사항

  1. Apple Developer Program 가입 ($99/년)
  2. Developer ID Application 인증서
  3. Apple ID (공증용)

electron-builder 설정

YAML
# electron-builder.yml
mac:
  hardenedRuntime: true
  gatekeeperAssess: false
  entitlements: build/entitlements.mac.plist
  entitlementsInherit: build/entitlements.mac.plist
XML
<!-- 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) 설정

YAML
afterSign: scripts/notarize.js
JAVASCRIPT
// 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,
  });
};

환경변수 설정

BASH
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) 코드 서명 인증서가 필요합니다.

YAML
# electron-builder.yml
win:
  signingHashAlgorithms:
    - sha256
  sign: scripts/sign.js  # 커스텀 서명 스크립트 (HSM 사용 시)

환경변수 기반 서명

BASH
# PFX 파일 기반
export CSC_LINK="path/to/certificate.pfx"
export CSC_KEY_PASSWORD="password"

# 또는 Windows Certificate Store 사용
export CSC_NAME="My Company"

CI/CD에서의 코드 서명

YAML
# 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 공증의 전제 조건

코드 서명을 다뤘으면, 다음은 앱 크기 최적화를 알아봅시다.

댓글 로딩 중...