앱 서명

Android에서는 인증서를 사용해 디지털 방식으로 서명된 APK만 기기에 설치하거나 업데이트할 수 있습니다. Android App Bundle을 사용하여 출시하는 경우 업로드 키로 App Bundle에 서명한 후 Play Console에 업로드해야 합니다. 그러면 Play 앱 서명이 나머지 작업을 책임집니다. Play 스토어 또는 다른 스토어에서 APK를 사용하여 앱을 배포하는 경우 업로드할 APK에 직접 서명해야 합니다.

이 페이지에서는 앱 서명 및 보안과 관련된 중요한 개념을 알아봅니다. 또한 Google Play에 출시하기 위해 Android 스튜디오를 사용하여 앱에 서명하는 방법과 Play 앱 서명을 구성하는 방법도 설명합니다.

새 앱에 서명하고 앱을 Google Play에 게시하기 위한 단계는 대략적으로 다음과 같습니다.

  1. 업로드 키 및 키 저장소 생성
  2. 업로드 키로 앱 서명
  3. Play 앱 서명 구성
  4. Google Play에 앱 업로드
  5. 앱 버전 준비 및 출시

앱이 이미 기존 앱 서명 키로 Google Play 스토어에 출시되어 있거나, Google이 앱 서명 키를 생성하게 하는 대신 새 앱의 앱 서명 키를 선택하려는 경우 다음 단계를 따르세요.

  1. 앱의 서명 키를 사용하여 앱에 서명합니다.
  2. Play 앱 서명에 앱 서명 키를 업로드합니다.
  3. (권장) 향후 앱 업데이트를 위해 업로드 인증서를 생성하고 등록합니다.
  4. Google Play에 앱 업로드
  5. 앱 버전 준비 및 출시

이 페이지에서는 앱을 다른 앱 스토어에 업로드할 때 자체 키를 관리하는 방법도 알아봅니다. Android 스튜디오를 사용하지 않거나 명령줄에서 앱에 서명하려는 경우 apksigner 사용 방법을 알아보세요.

Play 앱 서명

Google에서는 Play 앱 서명으로 앱의 서명 키를 관리하고 보호하며, 배포할 APK에 서명하는 데 이 키를 사용합니다. App Bundle은 APK를 Google Play 스토어에 빌드하고 서명하는 것을 지연시키므로 App Bundle을 업로드하기 전에 Play 앱 서명을 구성해야 합니다. 이렇게 하면 다음과 같은 이점이 있습니다.

  • Android App Bundle을 사용하고 Google Play의 고급 전송 모드를 지원합니다. Android App Bundle을 사용하면 앱 크기가 훨씬 작아지고 출시가 더 간단해지며 기능 모듈을 사용하여 인스턴트 환경을 제공할 수 있습니다.
  • 서명 키의 보안이 강화되고 별도의 업로드 키를 사용하여 Google Play에 업로드하는 App Bundle에 서명할 수 있습니다.
  • 기존 서명 키가 도용되었거나 더 강력한 암호화가 적용된 키로 이전해야 하는 경우 키 업그레이드를 통해 앱 서명 키를 변경할 수 있습니다.

Play 앱 서명은앱 서명 키업로드 키라는 두 가지 키를 사용하며 키 및 키 저장소에 관한 섹션에서 이 키를 자세히 설명합니다. 업로드 키는 개발자가 보관하다가 앱을 Google Play 스토어에 업로드하기 위해 서명할 때 사용합니다. Google이 업로드 인증서를 사용하여 개발자의 신원을 확인하고, 배포를 위해 개발자의 앱 서명 키로 APK에 서명합니다(그림 1 참고). 별도의 업로드 키를 사용하면 키를 분실하거나 키가 도용되었을 때 업로드 키 재설정을 요청할 수 있습니다.

반면 Play 앱 서명을 선택하지 않은 앱은 서명 키를 분실하면 앱을 업데이트할 수 없습니다.

그림 1. Play 앱 서명으로 앱에 서명

서명 키는 Google에서 자체 키를 저장하는 데 사용하는 인프라와 동일한 인프라에 저장되며, 이 인프라에서 키는 Google의 키 관리 서비스로 보호됩니다. Google의 기술 인프라에 관해 자세히 알아보려면 Google Cloud 보안 백서를 참고하세요.

Play 앱 서명을 사용할 때 업로드 키를 분실하거나 키가 도용된 경우 Play Console에서 업로드 키 재설정을 요청할 수 있습니다. 앱 서명 키는 Google에 의해 보호되므로, 업로드 키를 변경하더라도 원래 앱의 업데이트로 새로운 앱 버전을 계속 업로드할 수 있습니다. 자세한 내용은 분실했거나 도용된 비공개 업로드 키 재설정을 참고하세요.

