애플리케이션 서명

개발자는 애플리케이션 서명을 사용하여 복잡한 인터페이스와 권한을 만들지 않고도 애플리케이션 작성자를 식별하고 애플리케이션을 업데이트할 수 있습니다. Android 플랫폼에서 실행되는 모든 애플리케이션은 개발자가 서명해야 합니다. 서명되지 않은 상태에서 설치를 시도하는 애플리케이션은 Google Play 또는 Android 기기의 패키지 설치 프로그램에 의해 거부됩니다.

Google Play에서는 애플리케이션 서명으로 Google의 개발자 신뢰와 개발자의 애플리케이션 신뢰가 연계됩니다. 개발자는 애플리케이션이 수정되지 않고 Android 기기에 제공된다는 점을 인지합니다. 따라서 애플리케이션의 동작에 개발자의 책임이 있다고 간주할 수 있습니다.

Android에서는 애플리케이션 서명이 애플리케이션을 애플리케이션 샌드박스에 배치하기 위한 첫 단계입니다. 서명된 애플리케이션 인증서는 어떤 사용자 ID가 어떤 애플리케이션에 연결되는지 정의합니다. 다른 애플리케이션은 다른 사용자 ID로 실행됩니다. 애플리케이션 서명으로 인해 애플리케이션은 제대로 정의된 IPC를 통하지 않고서는 다른 어떤 애플리케이션에도 액세스할 수 없게 됩니다.

애플리케이션(APK 파일)이 Android 기기에 설치되면 패키지 관리자는 APK가 APK에 포함된 인증서로 제대로 서명되었음을 확인합니다. 인증서(구체적으로는 인증서의 공개 키)가 기기의 다른 APK에 서명하는 데 사용된 키와 일치하면 새 APK에는 UID를 유사한 방식으로 서명된 다른 APK와 공유하겠다는 내용을 매니페스트에 명시할 수 있는 옵션이 있습니다.

애플리케이션은 타사(OEM, 운영자, 대체 시장)에서 서명하거나 자체 서명할 수 있습니다. Android에서는 개발자가 외부 지원 또는 권한 없이 생성할 수 있는 자체 서명된 인증서를 사용하는 코드 서명을 제공합니다. 중앙 기관에서 애플리케이션을 서명하지 않아도 됩니다. Android는 현재 애플리케이션 인증서에 CA 인증을 실행하지 않습니다.

또한 애플리케이션은 서명 보호 수준에서 보안 권한을 선언하여 액세스를 동일한 키로 서명된 애플리케이션으로 제한하는 동시에 고유한 UID 및 애플리케이션 샌드박스를 유지할 수 있습니다. 공유된 애플리케이션 샌드박스와의 긴밀한 관계는 공유된 UID 기능을 통해 가능합니다. 여기서는 동일한 개발자 키로 서명된 2개 이상의 애플리케이션이 공유 UID를 매니페스트에서 선언할 수 있습니다.

APK 서명 체계

Android는 세 가지 애플리케이션 서명 체계를 지원합니다.

최대의 호환성을 원하는 경우 모든 체계로 애플리케이션을 서명하세요(v1, v2, v3 순으로). Android 7.0+ 기기는 v2+ 체계로 서명된 앱을 v1 체계로만 서명된 앱보다 더 빠르게 설치합니다. 기존 Android 플랫폼은 v2+ 서명을 무시합니다. 따라서 v1 서명을 포함하기 위한 앱이 필요합니다.

JAR 서명(v1 체계)

APK 서명은 처음부터 Android의 일부였으며 서명된 JAR에 기반합니다. 이 체계 사용에 관한 자세한 내용은 앱 서명에 관한 Android 스튜디오 문서를 참고하세요.

v1 서명은 ZIP 메타데이터와 같은 APK의 일부 구성요소를 보호하지 않습니다. APK 인증자는 다수의 신뢰할 수 없는(아직 인증되지 않은) 데이터 구조를 처리한 다음 서명이 적용되지 않은 데이터를 삭제해야 합니다. 이는 상당한 규모의 공격 범위로 이어집니다. 더 나아가 APK 인증자는 모든 압축된 항목을 압축 해제해야 하며, 따라서 더 많은 시간과 메모리가 소비됩니다. 이러한 문제를 해결하기 위해 Android 7.0에는 APK 서명 체계 v2가 도입되었습니다.

APK 서명 체계 v2 및 v3(v2+ 체계)

Android 7.0 이상을 실행하는 기기에서는 APK 서명 체계 v2(v2 체계) 이상을 지원합니다. v2 체계는 Android 9에서 v3으로 업데이트되어 서명 블록에 추가 정보를 포함하지만 그 외에는 동일하게 작동합니다. APK의 콘텐츠가 해싱 및 서명된 후 결과 APK 서명 블록이 APK에 삽입됩니다. 앱에 v2 이상 체계를 적용하는 방법에 관한 자세한 내용은 APK 서명 체계 v2를 참고하세요.

인증이 진행되는 동안 v2 이상 체계는 APK 파일을 blob으로 간주하고 전체 파일에 걸쳐 서명 확인을 실행합니다. ZIP 메타데이터 수정을 비롯한 APK에 관한 모든 수정은 APK 서명이 무효화되는 결과로 이어집니다. 이러한 형식의 APK 인증은 훨씬 더 빠르며 승인되지 않은 수정의 클래스를 추가로 감지할 수 있게 해줍니다.

새로운 형식은 이전 버전과 호환되므로 새로운 서명 형식으로 서명한 APK를 이전 Android 기기에 설치할 수 있습니다(그러면 APK에 더해진 추가 데이터가 무시됨). 단, 이러한 APK는 v1으로도 서명되어야 합니다.

APK 서명 인증 프로세스

그림 1. APK 서명 인증 프로세스

APK의 전체 파일 해시가 APK 서명 블록에 저장된 v2+ 서명에 대해 인증됩니다. 해시는 v2+ 서명이 포함된 APK 서명 블록을 제외한 전체에 적용됩니다. APK 서명 블록 외의 APK를 수정할 경우 APK의 v2+ 서명이 무효화됩니다. v2 이상 서명이 제거된 APK도 거부됩니다. v1 서명이 APK가 v2로 서명되었다고 명시하기 때문입니다. 따라서 Android 7.0 이상에서는 v1 서명을 사용한 APK 인증을 거부합니다.

APK 서명 인증 프로세스에 관한 자세한 내용은 APK 서명 체계 v2의 인증 섹션을 참고하세요.