Apple 생태계에서 iOS 앱을 개발하고 배포하는 과정은 강력한 보안과 안정성을 기반으로 합니다. 그 중심에는 '코드 서명(Code Signing)'이라는 복잡하지만 필수적인 절차가 자리 잡고 있습니다. 이 과정에서 많은 개발자들이 한 번쯤은 'a valid provisioning profile for this executable was not found'라는 붉은색 에러 메시지를 마주하며 좌절감을 느끼곤 합니다. 이 오류는 단순한 오타 하나에서부터 인증서 체인의 손상에 이르기까지 매우 다양한 원인으로 발생할 수 있기 때문에, 문제 해결을 위해서는 그 기저에 깔린 원리를 체계적으로 이해하는 것이 무엇보다 중요합니다.
이 글은 단순히 에러를 해결하기 위한 임시방편적인 체크리스트를 제공하는 것을 넘어, 코드 서명과 프로비저닝의 핵심 구성 요소들을 깊이 있게 파고들어 문제의 근본 원인을 진단하고 해결할 수 있는 능력을 기르는 데 목표를 둡니다. 인증서, 식별자, 디바이스, 그리고 이 모든 것을 엮어주는 프로비저닝 프로파일의 관계를 명확히 이해함으로써, 우리는 더 이상 이 오류 앞에서 당황하지 않고 자신감 있게 대처할 수 있게 될 것입니다.
1. 문제의 핵심: 코드 서명과 프로비저닝의 작동 원리
오류 메시지를 해결하기에 앞서, Apple이 왜 이토록 복잡해 보이는 시스템을 구축했는지 이해해야 합니다. 코드 서명의 목적은 크게 세 가지입니다: 신원 확인(Authentication), 무결성 보장(Integrity), 그리고 권한 부여(Authorization).
- 신원 확인: 이 앱이 정말로 당신(혹은 당신의 팀)이 만들었음을 Apple과 사용자에게 증명합니다. 악의적인 개발자가 당신의 앱을 사칭하는 것을 방지합니다.
- 무결성 보장: 앱이 당신의 손을 떠나 App Store를 거쳐 사용자 기기에 설치되기까지 단 한 비트도 변경되지 않았음을 보장합니다. 중간에 악성 코드가 삽입되는 것을 막습니다.
- 권한 부여: 이 앱이 특정 기기에서 실행될 수 있는지, 그리고 Push 알림, iCloud 동기화, Apple Pay와 같은 특정 서비스를 사용할 수 있는 권한이 있는지를 결정합니다.
'a valid provisioning profile...' 오류는 바로 이 세 번째, '권한 부여' 과정에서 문제가 발생했음을 알리는 신호입니다. Xcode가 앱을 빌드하고 기기에 설치하려 할 때, "이 실행 파일(executable)을 이 특정 기기에서 실행할 수 있도록 허가하는 유효한 여권(provisioning profile)을 찾을 수 없습니다"라고 말하는 것과 같습니다. 이 '여권'이 바로 프로비저닝 프로파일이며, 다음과 같은 핵심 요소들로 구성됩니다.
1.1. 코드 서명의 4대 구성 요소
프로비저닝 프로파일은 독립적으로 존재하지 않습니다. 여러 구성 요소들이 사슬처럼 엮여 하나의 신뢰 체인을 형성합니다. 이 중 하나라도 잘못되면 전체 시스템이 무너집니다.
A. 인증서 (Certificates)
인증서는 '당신이 누구인지'를 증명하는 디지털 신분증입니다. 개발자의 신원을 확인하는 공개-개인 키 쌍으로 이루어져 있습니다. Mac의 '키체인 접근(Keychain Access)' 앱에 저장된 개인 키(Private Key)와 Apple Developer Portal에 등록된 공개 키(Public Key)가 한 쌍을 이룹니다. 이 개인 키가 없으면, 인증서는 무용지물입니다. 이것이 바로 다른 컴퓨터에서 개발 환경을 설정할 때 .p12
파일(인증서 + 개인 키)을 내보내고 가져오는 이유입니다.
- Development Certificate (개발용 인증서): 개발 및 테스트 단계에서 신뢰할 수 있는 개발자가 소유한 기기에 앱을 설치할 수 있도록 허용합니다.
- Distribution Certificate (배포용 인증서): Ad Hoc 테스트(내부 테스터용) 또는 App Store에 최종 앱을 제출할 때 사용됩니다.
B. 앱 ID (App Identifiers)
앱 ID는 당신의 애플리케이션을 Apple 생태계 내에서 고유하게 식별하는 문자열입니다. 프로젝트의 Bundle Identifier와 직접적으로 연결됩니다. 두 가지 종류가 있습니다.
- Explicit App ID (명시적 앱 ID):
com.company.appname
과 같이 앱의 Bundle Identifier와 정확히 일치합니다. Push 알림, In-App Purchase, HealthKit 등 특정 앱 서비스(Capabilities)를 사용하려면 반드시 명시적 앱 ID를 사용해야 합니다. - Wildcard App ID (와일드카드 앱 ID):
com.company.*
와 같이 여러 앱에 두루 사용할 수 있습니다. 간단한 앱이나 여러 앱에 공통된 프로파일을 적용할 때 유용하지만, 대부분의 고급 앱 서비스를 지원하지 않습니다.
많은 경우, 개발자가 앱에 새로운 기능을 추가하고(예: Push 알림) 앱 ID 설정을 업데이트하지 않아 프로비저닝 오류가 발생합니다.
C. 디바이스 (Devices)
개발 및 Ad Hoc 배포 단계에서는 앱을 설치할 모든 기기의 고유 식별자(UDID, Unique Device Identifier)를 Apple Developer Portal에 등록해야 합니다. 이는 승인되지 않은 기기에서 테스트 빌드가 무분별하게 실행되는 것을 방지하기 위함입니다. 사용자의 iPhone이나 iPad를 Mac에 연결하고 Xcode의 'Devices and Simulators' 창(Window > Devices and Simulators
또는 단축키 Shift+Cmd+2
)을 통해 40자의 UDID를 확인할 수 있습니다.
D. 프로비저닝 프로파일 (Provisioning Profiles)
이것이 바로 모든 것을 하나로 묶는 접착제입니다. 프로비저닝 프로파일은 특정 앱 ID를 가진 앱을, 특정 인증서로 서명하여, 특정 디바이스 목록에서 실행할 수 있도록 허가하는 디지털 문서(.mobileprovision
파일)입니다. 프로파일의 종류는 목적에 따라 나뉩니다.
- iOS App Development: 개발 중에 등록된 기기에서 앱을 실행하고 디버깅하는 데 사용됩니다.
- Ad Hoc: 등록된 기기를 가진 내부 테스터들에게 앱을 배포할 때 사용됩니다. App Store를 거치지 않습니다.
- App Store: 최종 앱을 App Store에 제출하기 위해 사용됩니다. 특정 기기 목록을 포함하지 않습니다.
- Enterprise (In-House): Apple Developer Enterprise Program에 가입한 경우, 회사 내부 직원들에게 앱을 배포할 때 사용됩니다.
결론적으로, 'a valid provisioning profile...' 오류는 Xcode가 현재 빌드하려는 설정(앱 ID, 빌드 구성)과 연결된 기기에 대해, 유효한 [인증서 + 앱 ID + 디바이스] 조합을 담고 있는 프로비저닝 프로파일을 찾지 못했다는 의미입니다.
2. 체계적인 문제 해결 절차
이제 이론적 배경을 이해했으니, 실제 문제를 해결하는 단계로 넘어가겠습니다. 가장 간단하고 자동화된 방법부터 시작하여 점차 심층적인 수동 검사로 나아가는 것이 효율적입니다.
2.1. 1단계: Xcode의 자동 서명 기능 활용 (Automatically Manage Signing)
대부분의 간단한 시나리오에서 Xcode는 코드 서명 과정을 훌륭하게 자동화합니다. 이것이 가장 먼저 시도해야 할 방법입니다.
- Xcode 프로젝트를 열고, 프로젝트 네비게이터에서 최상단 프로젝트 파일을 선택합니다.
- 중앙 에디터 영역에서 앱 타겟(Target)을 선택합니다.
- 'Signing & Capabilities' 탭으로 이동합니다.
- 'Automatically manage signing' 체크박스가 선택되어 있는지 확인합니다. 만약 해제되어 있다면, 체크합니다.
- 'Team' 드롭다운 메뉴에서 올바른 개발자 팀이 선택되었는지 확인합니다.
이 기능을 활성화하면, Xcode는 선택된 팀 계정으로 Apple Developer Portal에 접속하여 현재 Bundle Identifier에 맞는 프로비저닝 프로파일과 서명 인증서를 자동으로 생성하거나 다운로드하여 적용하려고 시도합니다. 이 과정에서 Xcode가 문제를 발견하면, 종종 노란색 경고 아이콘과 함께 해결책을 제시하기도 합니다(예: "Register this device").
만약 이 기능이 활성화되어 있음에도 오류가 발생한다면, Xcode가 자동화 과정에서 무언가에 가로막혔다는 의미입니다. 이제 수동으로 문제를 찾아 나서야 할 때입니다.
2.2. 2단계: 핵심 구성 요소 수동 검증
자동 서명이 실패했다면, 프로비저닝 체인의 어딘가에 끊어진 연결 고리가 있다는 뜻입니다. 다음 항목들을 순서대로 꼼꼼히 점검해야 합니다.
A. Bundle Identifier와 App ID의 일치 여부 확인
가장 흔한 실수 중 하나입니다.
- Xcode의 타겟 설정 > 'General' 탭에서 'Bundle Identifier'를 확인하고 정확히 복사합니다. (예:
com.mycompany.coolapp
) - Apple Developer Portal에 로그인하여 'Certificates, Identifiers & Profiles' > 'Identifiers'로 이동합니다.
- 등록된 App ID 목록에서 Xcode의 Bundle Identifier와 일치하는 항목이 있는지 확인합니다.
- 일치하는 항목이 없다면? 이것이 문제의 원인일 수 있습니다. '+' 버튼을 눌러 새로운 App ID를 생성해야 합니다.
- 와일드카드 ID를 사용 중이라면? (예:
com.mycompany.*
) 앱에서 Push 알림, HealthKit 등 특별한 Capability를 사용하고 있는지 확인하세요. 만약 그렇다면, 와일드카드 ID로는 부족하므로 명시적(Explicit) App ID를 새로 생성해야 합니다. - 일치하는 명시적 App ID가 있다면? 해당 ID를 클릭하여 상세 페이지로 들어가세요. 'Capabilities' 탭에서 당신의 앱이 필요로 하는 모든 서비스(예: Push Notifications, Sign in with Apple)가 활성화되어 있는지 반드시 확인해야 합니다. 여기서 비활성화되어 있다면, Xcode 프로젝트에서도 해당 기능을 사용할 수 없습니다.
B. 테스트 기기의 UDID 등록 여부 확인
앱을 실행하려는 iPhone이나 iPad가 프로비저닝 프로파일에 포함되어 있는지 확인해야 합니다.
- Mac에 테스트 기기를 연결합니다.
- Xcode의 메뉴 바에서
Window > Devices and Simulators
(Shift+Cmd+2
)를 선택합니다. - 왼쪽 목록에서 연결된 기기를 선택하고, 'Identifier'라고 표시된 40자리 문자열(UDID)을 복사합니다.
- Apple Developer Portal의 'Devices' 섹션으로 이동합니다.
- 복사한 UDID가 목록에 등록되어 있는지 확인합니다. 한 글자라도 틀리면 안 됩니다. 없다면 '+' 버튼을 눌러 'Device Name'과 'Device ID (UDID)'를 입력하여 새로 등록합니다.
중요: 새로운 기기를 등록했다면, 이 기기를 포함하는 새로운 프로비저닝 프로파일을 다시 생성하고 다운로드해야만 변경사항이 적용됩니다. 기존 프로파일은 자동으로 업데이트되지 않습니다.
C. 인증서의 유효성 및 개인 키 존재 여부 확인
인증서가 만료되었거나, 서명에 필요한 개인 키가 로컬 Mac에 없는 경우 서명이 불가능합니다.
- Mac에서 '키체인 접근(Keychain Access)' 앱을 실행합니다.
- 왼쪽 상단 '키체인' 패널에서 '로그인(login)'을, 하단 '분류' 패널에서 '나의 인증서(My Certificates)'를 선택합니다.
Apple Development: [Your Name]
또는iPhone Developer: ...
와 같은 이름의 인증서를 찾습니다.- 만료일 확인: 인증서의 유효 기간이 지나지 않았는지 확인합니다. 만료되었다면 Developer Portal에서 새로 발급받아야 합니다.
- 개인 키 확인: 가장 중요한 부분입니다. 인증서 이름 옆에 회색 삼각형(▶)이 있는지 확인하고, 클릭해서 펼쳤을 때 해당 인증서와 이름이 같은 '개인 키(Private Key)'가 보이는지 확인해야 합니다.
▲ 인증서 아래에 개인 키가 중첩되어 표시되어야 합니다. 이것이 없다면 서명이 불가능합니다.
- 만약 개인 키가 보이지 않는다면, 현재 Mac에서는 해당 인증서를 사용하여 서명할 수 없습니다. 이 인증서를 처음 생성했던 Mac에서
.p12
파일(인증서+개인키)을 내보내기하여 현재 Mac으로 가져와야 합니다. 그것이 불가능하다면, Developer Portal에서 기존 인증서를 폐기(Revoke)하고 완전히 새로운 인증서를 생성하는 절차를 밟아야 합니다.
D. 프로비저닝 프로파일의 상태 및 내용 확인
모든 재료(앱 ID, 디바이스, 인증서)가 준비되었다면, 이들을 올바르게 담고 있는 프로파일이 있는지 확인해야 합니다.
- Apple Developer Portal의 'Profiles' 섹션으로 이동합니다.
- 프로젝트에 사용하려는 프로파일을 찾습니다. (예: 'iOS App Development' 타입)
- 상태(Status) 확인: 'Active' 상태인지 확인합니다. 'Invalid' (빨간색) 상태라면, 해당 프로파일과 연결된 인증서나 앱 ID에 변경사항이 생겼다는 의미입니다. 이 경우 프로파일을 편집(Edit)하고 다시 저장(Generate)하여 'Active'로 만들어야 합니다.
- 프로파일을 클릭하여 상세 정보를 확인합니다.
- App ID: 프로젝트의 Bundle Identifier와 일치하는 App ID가 선택되었는지 확인합니다.
- Certificates: 유효한 개발용 인증서(키체인에서 확인한)가 포함되어 있는지 확인합니다.
- Devices: 테스트하려는 기기가 목록에 포함되어 있는지 확인합니다.
- 모든 정보가 정확하다면, 프로파일을 'Download'하여 로컬에 저장합니다. 다운로드한
.mobileprovision
파일을 더블클릭하면 Xcode가 자동으로 인식하여 설치합니다. - 마지막으로 Xcode의 'Signing & Capabilities' 탭으로 돌아가, 'Automatically manage signing'을 잠시 해제하고 'Provisioning Profile' 드롭다운 메뉴에서 방금 다운로드하고 확인한 프로파일을 수동으로 지정해 봅니다. 여기서 해당 프로파일이 보이지 않거나 선택할 수 없다면, Xcode가 인식하는 프로젝트 설정과 프로파일의 내용이 일치하지 않는다는 명백한 증거입니다.
2.3. 3단계: "모두 지우고 새로 시작" (Nuke and Pave)
위의 모든 단계를 거쳤음에도 문제가 해결되지 않는다면, Xcode나 로컬 시스템에 캐시된 오래된 설정값이 문제를 일으키고 있을 가능성이 있습니다. 이럴 때는 과감하게 관련 데이터를 정리하고 처음부터 다시 설정하는 것이 효과적일 수 있습니다.
- Xcode 클린 빌드: Xcode 메뉴에서
Product > Clean Build Folder
를 실행합니다. (단축키:Shift+Cmd+K
) - Derived Data 삭제:
- Xcode 메뉴에서
File > Project Settings...
(또는Workspace Settings...
)를 선택합니다. - Derived Data 경로 옆의 회색 화살표를 클릭하여 Finder에서 해당 폴더를 엽니다.
- Xcode를 완전히 종료한 후, 이 'DerivedData' 폴더 안의 모든 내용을 삭제합니다. (폴더 자체를 삭제해도 무방합니다)
- Xcode 메뉴에서
- 로컬 프로비저닝 프로파일 삭제:
- Finder를 열고
Go > Go to Folder...
(Shift+Cmd+G
)를 선택합니다. ~/Library/MobileDevice/Provisioning Profiles
를 입력하고 이동합니다.- 이 폴더 안의 모든
.mobileprovision
파일들을 삭제합니다. 이 파일들은 Xcode가 서버로부터 다시 다운로드할 수 있으므로 안전합니다.
- Finder를 열고
- Xcode 계정 재설정:
- Xcode 메뉴에서
Preferences > Accounts
로 이동합니다. - 왼쪽 목록에서 Apple ID를 선택하고 하단의 '-' 버튼을 눌러 계정을 삭제합니다.
- Xcode를 재시작한 후, '+' 버튼을 눌러 Apple ID 계정을 다시 추가합니다.
- 계정을 다시 추가한 후, 'Download Manual Profiles' 버튼을 클릭하여 서버로부터 최신 프로파일들을 모두 다시 받아옵니다.
- Xcode 메뉴에서
- 프로젝트 재시작: 이제 프로젝트를 다시 열고, 'Signing & Capabilities' 탭에서 'Automatically manage signing'을 다시 체크하여 Xcode가 깨끗한 상태에서 모든 것을 새로 설정하도록 합니다.
이 "Nuke and Pave" 접근 방식은 다소 극단적으로 보일 수 있지만, 눈에 보이지 않는 꼬인 설정들을 해결하는 데 매우 효과적인 방법입니다.
3. 고급 시나리오 및 추가 팁
3.1. CI/CD 환경에서의 코드 서명
Jenkins, GitHub Actions, Bitrise와 같은 지속적 통합(CI) 서버에서 앱을 빌드할 때는 GUI 환경이 없기 때문에 코드 서명이 더욱 까다로워집니다. 이런 환경에서는 Fastlane과 같은 도구를 사용하는 것이 거의 표준처럼 여겨집니다.
- Fastlane Match:
match
는 모든 인증서와 프로비저닝 프로파일을 암호화된 비공개 Git 저장소에 저장하여 팀원 및 CI 서버와 안전하게 공유하는 도구입니다. CI 스크립트에서fastlane match appstore
와 같은 간단한 명령 한 줄로 필요한 모든 서명 자산을 가져와 설정할 수 있어, 수동 관리의 복잡성을 획기적으로 줄여줍니다.
3.2. 여러 Xcode 버전 사용 시 주의사항
베타 버전을 포함하여 여러 버전의 Xcode를 사용하는 경우, 각 Xcode 버전이 서명 자산을 다르게 관리하거나 인식할 수 있습니다. 특히 새로운 Xcode 버전은 새로운 서명 요구사항을 도입할 수 있습니다. xcode-select -s /Applications/Xcode.app/Contents/Developer
와 같은 명령줄 도구를 사용하여 현재 활성화된 Xcode 버전을 명확히 지정하는 것이 중요합니다.
3.3. 'Build Settings'의 상세 설정
'Signing & Capabilities' 탭은 사용하기 쉽게 추상화된 인터페이스입니다. 더 세부적인 제어가 필요하다면 'Build Settings' 탭에서 'Signing' 섹션을 직접 수정할 수 있습니다.
- Code Signing Identity: 어떤 인증서를 사용할지 직접 지정합니다. 'Apple Development' 또는 'Apple Distribution'과 같이 설정할 수 있습니다.
- Provisioning Profile: 사용할 프로비저닝 프로파일의 UUID를 직접 지정합니다.
Debug, Release 등 빌드 구성(Build Configuration)별로 다른 서명 설정을 적용할 수 있어, 예를 들어 Debug 빌드는 개발용 프로파일로, Release 빌드는 App Store용 프로파일로 서명하도록 정교하게 제어할 수 있습니다.
결론: 이해가 곧 해결의 열쇠
'a valid provisioning profile for this executable was not found' 오류는 iOS 개발자라면 누구나 마주칠 수 있는 통과 의례와도 같습니다. 이 오류를 마주했을 때, 무작정 인터넷 검색으로 찾은 해결책들을 순서 없이 시도하기보다는, 한 걸음 물러서서 코드 서명 시스템의 기본 원리를 떠올리는 것이 중요합니다.
인증서(누가), 앱 ID(무엇을), 디바이스(어디서), 그리고 이 세 가지를 연결하는 프로비저닝 프로파일(허가서). 이 네 가지 요소의 관계와 각각의 역할만 명확히 이해하고 있다면, 어떤 서명 관련 오류가 발생하더라도 체계적으로 원인을 추적하고 해결할 수 있는 능력을 갖추게 될 것입니다. 자동화된 도구에 의존하는 것도 좋지만, 그 이면의 작동 방식을 이해하는 것이야말로 진정한 문제 해결 능력의 핵심입니다.
0 개의 댓글:
Post a Comment