macOS 앱 노터라이즈(Notarize) 및 실행 불가 문제 해결 과정

1. 문제 개요

macOS에서 포스트잇 플레인 텍스트 앱인 StickyPlainPad을 테스트하는 중, 특정 테스트 파일 “다음으로 열기…”를 통해 실행했을 때 다음과 같은 문제가 발생하였습니다.

  • 앱이 열리지 않음
  • 보안 경고 메시지: “Mac에 손상을 입힐 수 있음” 또는 “확인되지 않은 개발자가 배포함”

이 문제는 macOS의 보안 정책에 따라, 적절한 서명과 애플의 노터라이즈(Notarize) 절차를 거치지 않은 앱에 대해 시스템이 실행을 제한하기 때문입니다.

노터라이즈(Notarize)란?
Apple이 앱을 자동으로 검사하여 악성 코드가 없는지 확인한 후 서명된 티켓(ticket)을 부여하는 절차입니다. App Store 외부에서 배포되는 앱에도 이 검증을 적용함으로써 사용자 보안을 강화합니다.

 

2. 파일 열기 기능 구현 (일부)

앱을 사용하여 특정 확장자의 파일을 열 수 있도록 구현하였습니다.

  • Info.plist 설정
<key>CFBundleDocumentTypes</key>
<array>
  <dict>
    <key>CFBundleTypeName</key>
    <string>Plain Text</string>
    <key>LSHandlerRank</key>
    <string>Alternate</string>
    <key>LSItemContentTypes</key>
    <array>
      <string>public.plain-text</string>
    </array>
  </dict>
</array>
  • AppDelegate 또는 SwiftUI App에서 URL 열기 처리
func application(_ application: NSApplication, open urls: [URL]) {
  // 파일 처리 로직
}

3. 앱 서명 및 보안 경고 해결

앱이 정상적으로 실행되기 위해서는 Apple Developer ID 인증서로 서명되어야 하며, 보안 설정도 적절히 구성되어야 합니다.

선행 조건
  • 릴리즈 빌드로 앱을 먼저 생성해야 합니다. (Debug도 되긴 합니다.) Xcode에서 Product > Archive 또는 Release 설정으로 빌드하세요.

  • 빌드된 .app 파일에 다음과 같이 수동 서명을 적용합니다: (터미널에서 입력)
codesign --deep --force --options runtime 
  --sign "Developer ID Application: Your Name (TEAMID)" 
  --timestamp 
  /경로/AppName.app

 

각 옵션의 의미 및 필요성
  • --deep: 앱 번들 내의 모든 바이너리 및 포함된 프레임워크에도 서명을 적용합니다. 앱 내부에 포함된 helper, dylib 등이 누락되지 않도록 필수입니다.
  • --options runtime: Apple의 Hardened Runtime을 활성화합니다. 이는 메모리 보호, 코드 주입 방지 등을 통해 실행 중 보안을 강화하는 기능입니다. 노터라이즈 필수 조건입니다.
  • --timestamp: 서명 시점 정보를 애플에서 제공하는 보안 서버에서 받아 포함시킵니다. 이 정보를 통해 서명이 유효한 시점에 생성되었는지를 Apple이 확인할 수 있습니다.

 

Developer ID 인증서 이름 확인 명령어
security find-identity -p codesigning -v

출력되는 항목 중 다음과 같은 형식을 찾습니다:

1) 59E75XXXXXXX "Developer ID Application: Your Name (TEAMID)"

쌍따옴표 문자열을 --sign 값으로 사용하세요.

🔗 Apple 개발자 인증서 설정 참고: Certificates, Identifiers & Profiles

 

4. 앱 노터라이즈(Notarize) 처리

1단계: zip 압축

앱을 제출하기 전에 .app 파일을 .zip으로 압축합니다:

cd /앱_폴더_경로
zip -r StickyPlainPad.zip StickyPlainPad.app

 

(옵션) 2단계: App Store Connect API Key 생성 (API를 사용하는 경우)

Apple ID 대신 인증 키를 사용하는 방법은 더욱 안정적입니다.

  1. App Store Connect > Users and Access
  2. Keys 탭 선택 > + 버튼 클릭
  3. 이름: 예) NotaryTool Key
  4. 권한: “Developer” 이상 권한 필요
  5. 생성된 키 다운로드 (AuthKey_XXXXXX.p8) → 발급받은 Key ID, Issuer ID 기록

이 경우 notarytool 제출시 다음과 같이 제출

xcrun notarytool submit /경로/StickyPlainPad.zip \ --keychain-profile "notary-profile" \ --wait

 

3단계: notarytool로 제출 (개인 개발자 아이디 및 App Specified Key 사용)
xcrun notarytool submit StickyPlainPad.zip 
  --apple-id your@appleid.com 
  --password "xxxx-xxxx-xxxx-xxxx" 
  --team-id TEAMID 
  --wait

--password에 들어가는 값은 App-Specific Password입니다. 생성 방법:

  1. 애플 ID 계정 설정 → 로그인
  2. “앱 암호” 섹션 → “앱 암호 생성” 클릭
  3. 이름 예: Notarize 입력 후 생성 → 생성된 16자리 키를 위 명령어에 사용

결과 화면이 Accept로 나오면 성공한 것이고, Invalid로 나온 경우 실패한 것입니다.

Waiting for processing to complete.
Current status: Accepted........
Processing complete
  id: ㅁㅁㅁㅁㅁㅁㅁㅁㅁ
  status: Accepted

Invalid인 경우 문제 원인 애플 문서에서 확인합니다.

 

5. 최종 확인 및 동작 테스트

1) Staple 작업 (서명 티켓 부착) – 
xcrun stapler staple /경로/StickyPlainPad.app

Screenshot

2) 실행 테스트
  • .app 파일을 직접 실행
  • .txt 파일 우클릭 → “다음으로 열기…” → StickyPlainPad 선택

정상 실행된다면 모든 과정이 성공적으로 완료된 것입니다.

 

이 과정을 통해 “Mac에 손상을 입힐 수 있음” 등의 경고 없이 앱이 정상적으로 작동하며, 외부 사용자에게도 안전하게 배포할 수 있습니다.

 


 🤖 이 포스트는 ChatGPT, Grok 등의 생성형 AI의 도움을 받아 작성되었습니다. 🤖