[EXPO(react-native-create-app) 프로젝트 배포] 2. ios, android 별로 필요한 인증 파일 생성하기

Duckuism
Duckuism
17 min readDec 15, 2018

--

이번 포스팅에서는 ios, android 인증서에 관련하여 알아보도록 하겠습니다. EXPO로 만든 프로젝트를 앱 스토어에 배포할 때는 .ipa 파일, 플레이 스토어에 배포할 때는 .apk 파일이 필요한데요. 이 두 가지 파일은 standalone파일이라고 하여 네트워크 연결이 필요없이 설치 후 실행할 수 있는 파일입니다.

EXPO에서는 expo build:ios , expo build:android 명령어를 입력하면 자동으로 standalone들을 만든 후, 다운받을 수 있는 링크를 반환해줍니다. 이 때 각 플랫폼마다 필요한 인증 파일들을 요구하는데요. EXPO는 인증 파일들을 관리해주는 기능을 갖고 있지만, 이 기능은 모든 인증 파일을 새로 생성한 후 expo 서버의 데이터베이스에 저장하고 관리하는 방식이라 apple 개발자 계정에서 인증 파일을 새로 생성할 수 없다면 사용할 수 없습니다.(계정마다 인증서 개수 제한이 존재합니다.) 즉, 기존에 존재하는 인증서를 재활용해야한다는 얘기죠. 제가 맡게 된 프로젝트의 상황이 딱 이랬습니다. 이렇게 되면 직접 모든 인증서를 다운받고 로컬의 파일 경로를 입력해주는 수 밖에 없는데요. 인증서 체계를 모른다면 이 부분을 해결하기가 굉장히 어렵습니다.

저도 이 인증서 체계를 이해하는데 적지 않게 골머리를 썩었기에, 다른 분들은 이러한 어려움을 겪지 마시라고 제 경험을 공유합니다. 그럼 본격적으로 한 번 살펴볼까요?

1. IOS

ios의 인증 체계는 굉장히 생소합니다. 보통 인증이라고 하면 그냥 인증서 하나만 있으면 된다고 생각하지만, 이와 다르게 애플은 굉장히 까다롭게 인증을 진행하기 때문이죠.

자, 이제 그럼 인증서 하나하나 뜯어보도록 할까요?

Apple 인증서에 관련해서 먼저 알아야 할 사진 지식들이 존재합니다. 개념별로 설명할까 하다가, 아얘 developer.apple.com에 나와있는 대로 설명하는 것이 제가 나중에 보기에도 편할 것 같아 중요한 메뉴마다 설명해볼게요. 처음 인증서를 보는 사람이라면 애플 개발자 센터 화면과 이 포스트를 비교해가면서 보면 좋을 것 같습니다.

1–1. Apple 인증서 사전 지식 익히기

Certificates : ‘누가’ App을 개발하거나 배포할 지를 나타내는 인증서

  • All
  • Pending
  • Development : 앱을 만들고, 실제 모바일 폰에서 테스팅하는 개발자가 누구인지를 밝혀주는 인증서입니다. 이 인증서로 개발자의 신원을 보증합니다.
  • Production : 앱을 실제로 App store에 배포할 사람이 누구인지를 밝혀주는 인증서입니다. 즉, 앱 ‘생산자’를 나타내는 인증서라고 할 수 있죠.

Key : 인증서와 연계되는 key인 것 같은데 이 부분은 배포에서 크게 살펴볼 일이 없었습니다. 혹시나 첨언해주실 분이 계시다면 댓글 부탁드려요🙏🏻

  • All

Identifiers : ‘무엇을’ 개발할 지를 나타내는 식별자

  • App IDs : 이 메뉴에서 우리가 개발한 expo 앱을 등록하고, 고유의 ID 값을 받습니다. .ipa파일을 만들기 전에, 우리가 만든 expo 프로젝트의 app.json에 다음과 같이 bundleIdentifier속성을 직접 기재해야하는데, App ID 메뉴에서 이 값을 사용하게 됩니다.
"ios":{
"bundleIdentifier":"com.encoredtech.derms",
"supportsTablet":true
}
  • Pass Type IDs
  • Website Push IDs
  • iCloud Containers
  • App Groups
  • Merchant IDs
  • Music IDs
  • Maps IDs

Devices : ‘어디서’ 앱을 실행할 지를 나타내는 장치 목록

  • All
  • Apple TV
  • Apple Watch
  • iPad
  • iPhone
  • iPod Touch

