0Pricing
Android Academy · 강의

앱 서명

키와 Play 앱 서명을 다룹니다.

앱 서명은(는) CoddyKit의 무료 Android Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Android Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Android Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

앱에 서명이 필요한 이유

Android는 앱에 디지털 서명이 없으면 설치하지 않습니다. 서명은 앱을 게시한 사람이 누구인지, 그리고 그 이후 APK가 변조되지 않았는지를 증명합니다.

특히 서명은 업데이트를 원래 앱에 연결합니다. 설치된 버전과 동일한 키로 서명한 업데이트만 허용됩니다. 그 키를 잃어버리면 앱을 다시는 업데이트할 수 없습니다.

이 학습에서는 키 저장소, 서명 설정, 그리고 Google의 더 안전한 최신 방식인 Play App Signing을 다룹니다.

키 저장소와 키

서명 ID는 키 저장소 파일(.jks 또는 .keystore)에 저장됩니다. 하나의 키 저장소에는 여러 키를 보관할 수 있으며, 각 키에는 별칭과 고유한 비밀번호가 있습니다.

  • 키 저장소 비밀번호 — 파일의 잠금을 해제합니다.
  • 키 별칭 — 키 저장소 안의 키 이름입니다.
  • 키 비밀번호 — 해당 키의 잠금을 해제합니다.

매일 실행하는 디버그 빌드는 일회용 디버그 키 저장소로 자동 서명됩니다. 릴리스에는 직접 만든 키 저장소가 필요합니다.

키 저장소 만들기

Android Studio 대화상자에서 키 저장소를 만들거나, JDK와 함께 제공되는 keytool 명령을 사용할 수 있습니다.

긴 유효 기간(25년 이상)을 설정하세요. 키가 만료되면 업데이트를 게시할 수 없습니다. RSA 2048이 표준입니다.

keytool -genkeypair \
  -v \
  -keystore release.jks \
  -alias upload \
  -keyalg RSA \
  -keysize 2048 \
  -validity 10000

signingConfigs 블록

Gradle 빌드 중 자동으로 서명하려면 signingConfigs 항목을 선언하고 release 빌드 유형에 연결하세요.

이 방법은 작동하지만 비밀번호가 빌드 파일에 그대로 표시된다는 점에 유의하세요. 다음에는 이 문제를 해결합니다.

android {
    signingConfigs {
        create("release") {
            storeFile = file("release.jks")
            storePassword = "superSecret"
            keyAlias = "upload"
            keyPassword = "superSecret"
        }
    }
    buildTypes {
        release {
            signingConfig = signingConfigs.getByName("release")
            isMinifyEnabled = true
        }
    }
}

Git에 비밀 정보 보관하지 않기

비밀번호나 키 저장소를 버전 관리 시스템에 절대 커밋하지 마세요. 대신 로컬에서 관리하며 Git이 무시하도록 설정한 keystore.properties 파일에서 읽어 오세요.

keystore.properties와 *.jks를 .gitignore에 추가하세요.

// top of app/build.gradle.kts
val keystoreProps = Properties().apply {
    val f = rootProject.file("keystore.properties")
    if (f.exists()) load(f.inputStream())
}

android {
    signingConfigs {
        create("release") {
            storeFile = file(keystoreProps["storeFile"] as String)
            storePassword = keystoreProps["storePassword"] as String
            keyAlias = keystoreProps["keyAlias"] as String
            keyPassword = keystoreProps["keyPassword"] as String
        }
    }
}

keystore.properties 파일

이에 대응하는 속성 파일은 일반적인 키=값 목록이며, Git에서 제외하고 안전한 곳(비밀번호 관리자 또는 CI 비밀 저장소)에 보관합니다.

CI 서버에서는 커밋된 파일 대신 환경 변수로 제공되는 비밀 정보로 이 값을 주입합니다.

# keystore.properties  (git-ignored!)
storeFile=release.jks
storePassword=superSecret
keyAlias=upload
keyPassword=superSecret

Play App Signing

최신 Play에서는 Play App Signing을 사용합니다. 여기서 Google은 실제 앱 서명 키를 안전한 인프라에 보관하고, 사용자에게 제공되는 APK에 이 키로 서명합니다.

개발자는 업로드 키만 관리합니다. 이 키로 번들에 서명하여 업로드하면 Play가 업로드 키를 확인하고 제거한 뒤 앱 서명 키로 다시 서명합니다.

