iOS 인증서와 프로비저닝 프로파일, Expo로 쉽게 관리하기
글: Mehdi Azizi
게시, 9분
인증서는 누가 앱에 서명했는지, 프로비저닝 프로파일은 어떤 앱이 어떤 iPhone에서 실행되는지 정해요. Expo를 쓰면 EAS가 둘 다 만들고 갱신해 줘요.
iOS 개발자 인증서는 누가 앱에 서명했는지 증명해요. 프로비저닝 프로파일(provisioning profile)은 이 인증서를 특정 앱과 연결하고, 그 앱이 어디서 실행될 수 있는지 정해요. Expo를 쓰면 이걸 직접 만들 일이 거의 없어요. 빌드를 실행하면 EAS가 알아서 만들고, 저장하고, 갱신해 줘요.
그래도 각 파일이 무슨 역할을 하는지 알아두면 도움이 돼요. 빌드가 설치되지 않거나 업로드가 막히는 날, 이 지식이 하루를 아껴 줘요. 이 글에서는 네 가지 요소와 각각의 유효 기간, Apple의 제한, 흔한 오류와 해결 방법을 하나씩 정리해요.
저는 Solys, TradaZen 같은 iOS 앱을 Expo와 EAS로 출시하고 있어요. 전체 과정은 Mac 없이 iOS 앱 출시하기에 있어요. 여기서는 서명의 내부를 들여다볼게요.
Apple이 서명을 요구하는 이유
iOS 앱은 서명이 있어야 iPhone에 설치하거나 App Store Connect로 보낼 수 있어요. 서명은 앱이 Apple이 아는 개발자에게서 왔고, 그 뒤로 아무도 수정하지 않았다는 걸 보장해요.
App Store의 경우 안심되는 부분이 하나 있어요. Apple 기술 노트 TN3161에 따르면, App Store는 업로드 시점에 배포 인증서가 유효한지 확인한 뒤 앱을 다시 서명해요. 그 뒤로 앱은 내 인증서의 만료일과 상관이 없어요. 그러니까 인증서는 앱의 수명 내내가 아니라 업로드하는 순간에만 유효하면 돼요.
알아야 할 네 가지 요소
Expo의 자격 증명 문서는 iOS에 세 가지를 꼽아요. 배포 인증서, 프로파일, 푸시 알림 키예요. 저는 여기에 App ID를 추가할게요. 이게 없으면 프로파일도 존재할 수 없거든요.
배포 인증서
개발자로서의 서명이에요. Apple의 인증서 도움말은 두 종류로 나눠요.
- Apple Development는 개발 중에 내 기기에서 앱을 실행할 때 써요. 개인에게 속해요.
- Apple Distribution은 지정된 테스트 기기에 배포하거나 App Store Connect로 보낼 때 써요. 팀에 속하고, 계정 소유자나 관리자만 만들 수 있어요.
배포 인증서는 특정 앱에 묶이지 않아요. 하나로 모든 앱에 서명해요. 개인 키와 짝을 이루는데, 실제로 서명을 가능하게 하는 건 이 개인 키예요. TN3161에 따르면 Apple 인증서는 보통 생성 시점부터 1년간 유효해요.
앱 식별자(App ID)
App ID는 프로파일 안에서 앱을 식별해요. 번들 식별자를 그대로 쓰는데, 예를 들면 com.example.myapp(가상의 예시) 같은 거예요. Apple 도움말에 따르면 허용된 기능 목록도 담고 있어요. 푸시 알림, App Groups, Sign in with Apple 같은 것들이요.
Expo에서는 설정의 ios.bundleIdentifier 필드예요. 한 번 정하면 바꾸지 마세요. 설정과 App Store Connect 등 모든 곳에서 똑같아야 해요. App ID는 만료되지 않아요. 그리고 iOS 기능에 관한 Expo 문서에 따르면, EAS가 빌드할 때마다 설정에 맞춰 기능을 동기화해 줘요.
프로비저닝 프로파일
프로파일은 연결 고리 역할을 해요. App ID 하나, 인증서 하나, 그리고 종류에 따라 허용된 기기 목록을 담아요. 알아야 할 종류는 세 가지예요.
- Development: 등록된 내 기기에서 돌리는 테스트 앱.
- Ad hoc: 정해진 기기 목록에만 설치할 수 있는 빌드예요. 각 기기는 UDID로 식별해요. EAS에서 말하는 "내부 배포"가 이거예요.
- App Store: App Store Connect와 TestFlight용이에요. TN3125 노트에 따르면 기기 목록이 전혀 없어요.
프로파일마다 만료일이 있어요. Apple 기준으로는 보통 1년 이하, Expo 기준으로는 12개월이에요.
푸시 알림 키(APNs)
APNs 키는 내 서버나 Expo 서버가 앱에 알림을 보낼 수 있게 해 줘요. .p8 파일인데 딱 한 번만 다운로드할 수 있어요. Apple은 계정에 이 파일을 보관하지 않거든요. 키 하나로 모든 앱에 쓸 수 있고, 만료되지 않아요.
한눈에 보는 정리표
| 요소 | 용도 | 유효 기간 | Expo에서 관리 주체 |
|---|---|---|---|
| 배포 인증서 | 빌드 서명 | 보통 1년 | 로그인 후 EAS |
| App ID | 앱 식별 | 만료 없음 | 나, 그다음 EAS |
| App Store 프로파일 | Apple에 업로드 | 최대 12개월 | EAS |
| Ad hoc 프로파일 | 내 iPhone에 설치 | 최대 12개월 | EAS와 내 기기 |
| APNs 푸시 키 | 알림 전송 | 만료 없음 | EAS 또는 나 |
| 무료 계정 프로파일 | Xcode로 테스트 | 7일 | EAS가 아닌 Xcode |
"나, 그다음 EAS"는 번들 식별자는 내가 정하고 기능은 EAS가 처리한다는 뜻이에요. "EAS와 내 기기"는 테스트 iPhone은 내가 하나씩 등록하고 프로파일은 EAS가 만든다는 뜻이에요. 마지막 줄은 무료 Apple 계정 얘기예요. Apple의 계정 도움말에 따르면, 무료 계정의 프로파일은 생성 후 7일이 지나면 만료돼요.
알아둘 Apple의 제한
- 배포 인증서: 계정당 아주 적어요. Apple 도움말은 팀당 배포 유형별로 하나라고 하고, Expo 표는 2개 제한이라고 해요. 규칙만 기억하세요. 빌드할 때마다, 컴퓨터마다 새 인증서를 만들지 마세요.
- APNs 키: Expo에 따르면 계정당 최대 2개.
- 프로파일: Expo에 따르면 제한 없음.
- 기기: Apple의 기기 도움말에 따르면 제품군별로 멤버십 연도당 최대 100대. 기기를 비활성화해도 자리가 비지 않아요. 기기를 삭제해 두면 다음 멤버십 연도가 시작될 때 카운터가 100으로 초기화돼요.
EAS가 대신 해 주는 일
Expo의 관리형 자격 증명 페이지에 따르면, 첫 iOS 빌드 때 없는 걸 생성할지 물어봐요. Apple Developer 계정에 로그인하면 EAS가 배포 인증서, 프로파일, 푸시 키를 만들어서 자기 서버에 저장해요. 이후 빌드는 이걸 재사용해요.
유용한 포인트 세 가지예요.
- Apple 비밀번호는 내 컴퓨터에만 남아요. Expo 보안 페이지에 따르면 비밀번호는 Expo 서버로 전송되지 않고, 저장된 자격 증명은 암호화돼요.
eas credentials로 전부 볼 수 있어요. 인증서, 프로파일, 푸시 키까지요. 이 명령으로 교체하거나 삭제할 수도 있어요.- EAS에서 삭제해도 Apple에서는 삭제되지 않아요. 자리를 비우려면 Apple 포털에서 폐기(revoke)해야 해요.
로컬 자격 증명으로 직접 관리할 수도 있어요. credentials.json 파일이 인증서(.p12)와 프로파일(.mobileprovision)을 가리키는 방식이에요. Expo는 이 파일들을 .gitignore에 추가하라고 해요. Expo 앱의 API 키와 같은 규칙이에요. 비밀 정보는 절대 저장소에 올리지 않아요.
흔한 오류와 해결 방법
프로파일 만료
Ad hoc 빌드는 프로파일을 품고 있어요. 그래서 프로파일이 만료되면 테스트 iPhone에서 앱이 더 이상 열리지 않아요. 반면 App Store에서는 만료가 출시된 앱에 아무 영향도 없다고 Expo가 확인해 줘요. 해결법: 빌드를 다시 돌리세요. EAS가 새 프로파일을 만들어 주고, eas credentials로 직접 해도 돼요. 그다음 새 빌드를 기기에 다시 설치하세요.
TestFlight와 헷갈리지 마세요. TestFlight 빌드는 인증서와 상관없이 90일 후에 만료돼요. 자세한 내용은 TestFlight로 iPhone 앱 테스트하기에 있어요.
인증서 만료 또는 폐기
Apple의 입장은 분명해요. 멤버십이 유효하면 이미 App Store에 있는 앱은 영향을 받지 않아요. 다만 그 인증서로 서명한 빌드는 더 이상 업로드할 수 없어요. 업로드했지만 아직 제출하지 않은 빌드는 인증서가 폐기되면 Invalid Binary로 표시될 수 있어요. 그리고 폐기된 인증서를 담은 프로파일은 무효가 돼요.
해결법: eas credentials에서 또는 다음 빌드 때 새 인증서를 만드세요. 그다음 EAS가 프로파일을 다시 만들게 두면 돼요. 그리고 잘 작동하는 인증서를 습관적으로 폐기하지 마세요.
Ad hoc 프로파일에 없는 기기
설치 링크가 내 기기에서는 되는데 테스터의 iPhone에서는 안 돼요. 원인은 Expo의 내부 배포 문서에 나와 있어요. 빌드 시점에 프로파일에 들어 있던 기기만 앱을 설치할 수 있어요.
해결법:
eas device:create로 기기를 등록하세요.- Apple 계정에 로그인한 상태로 인터랙티브 모드에서 빌드를 다시 돌려, EAS가 프로파일을 업데이트하게 하세요. 아니면
eas build:resign으로 기존 빌드를 다시 서명하면 전부 재컴파일할 필요가 없어요. - CI에서는 비인터랙티브 모드가 프로파일을 재사용하면서 기기 목록을 업데이트하지 않아요.
--refresh-ad-hoc-provisioning-profile옵션을 추가하세요.
새 계정이나 막 갱신한 계정이라면 Apple이 새 기기를 처리하는 데 24~72시간이 걸릴 수 있어요. 그래서 그 기기를 포함한 첫 빌드가 실패할 수 있어요. 기다렸다가 다시 돌리세요.
인증서 개수 제한 도달
Apple이 새 배포 인증서 생성을 거부해요. 대개는 예전 인증서가 남아 있는 경우예요. 다른 Mac의 Xcode나 다른 빌드 서비스에서 만든 것들이요. .p12 파일이 있으면 기존 인증서를 재사용하세요. 없으면 Apple 포털에서 안 쓰는 인증서를 폐기하세요. 폐기해도 이미 출시된 앱에는 영향이 없지만, 그 인증서를 담은 프로파일은 무효가 돼요.
"Provisioning profile doesn't include signing certificate"
Xcode의 이 메시지는 프로파일에 내 컴퓨터에 있는 개인 키와 짝인 인증서가 들어 있지 않다는 뜻이에요. 흔한 원인은 Xcode 자동 서명과 EAS 자격 증명을 섞어 쓰는 거예요. 기준을 하나만 정하세요. 관리형 자격 증명을 쓰는 EAS 빌드든 로컬 자격 증명이든, 둘 중 하나만 써야 해요.
키 폐기 후 알림 중단
APNs 키를 폐기하면 그 키를 쓰는 모든 앱이 알림을 못 받게 된다고 Expo가 경고해요. 새 키를 만들어서 eas credentials로 업로드하세요. 사용자들의 Expo Push 토큰은 바뀌지 않아요.
기능 추가 후 프로파일 무효
푸시 알림이나 App Groups 같은 서비스를 활성화하면 프로파일이 무효가 돼요. 다시 생성해야 해요. EAS를 쓰면 빌드할 때마다 기능이 동기화돼요. 그래도 프로파일이 계속 거부되면 eas credentials로 새로 만들 수 있어요.
서명 다음 단계
서명된 빌드는 한 단계일 뿐이에요. 앱 페이지, 스크린샷, 개인정보, 심사 제출까지는 App Store에 앱 출시하기에 모아 뒀어요. 아직 멤버십이 없다면 Apple 개발자 계정부터 시작하세요. 그리고 제가 왜 입문자에게 Expo를 추천하는지 궁금하다면 모바일 앱을 위한 React Native와 Expo를 읽어 보세요.
첫 출시를 준비하고 있다면
첫 업로드 전에 무료 진단을 받아 보세요. 프로젝트에서 실제로 막히는 부분을 알려 주고, 제 Apple 리젝 방지 체크리스트도 보내 드려요.
앱을 만들고, 구독을 연결하고, 서명과 씨름하지 않고 출시하고 싶다면 iOS & Android Kit가 제 앱의 스타터 코드와 함께 4단계 과정을 안내해 줘요. 내 속도에 맞춰서요.
자주 묻는 질문
프로비저닝 프로파일이란 무엇인가요?
앱이 기기에서 실행되거나 Apple로 업로드될 수 있게 허락하는 파일이에요. App ID, 인증서, 그리고 종류에 따라 기기 목록을 연결해요. App Store 프로파일에는 기기가 없고, Ad hoc 프로파일에는 몇 대가 들어 있어요.
iOS 개발자 인증서는 무료인가요?
따로 가격이 매겨지지 않아요. 배포 인증서는 연 99달러인 Apple Developer Program에 포함돼 있어요. 무료 Apple 계정으로도 Xcode에서 최대 3대 기기까지 테스트할 수 있지만, 프로파일이 7일 후 만료되고 출시는 불가능해요.
Apple 배포 인증서는 얼마 동안 유효한가요?
Apple에 따르면 보통 생성 시점부터 1년이에요. 프로비저닝 프로파일도 최대 12개월이에요. 푸시 알림 키는 만료되지 않아요.
배포 인증서가 만료되면 어떻게 되나요?
멤버십이 유효한 한, 이미 App Store에 있는 앱에는 아무 일도 없어요. 그 인증서로 서명한 새 빌드를 더 이상 업로드할 수 없을 뿐이에요. EAS를 쓰면 다음 빌드 때나 eas credentials로 새 인증서가 만들어져요.
iOS 인증서를 만들려면 Mac이 필요한가요?
EAS를 쓰면 필요 없어요. 명령줄에서 Apple 계정에 로그인하면 EAS가 인증서와 프로파일을 만들어 줘요. Windows든 Linux든 상관없어요. EAS 없이 하는 전통적인 방법은 Mac의 Xcode나 키체인 접근을 거쳐야 해요.
Ad hoc 프로파일에는 기기를 몇 대까지 넣을 수 있나요?
계정당 멤버십 연도마다 iPhone을 최대 100대까지 등록할 수 있고, 다른 기기 제품군도 각각 같은 수만큼 가능해요. 비활성화한 기기도 계속 개수에 포함돼요. 더 많은 사람과 테스트하려면 TestFlight를 쓰세요.

