-
Code Signing & Provisioning Profile 총정리: 하나의 앱을 여러 팀원과 공유하기이해를 위한 기록들 2024. 10. 21. 21:37
팀원들과 어떻게 하나의 앱으로 공유하죠?
Q. 왜 제 핸드폰에 앱이 빌드가 되지 않는건가요?
Q. 팀원 Xcode에 로그인했는데 왜 핸드폰에 빌드가 되지 않는걸까요?
위와 같은 질문은 애플생태계에서 개발을 하다보면 자연스럽게 경험하게 되는 부분입니다. 위 질문에 답하기 위해서는 애플이 앱을 실행시키기 위해 만든 보안에 대해 이해가 필요합니다. 이해를 하려고 미루고 미루다, 아카데미에서 진행하는 출석 체크 앱의 유지보수를 위해 이번에 깊게 이해해보려 했습니다.앱을 실행시키려면
앱은 앱스토어에서 다운받을 수 있고, 그 앱은 애플이 발급한 인증서(Certificate)를 통한 코드 서명(Code Signing)이 되어야 실행이 될 수 있습니다. 코드 서명(Code Signing)이란, 앱에 서명을 한 이후 변경이 되지 않았다는 것을 보장하기 위한 장치입니다. 시뮬레이터에서 개발을 하면 이런 서명은 필요없지만, 개발을 하다보면 시뮬레이터가 아닌 실제 기기에서 실행이 필요한 경우가 있습니다. 이런 경우에는 어떻게 실행을 해야 할까요?
애플은 Apple Developer Program에 가입한 개발자가 이 인증서(Certificate)를 발급하고 코드서명을 할 수 있는 방법을 제공해줍니다. 코드 서명을 통해 만들어진 Provisioning Profile을 통해 실행된 앱의 ID, Entitlements, 등록기기, 등을 비교하여 서명된 내용과 일치하는지 판단하고, 일치하는 경우 앱을 실행시키게 됩니다.
Q. 왜 제 핸드폰에 앱이 빌드가 되지 않는건가요?
Q. 팀원 Xcode에 로그인했는데 왜 핸드폰에 빌드가 되지 않는걸까요?
다시 위에 질문으로 넘어가면, 위에 질문은 모두 코드 서명에 문제가 발생했기 때문에 실행이 되지 않는 것이라고 말할 수 있습니다. 뒤에 나오는 내용은 이 코드서명이 어떤 방식으로 이루어지는지, 그리고 하나의 계정을 다른 팀원들과 공유하기 위해서는 어떻게 Provisioning Profile을 공유할 수 있는지 다루게 됩니다.iOS Code Signing
코드서명(Code Signing)은 iOS 기기에 설치된 앱에 대해 누가 이 앱을 서명했고, 그 이후 변경되지 않았다는 것을 증명하기 위해 사용하는 과정입니다. 애플은 앱이 보증된 개발자에 의해 실행되게 하기 위해 Code Signing과 Provisioning Profile을 통한 비교를 통해 안전성을 검증합니다.
iOS 앱을 Signing하기 위해 필요한 요소
Code Signing을 하기 위해서는 아래 4가지 요소가 필요합니다. 아래 각 단계에서는 어떻게 각 요소를 얻을 수 있는지에 대한 프로세스를 확인할 수 있습니다.
- CSR(Certificate Signing Request)
CSR은 Keychain Access Application을 통해 만들 수 있습니다. Keychain Access Application은 private key와 certSigningRequest 파일을 생성합니다.
Certificate Signing Request(CSR)은 Certificate Authority Apple에서 디지털 인증서를 생성하여 Apple이 개발자의 모든 세부 정보와 데이터가 올바른지 확인할 수 있도록 하는 프로세스입니다. - Apple Certificates
개발자의 신원을 애플에 인증하는 것이 Apple Certificate입니다. Certificate는 public key를 포함합니다. - Provisioning Profile
위에 CSR, Certificate를 묶어서 앱에서 동작할 수 있도록 하는 것이 Provisioning Profile입니다. Provisioning Profile은 Bundle Identifier를 지정해서 어떤 앱이 certificate를 가지고 있는지 판단해줍니다. 그래서 provisioning profile은 App Id, Bundle ID, device ID(or list)와 certificates를 가지게 됩니다. - Bundle Identifier
- Bundle Identifier는 string값으로, 나라, 개발자, 프로젝트와 같은 데이터로 어플리케이션을 구분할 수 있게 합니다.
- ex)
kr.austin.wuxiameditation
- ex)
- 이론적으로는, 같은 Bundle Identifier를 여러 개발자들이 사용할 수 있어서 code signing이 끝나면 앞에 prefix가 붙어서
ASDFGH1234.kr.austin.wuxiameditation
와 같은 형태가 됩니다.
- Bundle Identifier는 string값으로, 나라, 개발자, 프로젝트와 같은 데이터로 어플리케이션을 구분할 수 있게 합니다.
Code Signing Process
출처 https://medium.com/ios-os-x-development/ios-code-signing-provisioning-in-a-nutshell-d5b247760bef 1. Xcode가 설치되면 Keychain access에 Intermediate Certificate 란 인증서가 저장됩니다.
(이 과정은 보통 자동적으로 되므로 개발자가 신경쓰지 않아도 됩니다.)
2. Keychain access에서 Certificate Signing Request (CSR)을 생성합니다.아래 과정을 통해 Signing에 필요한 private key와 certSigningRequest를 생성합니다.
a. Keychain Access앱을 실행합니다.
b. 상단 Keychain Access - Certificate Assistant - Request a Certificate From a Certificate Authority를 클릭합니다(한국어로는 아래와 같습니다.
c. Enter information(인증서 정보) 입력
- User Email Address: email for identify the certificate, Certificate를 만들기 위한 이메일을 작성합니다.- Common Name: 본인 이름
- Request → Save to disk(디스크에 저장됨)
d. 하드드라이브에 파일 저장(ex, Desktop)
위에 과정을 통해 저장된 것이 CSR이고, CSR이 만들어질 때 Private Key가 같이 생성되며, Keychain 에 저장됩니다. 이 private key는 이후 developer 사이트(Member Center)에서 발급 받을 Certificate에 있는 public key와 쌍을 이루며 code signing을 하는데 사용됩니다.
3. CSR로 Certificate 생성a. Developer Console 접속합니다.
https://developer.apple.comb. Certificates, Identifiers & Profiles 파일 클릭합니다.
c. Certificates에서 +버튼을 클릭합니다.
d. iOS Distribution (App Store and Ad Hoc)클릭합니다. → 프로비저닝 유형에 따라 선택합니다.
e. Create a New Certificate 파트에서 로컬에서 생성했던 CSR을 올린다.
CSR이 Member Center에 업로드됩니다.
f. 완성된 Certificate를 다운받는다. (.cer 파일)
애플 인증 서버가 확인 후에 Certificate를 발행합니다.
4. 다운받은 Certificate 파일을 더블클릭 후, Keychain Access에 저장합니다.
Certificate 는 Keychain에 저장된 후, private key와 쌍을 이루어 Code Signing Identity를 형성합니다.
5. Provisioning Profile이 Certificate와 App Id, Device Identifiers(UDID)들 를 가지고 Xcode에 의해 생성됩니다.
6. Xcode는 앱을 서명하고, Provisioning Profiles을 빌드하기 원하는 기기에 전송합니다.
7. iOS 기기는 해당 Provisiong Profile이 앱의 서명에 사용된 Certificate를 포함하는 지 확인하고, 기기의 UDID와 App ID도 맞는 지 확인한 후에 설치를 허용합니다.
8. 앱이 실행됩니다.Distribution Certificate 공유하기
기본적으로는 위에 프로세스는 Xcode에 있는 Automatically manage signing을 클릭하게 되면 Xcode에서 자동으로 distribution provisioning profile을 생성하여 빌드를 할 수 있게 하기 때문에 위 프로세스를 앱을 만들 때마다 하지 않아도 되었습니다.
distribution provisioning profile
A distribution provisioning profile is a provisioning profile that authorizes your app to use certain app services and ensures that you are a known developer distributing or uploading your app. A distribution provisioning profile contains a single App ID that matches one or more of your apps and a distribution certificate. You configure the App ID indirectly through Xcode to use certain app services. Xcode enables and configures app services by setting entitlements and performing other configuration steps. Some entitlements are enabled for an App ID (stored in your developer account) and others are set in the Xcode project. When you export or upload your app, Xcode signs the app bundle with the distribution certificate referenced in the distribution provisioning profile.하지만 아티클 초반에 다뤘던 것처럼 다른 팀원들과 코드 서명을 공유하는 경우에는 이렇게 만든 code signging을 공유해야 합니다. 아래는 code signing을 공유하기 위한 프로세스입니다.
Synchronizing your code signing identities with Apple Developer Portal | Apple Developer Documentation
Ensure you and other team members can sign your organization’s code and installer packages in Xcode.
developer.apple.com
- Keychain Access에서 Certificate를 선택해서 우클릭, Export를 합니다.
- Export 관련 윈도우에서 FileFormat을 만드시 “Personal Information Exchange(.p12)”로 설정 후 save 버튼을 클릭합니다.
password는 비워두고 Ok를 클릭해도 되지만, private key를 공유하기 때문에 암호를 설정하고 air drop으로 공유합니다. - Computer Password 요청 시 Password 입력하면 공유가 완료됩니다.
Details of Provisioning Profile디바이스에서 앱을 실행하기 위해서는 내 디바이스가 개발자를 신뢰할 수 있는지를 알아야 앱 설치를 허락할지 말지를 결정할 수 있는데, 이 결정을 도와주는 파일이 프로비저닝 프로파일입니다. 작동하게 하고 싶은 기기에는 반드시 Provisioning Profile이 설치되어야 합니다.
- Provisioning profile은 xcode에서도 만들 수 있고, Member Center에서 만들 수 있습니다.
- Provisioning profile은 iOS 디바이스들을 Apple Certificate와 연결하는 역할을 하고, 이 결과로 만들어진 *.mobileprovision 파일이 iOS 앱을 컴파일하는 과정에서 사용되고 앱을 테스트하려는 디바이스에 설치되어야 합니다.(Xcode나 Apple Developer Program에서 생성 가능)
- iOS 기기는 설치된 Provisiong Profile 이 앱의 서명에 사용된 Certificate를 포함하는 지 확인하고(앱이 컴파일 된 후 프로비저닝 프로파일 안에 있는 인증서의 개인 키로 서명되는데, 인증서의 개인 키가 프로비저닝 프로파일에있는 인증서의 공개 키와 일치하는지 확인하는 것), 기기의 UDID와 App ID도 맞는 지 확인한 후에 설치를 허용합니다.
프로비저닝 프로필에 포함된 내용
프로비저닝 프로파일은 빌드된 앱(.ipa 파일) 내부에서 확인 가능합니다. .ipa 파일의 압축을 풀면 Payload 디렉터리 안에 embedded.mobileprovision란 이름의 파일 (예: Payload/sample.app/embedded.mobileprovision)에 프로비저닝 프로파일이 있습니다.
- App ID
- explicit App ID is used for a single app. the explicit App ID contains the full path of a bundle ID.
- wildcard App ID is use for a set of apps. the wildcard App Id contains an asterisk as the last part of its bundle ID search string
- Register an App ID - Manage identifiers - Account - Help - Apple Developer
- 푸시 알림, Passbook, HealthKit, CloudKit 등과 같이 앱에서 사용할 수있는 특별한 Entitlements (권한/자격)
- 앱 실행이 허용 된 기기의 UDID 목록(AD hoc 프로파일에만 포함됨, Enterprise profile은 기기제한 X)
- Apple에서 발급 한 배포 인증서 (certificate)
프로비저닝 프로필의 유형
목적에 따라 다른 유형의 프로비저닝 프로파일을 사용합니다. (Development, Ad-Hoc, App Store, Enterprise)
Development provisioning profiles
- 단 하나의 기기에서 앱을 테스트하기 위한 것. 즉, 실제 디바이스를 연결 후 Xcode 돌려서 테스트하고 싶을 때 사용
- Development Signing Certificates로만 생성 가능
- 개별 개발자에게 할당되며 이들을 식별하는 데 사용 됨
- 개발 및 디버그 빌드 시에 사용
- Simulator에서 기기를 돌리고 싶을 때는 code signing이 필요하지 않다. 위 development provisioning profile은 실기기에서 테스트를 하고 싶은 경우에 필요하다.
Distribution provisioning profiles
베타 테스터나 앱 스토어에 앱을 제출하려는 경우에 사용. 즉, Xcode 외의 장소에서 애플리케이션을 배포하는 경우
- App Store / Ad Hoc / Enterprise (in house) 배포가 포함됨
- Distribution Certificates 사용
Ad-Hoc
- Development provisioning profile과 유사하지만 QA 테스터에게 배포하는 데 사용
- 특정 iOS 테스트 장치의 소규모 그룹에서 응용 프로그램을 테스트하는 실용적인 방법
- 푸시 알림과 같은 다양한 권한 부여 서비스를 테스트하려는 경우에는 개발 프로파일로는 테스트 불가
- Ad-Hoc provisioning profile은 Production (Ad-Hoc) Certificates로만 생성 가능
- 자세한 내용은 애플의 ad hoc provisioning profile 문서 참고
Enterprise
- Ad-Hoc provisioning profile과 유사하지만 몇 가지 중요한 차이점 존재
- 회사가 Apple iOS 개발자 엔터프라이즈 프로그램 ($ 299 USD / 년)에 가입해야 얻을 수 있음
- UDID 목록이 필요하지 않음. 모든 장치에서 앱을 실행 가능. 따라서 기업은 장치 수에 제한없이 사내 앱을 유연하게 설치할 수 있음.
- 이때 개발자에게 개발자가 정말로 애플인것처럼 개발한 앱들을 서명할 수 있는 인증서를 발급해주기 때문에 이 인증서로 서명된 앱들은 따로 확인을 거치지 않고, 모든 디바이스를 애플에 등록하지 않고도 개발된 앱을 디바이스에서 바로 실행할 수 있도록 해줌
App Store
- Apple App Store에 애플리케이션을 제출할 때 사용하려는 프로파일
- 앱이 QA를 통과하고 완전히 테스트 된 후에 사용
- 빌드된 앱이 어떤 디바이스에서도 실행이 되지 않도록 함. 즉, 앱스토어 제출 용도 말고는 어디에서도 쓸 수가 없음
- Apple은 앱이 App Store 프로비저닝 프로파일로 빌드되지 않은 경우 앱 제출을 허용하지 않음
- Apple이 앱을 App Store에 배포하도록 승인하면 자체 서명 인증서 및 프로필을 사용하여 애플리케이션에 다시 서명 함. 따라서 모든 iOS 디바이스에서 실행될 수 있도록 해줌
- 자세한 내용은 애플의 distribution provisioning profile 문서 참고
그래서 어떻게 공유하나요?
적다보니 내용이 길어지게 되었네요, 기존에 다른 아티클에서 많이 참고한것이라서 다른 아티클도 읽어보시면 더 이해가 쉬울 것 같습니다. 여기 정리한 내용으로 공유를 하는 프로세스는 다음과 같습니다.
- KeyChain에서 CSR을 생성한다.
- Member Center에서 CSR로 Certificate를 생성한다.
- Member Center에서 Bundle Identifier와 Device 목록에 기기를 추가한다(아래 사진 참고)
- 위에 Identifier와 Device 목록, Certificate로 Provisioning Profile을 생성후 다운받아서 팀원에게 공유한다.
- .p12파일을 팀원에게 공유한다.
- 받은 팀원은 둘다 더블클릭 후, Xcode에서 해당 provisioning Profile을 선택하면 끝(Xcode를 재실행, Clean build가 필요할 수 있습니다)!
휴!
어떻게 정리는 했지만, 이해는 쉽지 않았던 것 같습니다. 다음에는 조금 더 내용을 읽히기 쉽고 먹을 수 있게 조려서 써봐야겠습니다. 부족한 부분이나 수정되어야 하는 내용이 있다면 피드백 부탁드립니다 :)
Reference
https://medium.com/ios-os-x-development/ios-code-signing-provisioning-in-a-nutshell-d5b247760bef
iOS Code Signing & Provisioning in a Nutshell
I am developing Apps for more than 3 years now and 1 thing that still annoys me is Code Signing and Provisioning in iOS. What are Signing…
medium.com
https://developer.apple.com/help/account/manage-profiles/create-a-development-provisioning-profile/
Create a development provisioning profile - Manage profiles - Account - Help - Apple Developer
developer.apple.com
https://github.com/sujinnaljin/TIL/blob/master/Swift/Provisioning%20profile.md
TIL/Swift/Provisioning profile.md at master · sujinnaljin/TIL
Today I Learned. Contribute to sujinnaljin/TIL development by creating an account on GitHub.
github.com
[iOS] Provisioning profile이란 & ipa에서 까보기
프로비저닝 프로파일(Provisioning profile)
sujinnaljin.medium.com
'이해를 위한 기록들' 카테고리의 다른 글
Firebase Cloud Function 설정(V2 함수 사용하여 세팅하기) (0) 2025.02.25 'Instrument' 처음 시작하기: Instrument 기초와 기본 활용 (2) 2024.11.01 WeatherKit Attribution 이슈: Guideline 5.2.5 - Legal - Intellectual Property (3) 2024.10.05 함수형 프로그래밍 (0) 2023.01.15 Skeleton UI 적용기 (0) 2023.01.11 - CSR(Certificate Signing Request)