다음 섹션에서는 앱 서명 및 보안과 관련된 몇 가지 중요한 용어와 개념을 설명합니다. 다음 섹션을 건너뛰고 Google Play 스토어에 업로드하기 위해 앱을 준비하는 방법을 알아보려면 출시할 앱에 서명을 참고하세요.

키 저장소, 키, 인증서

자바 키 저장소(.jks 또는 .keystore)는 인증서와 비공개 키의 저장소 역할을 하는 바이너리 파일입니다.

디지털 인증서 또는 ID 인증서라고도 하는 공개키 인증서(.der 또는 .pem 파일)에는 공개 키/비공개 키 쌍의 공개 키 그리고 상응하는 비공개 키를 보유하고 있는 소유자를 식별하는 기타 메타데이터(예: 이름, 위치)가 포함되어 있습니다.

다음은 알고 있어야 하는 다양한 유형의 키입니다.

  • 앱 서명 키: 사용자의 기기에 설치된 APK에 서명하는 데 사용하는 키입니다. Android의 보안 업데이트 모델에 포함된 서명 키는 앱의 전체 기간 동안 변경되지 않습니다. 앱 서명 키는 공개되지 않으며 반드시 기밀로 유지해야 합니다. 하지만 앱 서명 키를 사용하여 생성한 인증서는 공유할 수 있습니다.
  • 업로드 키: Google Play에서 앱 서명을 위해 업로드하기 전에 App Bundle이나 APK에 서명하는 데 사용하는 키입니다. 업로드 키는 반드시 기밀로 유지해야 합니다. 하지만 업로드 키를 사용하여 생성된 인증서는 공유할 수 있습니다. 다음 방법 중 하나로 업로드 키를 생성할 수 있습니다.

    • Google에서 앱 서명 키를 대신 생성하도록 선택할 경우 출시할 앱에 서명할 때 사용하는 키가 업로드 키로 지정됩니다.
    • 신규 또는 기존 앱을 선택할 때 Google에 앱 서명 키를 제공할 경우 보안 강화를 위해 선택 단계에서 또는 나중에 새로운 업로드 키를 생성할 수 있습니다.
    • 새로운 업로드 키를 생성하지 않으면 앱 서명 키를 업로드 키로 계속 사용하여 각 출시에 서명하게 됩니다.

    도움말: 키를 안전하게 보관하려면 앱 서명 키와 별도로 업로드 키를 만드는 것이 좋습니다.

API 제공업체와 작업

Play Console출시 > 설정 > 앱 서명 페이지에서 앱 서명 키와 업로드 키의 인증서를 다운로드할 수 있습니다. 인증서는 API 제공업체에 공개 키를 등록하는 데 사용되며, 비공개 키가 포함되어 있지 않으므로 공유 목적으로 사용됩니다.

인증서 지문은 짧고 고유한 인증서 표현식으로 API 제공업체가 패키지 이름과 함께 요청하는 경우가 많습니다. 앱을 제공업체 서비스에 등록하는 데 사용됩니다. 업로드 및 앱 서명 인증서의 MD5, SHA-1 및 SHA-256 지문은 Play Console의 앱 서명 페이지에서 찾을 수 있습니다. 같은 페이지에서 원본 인증서(.der)를 다운로드하여 다른 지문을 계산할 수도 있습니다.

디버그 빌드 서명

IDE에서 프로젝트를 실행하거나 디버그할 때 Android 스튜디오는 Android SDK 도구에서 생성된 디버그 인증서를 사용하여 앱에 자동으로 서명합니다. Android 스튜디오에서 프로젝트를 처음 실행하거나 디버그하면 IDE가 자동으로 $HOME/.android/debug.keystore에 디버그 키 저장소와 인증서를 만들고 키 저장소 비밀번호와 키 비밀번호를 설정합니다.

디버그 인증서는 빌드 도구에서 생성하고 설계상 보안이 유지되지 않으므로 Google Play 스토어를 포함한 대부분의 앱 스토어는 디버그 인증서로 서명된 앱을 게시할 수 있도록 허용하지 않습니다.

Android 스튜디오는 서명 구성에 디버그 서명 정보를 자동으로 저장하므로 디버그할 때마다 서명 정보를 입력할 필요가 없습니다. 서명 구성은 키 저장소 위치, 키 저장소 비밀번호, 키 이름 및 키 비밀번호를 비롯하여 앱에 서명하는 데 필요한 모든 정보가 들어 있는 객체입니다.

디버그할 앱을 빌드하고 실행하는 방법에 관한 자세한 내용은 앱 빌드 및 실행을 참고하세요.