Provisioning Profiles : ‘누가’, ‘무엇을’, ‘어디서’ 할 지에 대한 모든 정보를 갖고 있는 정보.

  • All
  • Development : 실제 모바일 폰에서 만들어진 앱을 테스팅할 때 필요한 정보입니다. 이 정보는 Certificates의 development certificates(어떤 개발자가 테스트할 것인지), Identifiers의 App ID(어떤 앱을 테스트 할 것인지), Devices(어디서 테스트할 것인지. 애플은 기계도 신뢰되지 않았다면 믿지 않는가봅니다. 🤔)의 총 3가지 정보를 기입해야 생성할 수 있습니다.
  • Distribution : 실제 앱스토어에 배포하여 사용자들에게 `분배`할 때 필요한 정보입니다. 이 때는 Certificates의 distribution certificates와 Identifiers의 App ID 두 가지 정보만 필요합니다. 테스트를 하는 것이 아니므로 Device 정보는 필요가 없습니다.

1–2. EXPO에서 .ipa 파일을 만들기 위해 필요한 인증 파일들

이제 app store에서 사용되는 인증 관련 메뉴들에대해서는 어느정도 익히셨나요? 이제 실제로 앱 스토어에 EXPO로 만든 어플리케이션을 배포하려면 무엇이 필요한 지 알아볼 차례입니다.

그 목록은 다음과 같습니다.

  1. distribution certificate와 개인 키로 만들어진 .p12파일
  2. push notification certificate와 개인 키로 만들어진 .p12파일
  3. distribution provisioning profile을 나타내는 .mobileprovision파일

위의 세 가지 파일이 필요합니다. 그런데 .p12파일이 무엇인지 모르고 계시는 분도 계실 테죠? 쉽게설명하자면 .p12파일은 apple에서 발급한 ‘인증서’와 이 인증서에 접근할 수 있는 권한을 갖고 있는 사람인지를 증명하는 ‘개인 키’가 한 쌍이 되어 만들어진 하나의 파일입니다.

제가 포스팅을 올리니, 저희 회사 펌웨어 개발자이신 권경환 PM님이 친절히 첨언을 해주셨는데요. 그대로 인용하여 추가합니다. 😎

현대의 디지털 인증은 X.509 표준을 따릅니다. 애플의 signing이나 웹의 인증 모두 그 표준 위에 세워진 PKI에요. 관심있으시다면 관련 내용을 공부하면 도움이 될 것 같아요. 이 내용은 애플 앱 개발을 위한 인증 관련 작업 뿐만 아니라 모든 디지털 인증에 적용되는 내용이기 때문이에요.

.p12 파일은 PKCS 12파일 포맷으로 보통 비밀키와 X.509 인증서를 묶는 용도로 사용됩니다.

그런데 여기서 문제가 하나 있는데요. 원래 개인키는 mac 1대에 귀속되므로 일단 만들어지면 다른 mac에서는 해당 개인키와 쌍으로 이루어진 인증서를 사용할 수 없게 됩니다. 하지만 이 mac의 개인 키와 인증서를 쌍으로 묶어서 .p12파일로 만든 후, 다른 mac으로 전송하여 이 인증서를 실행하고 암호를 입력하면 해당 mac의 keychain에 저장되어 사용할 수 있게 됩니다. 즉 원래 하나의 mac에서만 사용할 수 있었던 인증서가 다른 mac에서도 사용할 수 있게 되는 것이죠. 하지만 이러한 과정은 팀 단위로 작업할 때 굉장히 불편합니다. 매번 .p12파일을 주고 받으면서 인증서를 주고 받아야 하기 때문이죠. 이러한 불편함을 해결해주는 것이 fastlane과 같은 툴입니다. 이후에 fastlane 사용 법에 대해서도 포스팅하도록 할게요.

일반 인증서 발급 후 .p12파일을 만드는 방법(영문)

푸시 알림 인증서 발급 후 .p12파일을 만드는 방법(국문)

푸시 알림 인증서 갱신 방법

1–3. 필요한 인증 파일들 만들기

자, 이제 애플 인증에 관한 지식과 함께 필요한 인증 파일도 전체적으로 알아봤습니다. 이제 필요한 인증 파일들을 만들어 볼 차례네요. 이 과정은 스크린샷 위주로 차근차근 진행합니다.

중요!! 사전 점검 사항이 있습니다.

Expo는 Xcode로 build하므로, Xcode — preference — Accounts 탭을 클릭하여 Apple 개발자 계정이 제대로 로그인 되어있는지 먼저 확인합니다.

로그인이 되었다면, Accounts 탭의 우측하단에 Manage Certificates…를 클릭하여 인증서 상태를 확인합니다. 이 탭에서는 현재 Mac의 Keychain에 저장된 인증서들을 확인할 수 있는데요. 인증 기간이 만료되었다면 음영처리가 되어서 보이게 됩니다. 만약 missing public key 라고 쓰여 있고 빨간색 엑스표시가 되어있다면 인증서는 있으나 해당 인증서에 쌍으로 존재하는 개인 키가 없어서 해당 인증서를 사용할 수 없는 상태라는 뜻입니다. missing public key 표시가 없이 정상적으로 나타나고 있는 인증서만 사용이 가능합니다.

