L-j-h-c/TIL

[iOS] Apple App Signing에 대하여

Opened this issue · 1 comments

Provisioning / Certificate / Signing

애플은 보안 및 안전성을 위해 Apple 자신만이 자신들의 하드웨어(아이폰, 아이패드, 맥북 등)에 소프트웨어(앱)을 실행할 수 있도록 한다. 특정 앱이 실행할 때마다 Apple로부터의 인증을 받았는지 확인한다. 그런데 항상 API 요청을 통해 인증 여부를 확인하기는 번거로우니 인증서(Ceritificate)를 통하여 Apple로부터의 인증을 받았다는 증표로 가지고 있는 것이다. 따라서 특정 앱에 인증서가 존재한다면 이를 신뢰할 수 있는 앱으로 생각하여 Apple 대신 앱을 실행할 수 있게 된다.

링크를 참고하면 MacOS에서 앱이 신뢰할 수 있는 앱임을 확인하기 위해서 Developer ID를 만들고 certificate를 생성할 수 있고, 이렇게 함으로써 apple login이나 push notification 등의 기능을 사용할 수 있게 된다는 내용을 확인할 수 있다.

이 링크에는 Certifcates에 대한 설명이 나와 있다.

App Signing이란? 개발자 문서

Code Signing
링크의 문서를 읽어보면 Xcode는 앱의 빌드와 아카이빙 과정에서 code signs의 기능을 수행한다고 한다. 여기서 코드 사이닝이란 무엇일까?
Signing은 앱스토어나 테스트 플라이트에 앱을 배포하고 업로드하는 과정에서 요구되는 과정이며, OS는 앱의 Signatures가 올바른지 확인하고 잘못되었다면 앱이 실행되지 않도록 막아준다.
image
Xcode는 미리 애플에게서 받은 Apple certificate authority를 개발자의 keyChain에 저장해 놓고, build와 아카이브 과정에서 사용하여 Signing을 진행하기 때문에 앱스토어에 업로드되는 시점에서 외부적인 변화(해킹 위험)가 없었음을 보장할 수 있다.

Signing Certificate에 대해서 조금 더 살펴보자
image
Signing Certificate는 빌드와 아카이빙 과정에서 사용하는 인증서이다. 이 인증서는 애플에 의해 발급된 public-private key 쌍의 인증서로 개인 개발자의 키체인에 저장된다. 개인 키는 로컬에 저장되기 때문에, 이는 맥북 계정의 비밀번호를 통해 보호된다.

그리고 이러한 인증서가 애플에 의해 허가된 인증서라는 것을 확인시키기 위해서 intermediate Certificate도 필요한데, 이는 Xcode를 설치할 때 미리 개발자의 keyChains에 추가된다. 만약 app이 허가 없이 임의로 수정된 경우 excutable code가 변화하고 동시에 Signatures가 invalid해지기 때문에 Signature는 이러한 코드의 임의적인 변화에 대한 방어책으로 생각할 수 있다.

한마디로 올바른 Signature가 존재한다면 이 앱이 애플로부터 허가를 받은 후에 임의로 수정되지 않았음을 보장하고, 유저에게 이 앱이 신뢰할 수 있음을 알려주는 것이다.

Provisioning Profile이란? (참고)

그렇다면 Xcode 프로젝트에서 협업을 할때에 꼭 설정해줘야 하는 Provisiong Profile이란 무엇일까? 이것을 왜 팀 내에서 공유해야 했을까?

Provisioning Profile은 특정 Device들이 나(개발자/앱)을 신뢰할 수 있는지에 대한 정보가 담긴 파일이다. app store connect에서는 개발자 계정에서 Device UDID를 등록할 수 있는데, 이러한 UDID는 기기에 고유한 정보이기 때문에 등록해 놓으면 내가 가진 인증서에 연결할 수 있다. 만약 Device UDID가 Provisioning Profile에 등록되어 있지 않으면 해당 기기를 통해 Xcode에서 빌드를 하려고 하면 신뢰할 수 없는 앱이라고 하며 빌드가 불가능하다. 외부의 허가되지 않은 앱을 임의로 설치하는 것을 막아주는 Apple의 보안 기능이라고 생각하면 된다.

여기에 더하여 Provisioning Profile은 Push Notification / Apple Sing In과 같은 API들을 사용할 수 있는 권한 정보(Developer Memebership이 필요한 권한들)를 가지고 있다. 애플이 제공하는 API들을 허가 없이 임의로 사용하는 것을 막아주기 위한 절차라고 생각할 수 있다.