디버그 인증서 만료

디버깅할 앱에 서명하는 데 사용되는 자체 서명된 인증서의 만료일은 생성일로부터 30년입니다. 인증서가 만료되면 빌드 오류가 발생합니다.

이 문제를 해결하려면 다음 위치 중 하나에 저장된 debug.keystore 파일을 삭제하면 됩니다.

  • OS X 및 Linux: ~/.android/
  • Windows XP: C:\Documents and Settings\user\.android\
  • Windows Vista 및 Windows 7, 8, 10: C:\Users\user\.android\

다음에 앱의 디버그 버전을 빌드하고 실행할 때 Android 스튜디오에서 새 키 저장소와 디버그 키를 다시 생성합니다.

Google Play에 출시할 앱 서명

앱을 게시할 준비가 되면 앱에 서명하고 Google Play와 같은 앱 스토어에 업로드해야 합니다. 앱을 Google Play에 처음 게시하는 경우 Play 앱 서명도 구성해야 합니다. Play 앱 서명은 2021년 8월 이전에 만들어진 앱에는 선택사항입니다. 이 섹션에서는 출시할 앱에 올바르게 서명하고 Play 앱 서명을 구성하는 방법을 설명합니다.

업로드 키 및 키 저장소 생성

Play 앱 서명을 구성할 때 유용한 업로드 키가 아직 없다면 다음과 같이 Android 스튜디오를 사용하여 생성할 수 있습니다.

  1. 메뉴 바에서 Build > Generate Signed Bundle/APK를 클릭합니다.
  2. Generate Signed Bundle or APK 대화상자에서 Android App Bundle 또는APK를 선택하고 Next를 클릭합니다.
  3. Key store path 필드 아래에서 Create new를 클릭합니다.
  4. 그림 2에 표시된 것처럼 New Key Store 창에서 다음과 같은 키 저장소 및 키의 정보를 입력합니다.

    그림 2. Android 스튜디오에서 새 업로드 키 및 키 저장소 생성

  5. 키 저장소

    • Key store path: 키 저장소를 생성할 위치를 선택합니다. 또한 파일 이름은 위치 경로의 끝에 .jks 확장자와 함께 추가해야 합니다.
    • Password: 키 저장소에 사용할 보안 비밀번호를 생성하고 확인합니다.
    • Alias: 키를 식별할 수 있는 이름을 입력합니다.
    • Password: 키에 사용할 보안 비밀번호를 생성하고 확인합니다. 이 비밀번호는 키 저장소 비밀번호와 동일해야 합니다. 자세한 내용은 알려진 문제를 참고하세요.
    • Validity (years): 키가 유효하게 유지되는 기간(년)을 설정합니다. 키가 최소 25년 동안 유효하게 유지되어야 앱 수명 동안 같은 키로 앱 업데이트에 서명할 수 있습니다.
    • Certificate: 인증서에 사용할 본인 관련 정보를 입력합니다. 이 정보는 앱에 표시되지 않지만 APK의 일부로 인증서에 포함됩니다.
  6. 양식을 작성하고 나면 OK를 클릭합니다.

  7. 업로드 키를 사용하여 앱을 빌드하고 서명하려면 업로드 키로 앱에 서명하는 방법에 관한 섹션으로 계속 진행하세요. 키와 키 저장소만 생성하려면 Cancel을 클릭합니다.

키로 앱에 서명

업로드 키가 이미 있다면 그 키를 사용해 앱에 서명합니다. 앱이 이미 기존 앱 서명 키로 서명되어 Google Play 스토어에 게시되어 있다면 이 키를 사용하여 앱에 서명합니다. 나중에 Google Play로 별도의 업로드 키를 생성 및 등록하여 앱의 후속 업데이트에 서명하고 업로드할 수 있습니다.

Android 스튜디오를 사용하여 앱에 서명하려면 다음 단계를 따르세요.

  1. 아직 Generate Signed Bundle or APK 대화상자가 열려 있지 않다면 Build > Generate Signed Bundle/APK를 클릭합니다.
  2. Generate Signed Bundle or APK 대화상자에서 Android App Bundle 또는 APK를 선택하고 Next를 클릭합니다.
  3. 드롭다운에서 모듈을 선택합니다.
  4. 키 저장소 경로와 키의 별칭을 지정하고 키 저장소 및 키 별칭의 비밀번호를 입력합니다. 아직 업로드 키 저장소와 키가 준비되지 않았다면 먼저 업로드 키와 키 저장소를 생성한 다음 돌아와서 이 단계를 완료합니다.

    그림 3. 업로드 키로 앱에 서명

  5. 다음을 클릭합니다.

  6. 다음 창에서(그림 4 참고) 서명된 앱의 대상 폴더를 선택하고 빌드 유형을 선택한 다음 적용되는 경우 제품 버전을 선택합니다.

  7. APK를 빌드하고 서명하는 경우 앱에서 지원하려는 서명 버전을 선택해야 합니다. 자세한 내용은 앱 서명 체계를 참고하세요.

  8. 만들기를 클릭합니다.