배포를 하려면 적어도 하나의 Distribution 인증서를 정상적으로 사용할 수 있어야 합니다.

만약 missing public key가 표시되는 인증서를 사용해야만 하는 상황이라면, 이 인증서와 쌍으로 이루어진 private key를 가지고 있는 Mac에 접속하여 .p12파일로 인증서를 내보낸 후 현재 Mac에서 파일을 받아 실행해야만 쓸 수 있습니다. 애플 개발자 사이트에 표시가 된다고 다운로드 받아서 쓸 수 있는 것이 아닙니다. 애플 개발자 사이트에서 다운로드가 가능한 이유는, 해당 인증서를 발급한 Mac에서 개인 키를 가지고 있으므로 인증서 자체만 다운받을 때 쓰는 용도입니다.

이제 위에서 설명했던 인증 파일들을 만드는 방법을 살펴보겠습니다.

1. distribution certificate와 개인 키로 만들어진 .p12 파일 만들기

앱스토어 개발자 콘솔에 접속 후, Certificates, Identifiers & Profiles를 클릭합니다.
배포를 위한 Distribution 인증서를 만드는 것이 목적이므로 왼쪽 탭에서 Production을 클릭합니다.

Distribution 인증서는 계정 당 개수 제한이 2개입니다. 만약 이 이상 갖고 있다면 삭제 후 새로운 것을 발급 받아야 합니다. 이 경우에는 expo build:ios 명령어를 입력하면 보게 되는 expo의 인증서 관리 옵션을 사용할 수 없습니다. expo의 인증서 관리 옵션은 모든 인증 파일을 새로 생성하는 방식이기 때문이죠.

Distribution 혹은 Development 인증서를 발급한 적이 없다면 새로 발급받아서 사용해야 하고, 발급한 적이 있다면 발급받았던 인증서를 재사용하면됩니다.

1–1. 새로운 인증서를 발급받는 경우

새로운 인증서를 발급받는 경우는 아래 링크에 워낙 잘 설명되어 있어서 따로 순서를 적진 않겠습니다. 이렇게 생성된 .p12파일이 위치한 경로와 비밀번호를 expo 배포시 터미널에 입력하면 됩니다. (터미널에 경로를 어떻게 적는지 모르겠다면 이전 포스트 맨 하단의 터미널 명령어 스크린샷을 참고하세요!)

1–2. 기존의 인증서를 재사용하는 경우

만약 기존에 존재하는 Distribution 인증서를 사용하려면 해당 인증서를 만든 Mac에서 Utilities — Keychain access에 들어가서 해당 인증서와 개인 키를 같이 클릭하고 우클릭하여 내보내기 옵션을 클릭합니다. 이 옵션을 클릭해서 패스워드를 입력하고 .p12확장자로 내보낸 다음 인증서를 사용할 새로운 Mac으로 전송하고, 새로운 Mac에서 이 파일을 열고 패스워드를 입력하면 해당 인증서와 개인 키가 새로운 Mac의 Key체인에 저장되게 됩니다. 그리고 이 인증서를 사용하면 됩니다.

인증서를 클릭하면 그와 쌍을 이루는 개인 키가 보이게 됩니다.
이 개인 키와 인증서를 같이 선택 후 오른쪽 버튼을 클릭하여 내보내기를 선택합니다.
.p12 파일 포맷을 확인하고 원하는 이름을 입력한 뒤 원하는 위치에 저장합니다.

2. push notification certificate와 개인 키로 만들어진 .p12 파일 만들기

2–1. App Id를 먼저 등록해야합니다. App Id를 등록하려면 bundle Id가 필요한 데, Expo를 사용할 경우 app.json 파일에 아래 이미지와 같이 코드를 추가하고 이것을 적으면 됩니다.

2–2. 개발자 콘솔에서 왼쪽에 Identifiers — App IDs을 클릭하면 내가 현재 등록한 앱들의 ID가 모두 보입니다.

2–3. 우측 상단에 +버튼을 눌러서 App ID를 추가할 수 있습니다.

2–4. Name탭에 자신이 개발자 콘솔에서 식별하고자 하는 이름을 적고, App ID Suffix에서 Explicit App Id 탭에 1번에서 만든 Bundle Id를 기재합니다.

2–5. 만약 push 알림을 사용할 것이라면 App Services 탭에서 push notification을 클릭합니다.

2–6. 위의 그림에서 Continue를 눌러서 새로운 App Ids를 생성합니다.

