Homebrew Cask 등록을 위한 사전 요구사항
macOS 애플리케이션을 Homebrew Cask를 통해 배포하려면 Apple의 Gatekeeper 보안 정책을 준수해야 합니다. 이를 위해 애플리케이션 바이너리와 배포 패키지(DMG 등)에 유효한 개발자 서명을 적용하고, Apple 서버를 통한 공증(Notarization)을 완료해야 합니다.
서명이 완료된 애플리케이션은 다음과 같이 Homebrew를 통해 설치할 수 있습니다.
brew install --cask freetex
CLI 환경이 익숙하지 않은 경우 Applite와 같은 GUI 패키지 관리자를 활용하여 동일한 설치 작업을 수행할 수 있습니다.
Apple Developer 프로그램 등록
코드 서명을 수행하려면 Apple Developer 프로그램에 가입해야 합니다. 현재 웹 브라우저 기반의 직접 가입은 제한되어 있으며, macOS 환경에서 'Apple Developer' 앱을 통해 등록을 진행하는 것이 권장됩니다.
등록 절차는 다음과 같습니다.
- Mac 기기에서 Apple Developer 앱 실행 및 Apple ID로 로그인
- 개인 정보 및 팀 정보 입력 후 연간 구독료 결제
- 신원 확인을 위한 추가 문서 제출 및 심사 대기
심사는 일반적으로 1~2일 내에 완료되며, 승인 시 개발자 포털 접근 권한이 부여됩니다.
서명 인증서 프로비저닝
Developer 프로그램 가입 후, Xcode의 계정 설정 메뉴를 통해 로컬 키체인에 인증서를 동기화하는 것이 가장 효율적입니다. macOS 앱의 외부 배포(Homebrew, DMG 등)에 필요한 주요 인증서 유형은 다음과 같습니다.
| 인증서 유형 | 주요 용도 |
|---|---|
| Apple Development | 로컬 개발 및 디버깅 |
| Apple Distribution | App Store 출시 (iOS/macOS) |
| Mac Installer Distribution | Mac App Store용 PKG 패키지 |
| Developer ID Application | App Store 외부 앱 배포 (DMG/ZIP/Homebrew) |
| Developer ID Installer | App Store 외부 PKG 배포 |
로컬 환경에 설치된 서명 인증서는 다음 터미널 명령어로 확인할 수 있습니다.
security find-identity -v -p codesigning | grep "Developer ID"
애플리케이션 바이너리 코드 서명
인증서를 확보한 후, 빌드 단계에서 애플리케이션에 서명을 적용합니다. 예를 들어 PyInstaller를 사용하여 Python 프로젝트를 패키징하는 경우, .spec 파일의 번들 설정에 서명 ID와 권한(Entitlements) 파일을 명시할 수 있습니다.
# build_config.spec 파일 내의 BUNDLE 설정 예시
bundle_config = BUNDLE(
exe_target,
name='FreeTex.app',
icon='assets/app_icon.icns',
bundle_identifier='com.example.freetex',
info_plist={
'NSHighResolutionCapable': 'True',
'CFBundleShortVersionString': '1.2.0',
},
codesign_identity='Developer ID Application: Your Name (TEAMID)',
entitlements_file='config/entitlements.plist'
)
빌드가 완료되면 codesign 유틸리티를 사용하여 서명 상태와 상세 정보를 검증합니다.
codesign --display --verbose=4 build/output/FreeTex.app
배포 패키지(DMG) 서명
macOS의 Gatekeeper는 이중 보안 검증을 수행합니다. 앱 바이너리 자체의 서명뿐만 아니라, 이를 감싸고 있는 배포 패키지(DMG)에도 서명이 필요합니다.
다음 명령어를 사용하여 DMG 파일에 서명과 타임스탬프를 적용합니다. 공증을 위해서는 Hardened Runtime 옵션이 필수적입니다.
codesign --sign "Developer ID Application: Your Name (TEAMID)" \
--options runtime \
--force \
--timestamp \
./release/FreeTex-Installer.dmg
Apple 공증(Notarization) 및 티켓 스테이플링
코드 서명은 개발자의 신원을 보증하지만, 애플리케이션 내부의 악성코드 존재 여부를 증명하지는 않습니다. 이를 위해 Apple의 공증 서비스를 통해 멀웨어 검사를 수행하고 안전성 인증을 받아야 합니다.
공증을 제출하려면 Apple ID 계정 설정에서 '앱 전용 암호(App-Specific Password)'를 미리 생성해야 합니다. 이후 notarytool을 사용하여 DMG 파일을 Apple 서버에 업로드합니다. 보안을 위해 키체인에 저장된 암호를 참조하는 방식을 권장합니다.
xcrun notarytool submit ./release/FreeTex-Installer.dmg \
--apple-id "developer@example.com" \
--team-id "YOUR_TEAM_ID" \
--password "@keychain:AC_PASSWORD" \
--wait
공증이 성공적으로 완료되면, 오프라인 환경에서도 Gatekeeper가 검증할 수 있도록 공증 티켓을 DMG 파일에 물리적으로 결합(Stapling)해야 합니다.
xcrun stapler staple ./release/FreeTex-Installer.dmg
스테이플링까지 완료된 패키지는 Homebrew Cask_formula에 PR을 제출하여 공식 저장소에 안전하게 병합할 수 있는 모든 보안 요구사항을 충족하게 됩니다.