그림 5. 팝업에서 링크를 클릭하여 App Bundle을 분석하거나 검색합니다.

Android 스튜디오가 서명된 앱 빌드를 마치고 나면 팝업 알림의 적절한 옵션을 클릭하여 앱을 검색하거나 분석할 수 있습니다(그림 5 참고).

이제 앱을 Play 앱 서명에 등록하고 출시를 위해 앱을 업로드할 준비가 되었습니다. 앱 게시 과정을 잘 모르겠다면 출시 개요를 참고하세요. 잘 알고 있다면 Play Console에 앱을 업로드하는 방법에 관한 페이지로 계속 진행하세요.

Play 앱 서명 사용

이 페이지의 앞부분에서 설명한 것처럼 Play 앱 서명을 구성해야 Google Play를 통해 배포할 앱에 서명할 수 있습니다. 단, 2021년 8월 이전에 만들어진 앱은 예외로 자체 서명 APK를 계속 배포할 수 있습니다. 밟아야 할 단계는 앱이 아직 Google Play에 게시되지 않았는지 또는 앱이 이미 기존 앱 서명 키로 서명되어 2021년 8월 이전에 게시되었는지에 따라 다릅니다.

새 앱 구성

아직 Google Play에 게시되지 않은 앱의 서명을 구성하려면 다음 단계를 따르세요.

  1. 아직 업로드 키를 생성하지 않았다면 업로드 키를 생성하고 이 업로드 키로 앱에 서명합니다.
  2. Play Console에 로그인합니다.
  3. 버전을 준비 및 출시하기 위한 단계에 따라 새 버전을 생성합니다.
  4. 출시 트랙을 선택한 후 다음과 같이 App signing 섹션에서 앱 서명을 구성합니다.
    • Google Play에서 대신 앱 서명 키를 생성하여 앱에 서명하는 데 사용하려면 어떤 작업도 실행하지 않아도 됩니다. 첫 번째 버전에 서명할 때 사용한 키가 업로드 키가 되며 차후 버전에 서명할 때도 이 키를 사용해야 합니다.
    • 개발자 계정의 다른 앱과 같은 키를 사용하려면 Change app signing key > Use the same key as another app in this account를 선택하고 앱을 선택한 후 Continue를 클릭합니다.
    • 앱에 서명할 때 Google이 사용할 자체 서명 키를 제공하려면 Change app signing key를 선택하고 비공개 키와 공개 인증서를 안전하게 업로드할 수 있는 Export and upload옵션 중 하나를 선택합니다.

App Bundles 섹션에서 Browse files를 클릭하여 업로드 키로 서명한 앱을 찾아 업로드합니다. 앱 출시에 관한 자세한 내용은 버전 준비 및 출시를 참고하세요. Play 앱 서명을 구성한 후 앱을 출시하면 Google Play에서 앱의 서명 키를 생성(기존 키를 업로드한 경우 제외)하고 관리합니다. Google Play에 향후 앱 업데이트를 업로드하기 전에 앱의 업로드 키를 사용하여 업데이트에 서명하세요.

앱의 새 업로드 키를 생성해야 하는 경우 분실했거나 도용된 비공개 업로드 키 재설정 방법을 안내하는 섹션으로 이동하세요.

기존 앱 선택

기존 앱 서명 키를 사용하여 이미 Google Play에 게시한 앱을 업데이트하는 경우 다음과 같이 Play 앱 서명을 선택할 수 있습니다.

  1. Play Console에 로그인하여 앱으로 이동합니다.
  2. 왼쪽 메뉴에서 출시 > 설정 > 앱 서명을 클릭합니다.
  3. 해당하는 경우 서비스 약관을 검토하고 동의를 선택합니다.
  4. Google Play에 업로드하려는 서명 키를 가장 잘 설명한 옵션을 선택하고 표시되는 안내를 따릅니다. 예를 들어 서명 키에 Java 키 저장소를 사용하는 경우 Upload a new app signing key from Java Keystore를 선택하고 안내에 따라 PEPK 도구를 다운로드하여 실행한 다음 생성된 파일을 암호화된 키와 함께 업로드합니다.
  5. Enroll을 클릭합니다.