2–7. 다시 App Ids Tap을 눌러보면 생성된 앱이 보입니다. 해당 앱을 클릭하여 push notifications에 노란불이 들어와있는지 확인하고, Edit을 누릅니다.

2–8. 아래 그림과 같이 Push Notifications 탭에서 create certificate를 눌러서 Push notification certificate를 생성하고 다운로드 받습니다. 다운로드가 되었으면 해당 파일을 더블클릭합니다. 인증서가 실행이 되면서 현재 Mac의 키체인에 추가됩니다.

2–9. 키체인 접근에 들어가서 해당 인증서와 묶여있는 현재 Mac의 개인 키 두 개를 클릭하고 우클릭을 해서 내보내기를 클릭합니다. 그리고 파일 확장자는 .p12를 선택한 후 원하는 위치에 저장합니다.

2–10. 이 파일의 경로와 비밀번호를 expo에서 배포시 터미널에 입력하면 됩니다. (터미널에 경로를 어떻게 적는지 모르겠다면 이전 포스트의 터미널 명령어 스크린샷을 참고하세요.)

3. push notification certificate와 개인 키로 만들어진 .p12 파일 만들기

3–1. 우리는 개발 테스트가 아니라 배포 목적이므로 Provisioning Profiles — Distribution 탭을 클릭합니다.

3–2. 우측 상단에 + 버튼을 누릅니다.

3–3. App store에 배포할 목적이므로 App store를 클릭합니다.

3–4. 위에서 등록했던 App Id와 일치하는 앱을 선택합니다.

3–5. 위에서 생성했거나 기존에 존재하는 인증서를 선택합니다.

3–6. profile 이름을 입력합니다.

3–7. 생성 후 다운로드합니다.

3–8. 이 .mobileprovision 파일의 경로를 배포시 터미널에 입력하면 됩니다. (터미널에 경로를 어떻게 적는지 모르겠다면 이전 포스트 터미널 명령어 스크린샷을 참고하세요!)

이제 EXPO를 통해서 ios의 standalone 파일인 .ipa파일을 추출하는 데 필요한 모든 준비가 끝났습니다!

expo build:ios 명령어를 통해 .ipa 파일을 추출해내는 부분은 제가 이전에 작성한 포스트를 이어서 참고하시면 됩니다! 😁

2. ANDROID

안드로이드는 ios보다 훨씬 수월합니다. 인증서 체계가 간단하거든요.

안드로이드 어플리케이션은 어플리케이션마다 고유의 ‘키스토어'를 갖고 있습니다. 이 키스토어가 앱 안에 .jks(Java Key Store)파일로 존재해야 하고, 만약 들어있는 .jks파일이 이전에 앱을 배포할 때 사용했던 .jks파일과 다르다면 플레이 스토어에 업로드가 거부됩니다.

배포를 위한 APK파일 keystore 발급 방법은 아래 포스트에서 잘 설명해주고 있습니다. ios보다 훨씬 쉬우니 무리없이 따라하실 수 있을 거에요. 😅

정리해보자면

  1. keystore를 발급받고, 프로젝트의 최상위에 위치시킨 뒤
  2. expo build:android 명령어를 통해 .apk파일 생성 후 다운로드
  3. 구글 스토어에 .apk파일을 업로드 하여 배포 (developer.android.com)

위와 같은 과정으로 진행하시면 됩니다.

만약 안드로이드에서 앱을 업데이트하면서 재배포할 경우에는 app.json의 versionCode 속성을 이전의 값보다 더 높은 숫자로 바꿔줘야 합니다.

인증서에 관한 내용은 공식 문서에 잘 나와있습니다.(영문)

3. 마치며

ios를 주 포스트 내용으로 하여, EXPO로 만들어진 프로젝트를 배포하기위해 어떻게 각각의 플랫폼 standalone file을 생성하는지 알아봤습니다. 한 눈에 봐도 쉬운 과정은 아니죠? 저는 혼자 문서들을 읽으며 이 과정을 이해하느라 거의 일주일을 날렸던 것 같네요. 그래도 무사히 해내서 다행이지만요. 부디 저와 같은 문제로 고민하시는 분들께 이 포스트가 도움이 되었으면 하는 마음입니다.

그리고 ios, android에서 배포할 때 필수적으로 아이콘과 스크린샷의 이미지 등이 필요합니다. 이 때, https://appicon.co/ 사이트를 참고하시면 해상도별 아이콘을 한 번에 생성할 수 있으니 사용해보세요 😎

만약 위의 내용에 대해 이해가 되지 않는 부분이 있으시거나 수정해야할 부분을 발견하셨다면 주저없이 댓글 남겨주시거나 아래 이메일로 피드백주시면 감사하겠습니다.

그럼 다음 포스트에서는 더욱 실용성있는 주제로 돌아오도록 할게요!

--

--