한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
Google Play 앱 서명 관련, 자주 묻는 질문 & 답변
2020년 5월 27일 수요일
작성자: Wojtek Kaliciński (구글
Android Developer Advocate)
원문은
여기서
확인 가능하며 본 게시물의 번역 리뷰는 양찬석(Google)님이 참여해 주셨습니다.
Android 앱은 개발자에 의해 암호화 방식으로 서명됩니다. 이러한 방식을 통해 사용자 기기의 패키지 관리자는 모든 앱 업데이트가 동일한 출처에서 나왔으며 조작되지 않았음을 확인합니다. Google Play는 개발자가 Google Play Console에 APK를 업로드할 때 서명 확인을 시행하므로, 다른 사람이 로그인 인증 정보를 갖고 있더라도 비공개 키에 액세스 할 수 없으면 악성 업데이트를 실행하는 것이 불가능 합니다.
과거에는 자체 비공개 키를 생성하여 애플리케이션의 전체 운영 기간 동안 안전하게 관리하는 것이 개발자의 의무였습니다. 이 방식은 매우 유연했지만 사소한 실수에도 취약했습니다. 보안 성능이 약한 키가 생성되거나 실수로 비공개 키를 사용하여 공개 저장소에 체크인하는 경우도 있었고, 심지어 아예 분실하게 되는 경우도 있었습니다. 노련한 개발자조차 이와 같은 여러 실수를 종종 저지르곤 했습니다.
지금의 개발자들에게는 키를 관리할 수 있는 다른 훌륭한 방법인
Google Play 앱 서명
(Google Play App Signing)이 있습니다. Google Play 앱 서명에서는
업로드 키
(Google Play에 아티팩트를 업로드할 때 사용하는 키)와
앱 서명 키
(기기에 배포되는 APK에 서명할 때 사용하는 키)를 별도로 사용할 수 있으며 앱 서명 키는 Google 인프라에 안전하게 저장됩니다.
다른 여러 유명 플랫폼에서도 이러한 방식으로 배포 키를 다루고 있지만, 많은 개발자들에게 Google Play 앱 서명은 기존 Android 서명 모델과는 확연히 다른 모델이며, 또 어떤 개발자들은 앱 통제 권한을 많이 포기하는 것으로 생각할 수도 있습니다.
그렇기 때문에 이 글을 통해서 Google Play 앱 서명과 관련해 개발자 여러분이 갖는 몇 가지 오해를 바로 잡고, 실제 발생할 수 있는 예상 시나리오 별로 대응 방법을 알려드리고자 합니다.
여기에서 들려 드리는 조언은 Google 개발자 커뮤니티팀이 컨퍼런스, 온라인 포럼, 1:1 채팅을 통해 수집한 개발자들의 질문을 바탕으로 한 것입니다.
우선 Google Play 앱 서명으로 전환해야 하는 가장 강력한 이유는 무엇인지 살펴보겠습니다.
1. Google Play에 업로드한 버전 아티팩트에 서명할 때 사용하는 키를 잃어버렸습니다. 어떻게 하면 되나요?
Google Play 앱 서명을 사용하지 않는 경우
: 앱 서명 키가 없으면 Android의 기본 보안 보호 조치로 인해 개발자 또는 Google에서 앱을 계속 업데이트할 수 있는 방법이 없습니다. 유일한 방법은 새 패키지 이름으로 새 스토어 등록정보를 만들고 처음부터 다시 시작하는 것뿐입니다.
Google Play 앱 서명을 사용하는 경우
:
새로운 업로드 키를 요청
할 수 있습니다. Google Play에서는 Google에서 안전하게 저장하고 있는 앱 서명 키를 사용해 앱 업데이트에 계속 서명할 수 있습니다.
앱 서명을 사용해야 할 이유를 한 가지만 들어야 한다면 위에서 설명한 이유일 것입니다. 앱 서명을 사용하여 문제를 해결할 수 있는 구체적인 시나리오에 관해 살펴보기 전에 먼저 다양한 문제와 관련된 다음 질문에 답하도록 하겠습니다.
2. 왜 Google에서는 개발자가 Google Play 앱 서명으로 전환하기를 원하나요?
Google Play에서 가장 중요하게 여기는 우선순위는 앞으로 오랫동안 수십억 명의 사용자와 수백만 명의 개발자가 믿을 수 있는 안전하고 강력한 보안을 갖춘 플랫폼을 구축하는 것입니다.
Android 생태계의 지속 가능성과 성공 여부는 여기에 달려 있습니다. 대부분의 개발자가 제공하는 보안 기능은 Google에서 제공하는 강력한 보안 기능에 미치지 못합니다.
Play에서 게시 아티팩트를 수집하고 서명된 아티팩트를 생성하는 새로운 앱 모델은 서명 키가 노출될 위험을 최소화하도록 설계되었습니다. 이 모델은 안전할 뿐 아니라 보다 효율적입니다. 또한 최종 사용자와 개발자 모두에게 혜택이 돌아가는 미래지향적 모델이기도 합니다.
예를 들어 현재 Play 스토어에 게시되어 있는 앱 중 많은 앱이 아직도 강력한 보안을 제공하는
v2 서명 체계
를 채택하지 않았습니다. Google Play 앱 서명에 등록하면 개발자가 별도의 작업을 하지 않아도 자동으로 새로운 보호 조치와 미래를 대비한 강화책이 제공됩니다.
끝으로, 별도의 게시 형식(Android App Bundle 사용)과 게재 형식(분할 APK)을 사용하면 개발자와 사용자 모두에게 도움이 됩니다. 보안이 강화되고 최적화 상태가 개선되며 복잡도 및 프래그먼트화가 줄어들기 때문입니다. 하지만 이를 위해서는 Google Play에서 게재될 아티팩트에 서명할 수 있어야 합니다.
현재 사용 가능한 기능으로는 앱 자동 크기 최적화 및 앱의 모듈에 적용할 수 있는 새로운
맞춤형 전송
옵션 등이 있습니다.
더욱 중요한 점은 Google Play 앱 서명이 배포된 아티팩트에 대한 신뢰와 안전성을 보장하는 동시에 앞으로 전송 방식을 발전시키고 개선할 수 있는 방법을 제공한다는 것입니다.
Google Play에서는 계속해서 게재 스택을 개선해 나갈 것입니다. 하지만 Google Play는 개발자의 승인을 받지 않거나
개발자에게 알리지 않고 애플리케이션 코드를 수정하거나 배포하지 않으며
Google Play에서 실시하는 새로운 최적화 방식은 오픈소스
bundletool
에서 자세히 살펴볼 수 있습니다. 이 FAQ의 뒷부분에서 Google Play에서 다운로드한 메타데이터와 로컬에서 생성된 메타데이터의 몇 가지 차이점(앱 작동 방식에 영향을 주지 않는 메타데이터)에 관해 살펴보겠습니다.
3. 제 앱 서명 키는 몇 년 전에 생성된 것이라 암호화 성능이 최근 표준에 맞지 않을 것 같습니다. 또는 앱 서명 키가 유출된 것 같습니다. 업그레이드하려면 어떻게 해야 하나요?
Google Play 앱 서명을 사용하지 않는 경우
: 앞서 말씀드린 것처럼 새 키로 전환한다고 해서 끝나는 것이 아닙니다. 그렇게 하면 기존 사용자가 앱 업데이트를 받을 수 없기 때문입니다. 기존 키를 계속 사용하면서 사용자의 데이터를 위험에 노출시키거나 새로운 앱 항목을 처음부터 다시 만들어야 합니다.
Google Play 앱 서명을 사용하는 경우
:
보안 성능이 약한 키를 사용하고 있거나 키가 해킹당한 경우
신규 설치에 적용되는 앱 서명 키를 업그레이드
할 수 있습니다.
기존 사용자가 앱을 업데이트하면 기존 키로 서명된 APK를 전송하고, 새로운 앱 설치 시에는 업그레이드된 안전한 키를 사용해 서명된 APK를 전달하면 됩니다.
지금 즉시 앱 서명을 사용 설정하고 최대한 빨리
별도의 업로드 키
를 사용하는 것이 좋습니다. 이렇게 하면 앱 서명 키가 해킹될 가능성이 줄어듭니다.
현재 새로운 키로 업그레이드하는 과정은 즉시 처리되지 않으며, 앱 서명 키가 유출되면 기존 사용자가 앱을 재설치하거나 새 기기로 바꾸지 않는 이상 위험에 노출되게 됩니다.
현재의 키 업그레이드 과정은 Android 9(Pie) 이상에서 도입된 키 회전 기능을 사용하지 않습니다. 현재 Google에서는 이러한 OS 버전에서 실행되는 기기를 대상으로 앱 서명 v3를 사용하는 키 회전 기능의 지원 가능 여부를 조사하고 있으며 조사 및 준비가 완료되면 별도의 발표를 통해 개발자 커뮤니티에 알려 드릴 예정입니다.
4. 아티팩트를 서명하는 데 사용하는 업로드 키를 도난당했습니다. 어떻게 하면 되나요?
Google Play 앱 서명을 사용하지 않는 경우
: 별도의 '업로드 키'라는 개념이 없기 때문에 버전 서명 키가 유출되면 큰 문제가 발생할 수 있습니다. 다른 사람이 원본 APK와 구분할 수 없는 (게다가 업데이트까지 가능한) 악성 또는 미승인 버전의 앱을 만들 수 있기 때문입니다.
물론 Google의 계정 보호 조치는 Google Play Console 액세스에도 적용되므로 공격자는 사용자가 수정된 APK를 사이드로드하도록 유도할 방법을 찾아내야 합니다. (따라서 개발자는
2단계 인증
을 사용 설정하는 것이 좋습니다.) 그렇지만 앱의 보안이 약화된 것은 사실입니다.
위의 3번 질문을 참조하여 신규 설치에 적용되는 키 업그레이드 등 사용 가능한 해결 방법을 확인해보세요.
Google Play 앱 서명을 사용하는 경우
:
업로드 키를 앱 서명 키와 별도로 사용하고 있는데 업로드 키가 유출되었다면 사용자의 데이터는 안전합니다.(제가 특별히 권장하는 방법은 아닙니다) 업로드 키만으로는 공격자가 앱 서명 키로 서명된 APK를 도용할 수 없기 때문입니다.
새 업로드 키를 요청
하기만 하면 됩니다.
앱 서명을 처음 사용 설정했을 때 Google Play에 업로드하기 위한 앱 서명 키를 계속 사용하고 있고 바로 이 앱 서명 키가 유출되었다면, 상황은 더 안좋긴 하지만 여전히 앱 서명을 통해 문제를 해결할 수 있습니다.
신규 설치에 사용되는 앱 서명 키를 업그레이드
하는 방법을 참고해주세요.
5. 앱에 Google Play 앱 서명을 사용 설정했지만 마음이 바뀌었습니다. Google 인프라에 저장되어 있는 앱 서명 키를 다운로드하고 싶습니다.
개발자 계정을 사용하는 개발자 또는 어떤 사용자도 Google의 안전한 인프라에 저장되어 있는 앱의 비공개 키를 다운로드하여 저장할 수 없습니다. 이는 앱 서명 키를 안전하게 보호하기 위한 조치입니다.
앱 서명 키에 계속 액세스해야 할 상황이 예상되는 경우 앱 서명을 사용 설정할 때 다음과 같은 조치를 취해야 합니다.
Google Play에서 개발자를 대신해 앱 서명 키를 생성할 수 있는 옵션을
선택하지
마세요
.
대신 자신의 컴퓨터에서
로컬로 서명 키를 생성
하세요.
Google Play에 키를 안전하게 전송하고 컴퓨터에서
삭제하지 마세요
.
키가 다른 사람에게 유출되지 않도록
키를 안전하게 보관
하세요.
정기적으로 키의 백업을 만들고 테스트하세요. 키를 분실하면 Google에서 다운로드할 수 없습니다.
앱서명에 대한
도움말
에 위의 단계가 설명되어 있습니다. 도움말에서 '기존 앱에서의 선택' 방법을 참고하여 서명 키를 암호화하고 Android 스튜디오 또는 명령줄을 통해 Google Play Console에 업로드하는 방법을 확인하세요.
비공개 앱 서명 키에 계속 액세스할 필요가 없다고 완전히 확신한다면 Google Play에서 새로운 앱의 키를 생성하도록 허용하거나 사본을 Google Play에 전송한 다음 삭제하고 업로드 키를 사용하도록 전환하는 것이 좋습니다.
업로드 키는 재설정할 수 있으며 이 키가 유출되더라도 사용자의 보안에 위협이 되지 않습니다.
6. 비공개 키를 Google Play로 전송할 때 누군가 비공개 키를 가로채지 않는다는 것을 어떻게 확신할 수 있나요?
신규 앱에 앱 서명을 사용 설정했으며 Google Play Console에서 새로운 키를 생성하는 옵션을 선택했다면 키는 절대 전송되지 않으며 Google의 안전한 서버에 바로 생성되기 때문에 모든 설정이 완료된 것입니다.
기존 서명 키를 전송해야 하는 경우(신규 앱: 선택사항, 기존 앱: 필수사항) 언제나 암호화된 형식으로 전송하게 됩니다.
Android 스튜디오에서 키를 내보내거나
명령줄에서 키를 내보낼 때마다 자신의 로컬 컴퓨터에서 Play의 비공개 키 암호화(PEPK) 도구를 사용하여 키를 전송하게 됩니다.
이때 사용되는 암호화 방식의 세부정보를 알려 드리자면, PEPK는 AES 대칭 암호화를 사용한 P256 Elliptic Curve 비대칭 암호화 방식을 사용합니다. 도구를 자세히 확인하고 세부 정보를 추가적으로 얻으려면, 앱 서명 가입 과정에서 PEPK 도구 및 소스 코드를 다운로드하면 됩니다.
암호화되지 않은 키가 노출되는 일이 없도록 키가 자신의 안전한 환경에서 실행되는지 자유롭게 검토하고 컴파일하시기 바랍니다.
Google Play Console에서 다운로드한 버전의 PEPK만 사용하고, 확인되지 않은 타사 웹사이트에서는 절대 PEPK 또는 소스를 다운로드하지 마시기 바랍니다.
7. 키는 Google 인프라에서 어떤 방식으로 안전하게 저장되나요? 누구도 키에 액세스하지 않는다고 어떻게 확신할 수 있나요?
Google Play 앱 서명을 사용하는 경우 키는 Google에서 자체 키를 저장하는 데 사용하는 인프라와 동일한 인프라에 저장되며
모든 작업 시 키 액세스 권한은 엄격한 ACL 및 조작 방지 감사 추적의 적용을 받습니다.
개발자는 Google Play Console에서 생성 및 개발자의 키로 서명된 모든 아티팩트를 검사하고 증명할 수 있습니다.
또한 Google에서는 키 분실을 방지하기 위해 주요 저장소를 상당히 자주 백업합니다. 이러한 백업은 강력한 암호화로 보호되며 Google에서는 정기적으로 백업 항목의 복원 여부를 테스트합니다.
Google 기술 인프라에 관해 알아보려면
Google Cloud 보안 백서
를 읽어보시기 바랍니다.
8. 외부 서비스에 가입하려면 공개 인증서가 있어야 하는데 키에 액세스할 수 없습니다. 어떻게 해야 하나요?
애플리케이션의 공개 인증서 해시로 가입해야 하는 서비스나 API를 사용하고자 하는 경우 Google Play Console의 '앱 서명' 섹션에 있는 공개 인증서 지문을 확인하거나 다운로드할 수 있습니다.
앱의 출시 버전에 서비스를 사용 설정할 때는 항상 이 지문을 사용하세요. 업로드 키에서 비롯된 버전에는 해당되지 않습니다.
대부분의 서비스에서는 애플리케이션에 여러 인증서를 사용 설정할 수 있기 때문에 로컬로 내장된 APK 및 Google Play에서 생성된 APK를 사용하여 계속 테스트할 수 있습니다.
9. 아티팩트에 서명할 때 사용하는 키를 제외하고 Google Play에서 앱 사용자에게 배포하는 아티팩트는 제가 로컬로 개발한 아티팩트와 어떻게 다른가요?
앞에서 명시한 바와 같이 Google Play는 개발자가 모르게 또는 개발자의 승인 없이 애플리케이션의 기능을 수정하지 않습니다. 하지만 배포 소스와 무결성을 확인하는 데 도움이 되는 매우 적은 양의 메타데이터는 삽입합니다. 이 메타데이터에는 다음의 두 가지 버전이 있습니다.
Google Play에 업로드되는 모든 앱에 대해 Google Play는 승인된 P2P 앱 공유와 같은 기능을 활성화 할 수 있도록 서명 블록 뒤에 보안 메타데이터를 추가해 왔습니다. 이는
2017년 블로그 게시물
에서 기존에 발표된 내용입니다.
App Bundle로 업로드된 앱의 경우 소스 스탬프라는 기능을 사용해 보안을 강화할 예정입니다. 이 소스 메타데이터는
bundletool
을 통해 앱의 매니페스트에 삽입됩니다. APK가 Play 서버에서 생성된 경우 앱 서명 키와 함께 Google 키로도 서명됩니다.
즉, Google 서명을 무효로 만들지 않으면 보안 메타데이터를 삭제하거나 조작할 수 없음을 의미합니다. 이를 통해 소스 스탬프가 포함되어 있으며 수정되지 않은 APK는 Google Play에서 제공한 것이라는 사실을 확신할 수 있게 됩니다.
Play에서 서버에서와 동일한 방식으로 로컬에서 오픈소스
bundletool
을 사용하여 번들에서 APK를 생성할 수 있습니다. bundletool로 추가된 소스 스탬프 메타데이터는 Google 키로 서명되지 않습니다. 다음번 Android 버전을 통해 ApkSigner가 업데이트되면 다른 소스 서명이 가능해집니다.
10. Google Play에서 앱 사용자에게 배포하는 최종 아티팩트에 액세스하려면 어떻게 해야 하나요?
다음과 같은 여러 가지 옵션을 사용할 수 있습니다.
테스트 목적인 경우 Google Play Console의
App Bundle 탐색기
에서 앱의
과거 버전
에
내부 앱 공유
링크를 사용할 수 있습니다. 기기에서 링크를 탭하면 Play 스토어에서 해당 기기에 설치할 APK가 설치됩니다.
Google Play Console의
App Bundle 탐색기
에서 서명된 기기별 APK를 다운로드할 수도 있습니다.
11. Google Play 앱 서명을 사용하려는 경우 앱을 다른 스토어에 계속 배포하려면 어떻게 해야 하나요?
여러 가지 방법으로 서로 다른 채널에서 앱을 배포할 수 있습니다. 신규 앱인지 기존 앱인지에 따라 다음과 같은 사항을 고려해야 합니다.
신규 앱의 경우 배포 채널별로 별도의 서명 키를 사용할 수 있으며 Google Play에서 개발자를 대신해 사용할 키를 Google에서 생성하도록 허용할 수 있습니다. 이는 Play에 배포되는 앱에 적용되는 가장 안전한 방법입니다. 키가 Google 서버를 벗어나지 않으며 누군가 키를 가로챌 가능성이 거의 없기 때문입니다.
여러 개의 키를 관리하고 싶지 않지만 Google Play 앱 서명의 보안 기능을 모두 활용하고 싶다면 App Bundle 탐색기에서 서명된 범용 APK를 다운로드하여 다른 스토어에 배포할 수 있습니다.
기존 앱의 경우 이미 여러 스토어에 하나의 키를 사용하고 있다면 원하는 경우 계속 이러한 방식을 고수할 수 있습니다. Google Play 앱 서명을 사용 설정하면 기존 키를 업로드하라는 메시지가 표시됩니다.
이 FAQ 윗부분에서 언급된 키 업그레이드 기능을 사용하여 Google Play에서 사용하는 키를 앞으로 다른 배포 채널과 공유하지 않는 방법도 생각해 볼 수 있습니다.
하지만 위의 방법을 사용하려면 한 가지 주의해야 할 점이 있습니다. 여러 스토어에서 별도의 서명 키를 사용하기로 했다면 사용자는 서로 다른 배포 채널을 통해 앱을 교차 업데이트할 수 없게 됩니다. 즉, 다른 스토어에서 앱을 설치한 사용자가 Play를 통해 업데이트하려고 하는 상황을 말합니다. 이러한 사용자는 애플리케이션을 제거한 다음 다시 설치해야 합니다.
12. 앱의 기능과 관련된 작업을 진행하고 있는데 위의 내용을 적용하려면 꽤 번거로울 것 같습니다. Android App Bundle로 바꿔야 할까요? 아니면 Dynamic Delivery와 같은 고급 기능을 사용해야 할까요?
아니요. 모든 일을 한 번에 처리해야 할 필요는 없습니다.
Google Play 앱 서명을 선택하고 당분간 APK를 계속 게시하세요. 준비가 된 후 Android App Bundle을 게시하기 시작하면 됩니다.
App Bundle을 지원하는 빌드 시스템에서 App Bundle로 게시하는 과정은 알기 쉬우며 대부분의 앱에 자동으로 크기 감소라는 이점을 가져다 줍니다.
시간이 지남에 따라 Dynamic Delivery와 같은 고급 기능도 활용할 수 있습니다. 앱의 경우 동적 기능 모듈을 사용하여 앱을 모듈화함으로써 빌드 시간을 개선하고 맞춤형 전송을 활용할 수 있습니다. 게임에서는 동적 애셋 전송을 사용하여 맞춤형 전송 모드 및 스마트 타겟팅 옵션으로 고품질 에셋을 설치 시 또는 설치 후에 전송할 수 있습니다.
여러분이 앱 서명을 사용하고 싶지만 내부 경영진 또는 보안팀에서 앱 서명의 이점과 주의사항에 관한 설명을 요청하는 경우, 위의 질의 응답 내역을 경영진이나 보안팀에 전달해 주세요. 또
원문
에 댓글로 질문을 남겨주시면, 되도록 답변을 드릴 수 있도록 하겠습니다.
Contents
ML/Tensorflow
Android
Flutter
Web/Chrome
Cloud
Google Play
Community
Game
Firebase
검색
Tag
인디게임페스티벌
정책 세미나
창구프로그램
AdMob
AI
Android
Android 12
Android 12L
Android 13
Android 14
Android Assistant
Android Auto
Android Games
Android Jetpack
Android Machine Learning
Android Privacy
Android Studio
Android TV
Android Wear
App Bundle
bootcamp
Business
Chrome
Cloud
Community
compose
Firebase
Flutter
Foldables
Game
gdg
GDSC
google
Google Developer Student Clubs
Google Play
Google Play Games
Interview
Jetpack
Jetpack Compose
kotlin
Large Screens
Library
ma
Material Design
Material You
ML/Tensorflow
mobile games
Now in Android
PC
Play Console
Policy
priva
wa
wear
Wearables
Web
Web/Chrome
Weeklyupdates
WorkManager
Archive
2024
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2023
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2022
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2021
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2020
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2019
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2018
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2017
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2016
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2015
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2014
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2013
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2012
12월
11월
10월
9월
8월
7월
6월
5월
3월
2월
1월
2011
12월
11월
Feed