이제 앱의 서명 및 업로드 인증서를 자세히 설명하는 페이지가 표시됩니다. 이제 Google Play는 사용자에게 앱을 배포할 때 기존 키로 앱에 서명합니다. 그러나 Play 앱 서명의 가장 중요한 이점 중 하나는 Google Play에 업로드하는 아티팩트에 서명하는 데 개발자가 사용하는 키와 Google Play에서 사용자에게 배포할 앱에 서명하는 데 사용하는 키를 구별하는 기능입니다. 그러므로 다음 섹션의 단계를 따라 별도의 업로드 키를 생성하고 등록해 보세요.

업로드 인증서 생성 및 등록

업로드 키로 서명하지 않은 앱을 게시하면 Google Play Console에서 앱의 향후 업데이트를 위해 키를 등록할 수 있는 옵션을 제공합니다. 이는 선택사항이지만 Google Play가 사용자에게 앱을 배포하는 데 사용하는 것과는 다른 키로 앱을 게시하는 것이 좋습니다. 이렇게 하면 Google에서 서명 키를 안전하게 보호하며, 개발자는 분실했거나 도용된 비공개 업로드 키를 재설정할 수 있습니다. 이 섹션에서는 업로드 키를 생성하고 여기에서 인증서를 업로드하며 향후 앱 업데이트를 위해 Google Play로 인증서를 등록하는 방법을 설명합니다.

다음과 같은 경우 Play Console에서 업로드 인증서를 등록할 수 있는 옵션이 표시됩니다.

  • 서명 키로 서명한 새 앱을 게시하고 Play 앱 서명에 등록하는 경우
  • 이미 Play 앱 서명에 등록되었지만 자체 서명 키로 서명된 기존 앱을 게시할 준비가 된 경우

이미 Play 앱 서명에 등록되어 있는 기존 앱의 업데이트를 게시하지 않고 업로드 인증서를 등록하려면 아래 단계를 완료하고 분실했거나 도용된 비공개 업로드 키 재설정 방법을 안내하는 섹션으로 진행하세요.

아직 업로드 키 및 키 저장소를 생성하지 않았다면 업로드 키 및 키 저장소를 생성하세요.

업로드 키와 키 저장소를 생성한 후 다음 명령어와 함께 keytool을 사용하여 업로드 키에서 공개 인증서를 생성해야 합니다.

$ keytool -export -rfc
  -keystore your-upload-keystore.jks
  -alias upload-alias
  -file output_upload_certificate.pem

이제 업로드 인증서가 생성되었으므로 Play Console에 메시지가 표시되거나 업로드 키를 재설정할 때 Google에 등록하세요.

앱 서명 키 업그레이드

기존 앱 서명 키를 변경해야 하는 경우도 있습니다. 예를 들면 암호화가 더 강력한 키가 필요하거나 서명 키가 도용될 수 있습니다. 하지만 업데이트가 동일한 서명 키로 서명된 경우에만 사용자가 앱을 업데이트할 수 있으므로 이미 게시된 앱의 서명 키를 변경하는 것은 어렵습니다.

앱을 Google Play에 게시하는 경우 Play Console을 통해 게시된 앱에 맞게 서명 키를 업그레이드할 수 있습니다. 새로운 키는 Android 13 이상에서 설치 및 앱 업데이트에 서명하는 데 사용되고 기존 앱 서명 키는 이전 버전의 Android 사용자를 위한 업데이트에 서명하는 데 사용됩니다.

자세한 내용은 앱 서명 키 업그레이드를 참고하세요.

분실했거나 도용된 비공개 업로드 키 재설정

비공개 업로드 키를 분실했거나 비공개 키가 도용됐다면 새 키를 만들고 Play Console에서 업로드 키 재설정을 요청하면 됩니다.

앱에 자동으로 서명하도록 빌드 프로세스 구성

Android 스튜디오에서 서명 구성을 생성하고 이 구성을 출시 빌드 유형에 할당하여 빌드 프로세스 중에 앱의 출시 버전에 자동으로 서명하도록 프로젝트를 구성할 수 있습니다. 서명 구성은 키 저장소 위치, 키 저장소 비밀번호, 키 별칭 및 키 비밀번호로 구성됩니다. Android 스튜디오를 사용하여 서명 구성을 생성하고 이 구성을 출시 빌드 유형에 할당하려면 다음 단계를 완료하세요.

  1. Project 창에서 앱을 마우스 오른쪽 버튼으로 클릭하고 Open Module Settings를 클릭합니다.
  2. 왼쪽 패널의 Modules 아래에 있는 Project Structure 창에서 서명하려는 모듈을 클릭합니다.
  3. Signing 탭을 클릭한 후 Add 를 클릭합니다.
  4. 키 저장소 파일을 선택하고 이 서명 구성의 이름을 입력한 다음(두 개 이상 생성할 수 있으므로) 필수 정보를 입력합니다.

    그림 7. 새로운 서명 구성을 생성할 수 있는 창

  5. Build Types 탭을 클릭합니다.
  6. release 빌드를 클릭합니다.
  7. Signing Config에서 방금 생성한 서명 구성을 선택합니다.

    그림 8. Android 스튜디오에서 서명 구성 선택

  8. OK를 클릭합니다.