가장 큰 장점은 업로드 키를 잃어버려도 재설정을 요청할 수 있다는 점입니다. 사용자가 신뢰하는 앱 서명 키는 Google이 안전하게 보관합니다.

업로드 키와 앱 서명 키 비교

두 키의 역할은 서로 다르므로 혼동하지 마세요.

  • 업로드 키 — 개발자의 키입니다. 업로드하는 AAB에 서명하며, 잃어버린 경우 재설정할 수 있습니다.
  • 앱 서명 키 — Google의 키(또는 개발자가 한 번 업로드한 키)입니다. 사용자가 설치하는 최종 APK에 서명하며, 영구적으로 사용됩니다.

새 앱을 등록할 때는 Google이 앱 서명 키를 생성하도록 하고, 업로드 키로 업로드에 서명하는 방법이 가장 간단합니다.

서명 확인하기

아티팩트에 어떤 방식으로 서명되었는지 확인하려면 Android SDK 빌드 도구에 포함된 apksigner를 사용하세요. 이 도구는 서명 인증서와 적용된 서명 체계(v1/v2/v3)를 보고합니다.

인증서의 SHA-256 지문을 비교하는 방법은 Firebase나 Google Sign-In과 같은 서비스에 앱을 등록할 때도 사용됩니다.

# Verify and print signer certificates of an APK
apksigner verify --print-certs app-release.apk

# Show the SHA-256 fingerprint of a keystore key
keytool -list -v -keystore release.jks -alias upload

키 보호하기

업로드 키는 교체하기 어렵고, 직접 관리하는 앱 서명 키는 교체할 수 없습니다. 두 키를 매우 중요한 보물처럼 다루세요.

  • 키 저장소를 최소 두 곳의 안전한 위치에 백업하세요.
  • 비밀번호는 소스 코드가 아닌 비밀번호 관리자에 보관하세요.
  • Play App Signing을 사용하여 업로드 키를 잃어버려도 복구할 수 있게 하세요.
  • 팀에서 키 저장소에 접근할 수 있는 사람을 제한하세요.

개발자가 키를 잃어 더 이상 업데이트를 배포할 수 없게 되어 중단된 게시 앱이 많습니다.

전체 과정 정리

전체 릴리스 서명 과정은 다음과 같습니다.

  • keytool로 업로드 키 저장소를 만듭니다.
  • keystore.properties에서 비밀 정보를 읽도록 signingConfigs에 연결합니다.
  • ./gradlew bundleRelease로 서명된 .aab를 빌드합니다.
  • Play에 업로드하면 Play가 사용자에게 제공하기 전에 앱 서명 키로 다시 서명합니다.

이제부터 모든 업데이트는 동일한 업로드 키로 서명해야 합니다.

빠른 확인

Play App Signing이 활성화된 경우 업로드할 번들에 어떤 키로 서명하며, 그 키를 잃어버리면 어떻게 되나요?

복습: 앱 서명

서명은 Android 앱을 설치하고 업데이트할 수 있게 합니다.

  • 키 저장소에는 키가 보관되며, 각 키에는 별칭과 비밀번호가 있습니다.
  • keytool로 유효 기간이 긴 키를 만들고 signingConfigs에 연결합니다.
  • keystore.properties와 .gitignore를 사용하여 비밀번호를 Git에서 제외합니다.
  • Play App Signing은 키를 재설정할 수 있는 개발자의 업로드 키와 Google이 영구적으로 보관하는 앱 서명 키로 나눕니다.
  • 키를 신중하게 백업하세요. 키를 잃으면 앱을 더 이상 운영하지 못할 수 있습니다.

다음 학습에서는 Play Console과 스토어 등록 정보를 설정하는 방법을 알아봅니다.

자주 묻는 질문

“앱 서명” 강의는 무료인가요?

네 — “앱 서명” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Android Academy 강의 전체를 잠금 해제할 수 있습니다. Android Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“앱 서명”에서 뭘 배우나요?

키와 Play 앱 서명을 다룹니다. 브라우저에서 직접 실행하는 실습 코드로 Android Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Android Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Android Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“앱 서명” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Android Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Android Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 릴리스 빌드 준비
  2. 앱 서명
  3. Play Console과 스토어 등록정보
  4. 출시 단계와 업데이트
← Android Academy(으)로 돌아가기