이제 Android 스튜디오에서 Build > Build Bundle(s) / APK(s) 아래의 옵션을 선택하여 출시 빌드 유형을 빌드할 때마다 IDE가 자동으로 앱에 서명하며, 이때 개발자가 지정한 서명 구성을 사용합니다. 서명된 APK나 App Bundle은 빌드하는 모듈의 프로젝트 디렉터리에 있는 build/outputs/ 디렉터리에서 찾을 수 있습니다.

서명 구성을 생성하면 서명 정보가 Gradle 빌드 파일에 일반 텍스트로 포함됩니다. 팀으로 작업하거나 코드를 공개적으로 공유하는 경우에는 빌드 파일에서 서명 정보를 삭제하고 별도로 저장하여 서명 정보를 안전하게 보호해야 합니다. 빌드 파일에서 서명 정보를 삭제하는 방법에 관한 자세한 내용은 빌드 파일에서 서명 정보 삭제를 참고하세요. 서명 정보를 안전하게 유지하는 방법에 관한 자세한 내용은 아래의 키 보호를 참고하세요.

각 제품 버전에 별도로 서명

앱이 제품 버전을 사용하고 각 제품 버전에 별도로 서명하려는 경우 버전별로 추가 서명 구성을 생성하여 할당할 수 있습니다.

  1. Project 창에서 앱을 마우스 오른쪽 버튼으로 클릭하고 Open Module Settings를 클릭합니다.
  2. 왼쪽 패널의 Modules 아래에 있는 Project Structure 창에서 서명하려는 모듈을 클릭합니다.
  3. Signing 탭을 클릭한 후 Add 를 클릭합니다.
  4. 키 저장소 파일을 선택하고 이 서명 구성의 이름을 입력한 다음(두 개 이상 생성할 수 있으므로) 필수 정보를 입력합니다.

    그림 10. 새로운 서명 구성을 생성할 수 있는 창

  5. 모든 서명 구성을 생성할 때까지 필요에 따라 3단계와 4단계를 반복합니다.
  6. Flavors 탭을 클릭합니다.
  7. 구성할 버전을 클릭한 후 Signing Config 드롭다운 메뉴에서 적합한 서명 구성을 선택합니다.

    그림 11. 제품 버전별로 서명 설정 구성

    추가 제품 버전을 구성하려면 이 단계를 반복합니다.

  8. OK를 클릭합니다.

Gradle 구성 파일에서 서명 설정을 지정할 수도 있습니다. 자세한 내용은 서명 설정 구성을 참고하세요.

서명 보고서 실행

앱의 각 변형에 관한 서명 정보를 가져오려면 다음과 같이 Android 스튜디오에서 Gradle signingReport 작업을 실행하세요.

  1. View > Tool Windows > Gradle을 선택하여 Gradle 도구 창을 엽니다.
  2. YourApp > Tasks > android > signingReport를 선택하여 보고서를 실행합니다.

자체 서명 키 관리

Play 앱 서명을 선택하지 않더라도(2021년 8월 이전에 만들어진 앱만 해당) 자체 앱 서명 키와 키 저장소를 관리할 수 있습니다. 이 경우 개발자가 이 키와 키 저장소를 보호해야 합니다. 또한 앱은 Android App Bundle, Play Feature Delivery, Play Asset Delivery를 지원할 수 없습니다.

자체 키와 키 저장소를 생성할 준비가 되면 먼저 키 저장소에 안전한 비밀번호와 키 저장소에 저장된 각 비공개 키에 별도의 안전한 비밀번호를 선택해야 합니다. 키 저장소는 안전하고 보안이 유지되는 장소에 보관해야 합니다. 앱 서명 키의 액세스 권한을 분실하거나 키가 도용당한 경우 Google에서는 앱 서명 키를 검색할 수 없으므로 앱의 새 버전을 원래 앱의 업데이트로 사용자에게 출시할 수 없습니다. 자세한 내용은 아래의 키 보호를 참고하세요.

자체 앱 서명 키와 키 저장소를 관리하는 경우, APK에 서명할 때 앱 서명 키를 사용하여 로컬로 서명하고 이 서명된 APK를 Google Play 스토어에 직접 업로드하여 배포합니다(그림 12 참고).

그림 12. 자체 앱 서명 키를 관리하는 경우 앱에 서명

Play 앱 서명을 사용할 때 Google에서는 서명 키를 안전하게 보관하고 앱이 올바르게 서명되어 앱 수명 동안 업데이트를 받을 수 있는지 확인합니다. 하지만 앱 서명 키를 직접 관리하기로 했다면 다음과 같은 몇 가지 사항을 고려해야 합니다.

서명 고려사항

앱은 앱의 예상 수명 동안 같은 인증서로 서명해야 합니다. 그렇게 해야 하는 이유는 다음과 같습니다.

  • 앱 업그레이드: 시스템이 앱에 업데이트를 설치할 때 기존 버전의 인증서와 새 버전의 인증서를 비교합니다. 시스템은 인증서가 일치하면 업데이트를 허용합니다. 다른 인증서로 새 버전에 서명하는 경우 이 앱에 다른 패키지 이름을 할당해야 합니다. 이 경우, 사용자는 완전히 새로운 앱으로 새 버전을 설치합니다.
  • 앱 모듈성: Android는 앱이 요청할 경우 같은 인증서로 서명된 APK가 같은 프로세스에서 실행되도록 허용하므로 시스템은 이러한 APK를 단일 앱으로 취급합니다. 이런 식으로 앱을 모듈에 배포할 수 있고, 사용자는 각 모듈을 독립적으로 업데이트할 수 있습니다.
  • 권한을 통한 코드/데이터 공유: Android는 서명 기반의 권한 시행을 제공합니다. 그러면 앱이 지정된 인증서로 서명된 다른 앱에 기능을 노출할 수 있습니다. 같은 인증서로 여러 APK에 서명하고 서명 기반 권한 검사를 사용하면 앱이 코드와 데이터를 안전하게 공유할 수 있습니다.

앱의 업그레이드를 지원하려면 앱 서명 키의 유효 기간이 앱의 예상 수명보다 길게 설정되었는지 확인하세요. 25년 이상의 유효 기간이 권장됩니다. 키의 유효 기간이 만료되면 사용자가 더 이상 앱의 새 버전으로 원활하게 업그레이드할 수 없습니다.

Google Play에 앱을 게시할 계획이라면 앱에 서명하는 데 사용하는 키의 유효 기간이 2033년 10월 22일 이후에 종료되어야 합니다. Google Play는 새 버전이 출시될 때 사용자가 앱을 원활하게 업그레이드할 수 있도록 하기 위해 이 요구사항을 시행하고 있습니다.

키 보호

Play 앱 서명을 선택하는 대신 앱 서명 키와 키 저장소를 직접 관리하고 보호하려면 개발자와 사용자 모두를 위해 앱 서명 키를 안전하게 보호해야 합니다. 다른 사람이 내 키를 사용할 수 있도록 허용하거나 키 저장소와 비밀번호를 제3자가 찾아서 사용할 수 있는 안전하지 않은 장소에 보관할 경우 작성자의 신원이 도용되고 사용자의 신뢰가 손상될 수 있습니다.

제3자가 개발자 모르게 또는 개발자의 허가를 받지 않고 앱 서명 키를 취할 수 있는 경우 제3자가 진짜 앱을 악의적으로 대체하거나 손상시키는 앱에 서명한 후 이 앱을 배포할 수 있습니다. 제3자는 개발자의 신원을 도용하여 다른 앱이나 시스템 자체를 공격하는 앱에 서명한 후 배포할 수 있고, 사용자 데이터를 손상시키거나 훔칠 수도 있습니다.

비공개 키는 앱의 모든 향후 버전에 서명할 때 필요합니다. 키를 분실하거나 잘못 보관하면 기존 앱의 업데이트를 게시할 수 없습니다. 이전에 생성된 키를 다시 생성할 수는 없습니다.

개발자의 평판은 앱 서명 키가 만료될 때까지 항상 이 키를 제대로 보호하느냐에 달려 있습니다. 다음은 키를 안전하게 보호하는 몇 가지 팁입니다.

  • 키 저장소와 키에 안전한 비밀번호를 선택하세요.
  • 비공개 키를 다른 사람에게 주거나 빌려주지 마세요. 승인되지 않은 사람에게 키 저장소와 키 비밀번호를 알려주지 마세요.
  • 비공개 키가 있는 키 저장소 파일을 안전하고 보안이 유지되는 장소에 보관하세요.

일반적으로 키를 생성, 사용 및 저장할 때 일반 상식에 따라 예방 조치를 취하기만 해도 보안을 유지할 수 있습니다.

빌드 파일에서 서명 정보 삭제

서명 구성을 생성하면 Android 스튜디오가 서명 정보를 일반 텍스트로 모듈의 build.gradle 파일에 추가합니다. 팀으로 작업하거나 코드를 오픈소스로 제공하는 경우 이러한 민감한 정보를 빌드 파일에서 제거하여 다른 사람들이 쉽게 액세스할 수 없도록 해야 합니다. 이렇게 하려면 보안 정보를 저장할 별도의 속성 파일을 생성하고 다음과 같이 빌드 파일에서 이 파일을 참조해야 합니다.

  1. 서명 구성을 생성한 후 하나 이상의 빌드 유형에 할당합니다. 이 안내에서는 위의 앱에 자동으로 서명하도록 빌드 프로세스 구성의 설명에 따라 출시 빌드 유형에 하나의 서명 구성을 설정했다고 가정합니다.
  2. 프로젝트의 루트 디렉터리에 keystore.properties라는 이름의 파일을 생성합니다. 이 파일에는 다음과 같이 서명 정보가 포함되어 있어야 합니다.
    storePassword=myStorePassword
    keyPassword=mykeyPassword
    keyAlias=myKeyAlias
    storeFile=myStoreFileLocation
    
  3. 모듈의 build.gradle 파일에서 keystore.properties 파일을 로드하는 코드를 android {} 블록 앞에 추가합니다.

    Groovy

    ...
    
    // Create a variable called keystorePropertiesFile, and initialize it to your
    // keystore.properties file, in the rootProject folder.
    def keystorePropertiesFile = rootProject.file("keystore.properties")
    
    // Initialize a new Properties() object called keystoreProperties.
    def keystoreProperties = new Properties()
    
    // Load your keystore.properties file into the keystoreProperties object.
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    
    android {
        ...
    }
    

    Kotlin

    ...
    import java.util.Properties
    import java.io.FileInputStream
    
    // Create a variable called keystorePropertiesFile, and initialize it to your
    // keystore.properties file, in the rootProject folder.
    val keystorePropertiesFile = rootProject.file("keystore.properties")
    
    // Initialize a new Properties() object called keystoreProperties.
    val keystoreProperties = Properties()
    
    // Load your keystore.properties file into the keystoreProperties object.
    keystoreProperties.load(FileInputStream(keystorePropertiesFile))
    
    android {
        ...
    }
    

    참고: 다른 위치에 keystore.properties 파일을 저장할 수 있습니다. 예를 들어 프로젝트의 루트 폴더 대신 모듈 폴더에 저장하거나 지속적 통합 도구를 사용하는 경우 빌드 서버에 저장할 수 있습니다. 이 경우 실제 keystore.properties 파일의 위치를 사용하여 keystorePropertiesFile을 올바르게 초기화하도록 위 코드를 수정해야 합니다.

  4. keystoreProperties['propertyName'] 구문을 사용하여 keystoreProperties에 저장된 속성을 참조할 수 있습니다. 다음 구문을 사용하여 keystoreProperties에 저장된 서명 정보를 참조하도록 모듈의 build.gradle 파일에서 signingConfigs 블록을 수정합니다.

    Groovy

    android {
        signingConfigs {
            config {
                keyAlias keystoreProperties['keyAlias']
                keyPassword keystoreProperties['keyPassword']
                storeFile file(keystoreProperties['storeFile'])
                storePassword keystoreProperties['storePassword']
            }
        }
        ...
      }

    Kotlin

    android {
        signingConfigs {
            create("config") {
                keyAlias = keystoreProperties["keyAlias"] as String
                keyPassword = keystoreProperties["keyPassword"] as String
                storeFile = file(keystoreProperties["storeFile"] as String)
                storePassword = keystoreProperties["storePassword"] as String
            }
        }
        ...
      }
  5. Build Variants 도구 창을 열고 출시 빌드 유형이 선택되었는지 확인합니다.
  6. Build > Build Bundle(s) / APK(s)에서 옵션을 선택하여 출시 빌드의 APK 또는 App Bundle을 빌드합니다. 빌드 출력은 모듈의 build/outputs/ 디렉터리에서 확인할 수 있습니다.

빌드 파일에 더 이상 민감한 정보가 포함되어 있지 않으므로 빌드 파일을 소스 제어에 포함하거나 공유 코드베이스에 업로드할 수 있습니다. keystore.properties 파일을 안전하게 보호해야 합니다. 보호를 위해 소스 제어 시스템에서 이 파일을 삭제해야 할 수도 있습니다.