블록 스토어

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

많은 사용자가 새 Android 기기를 설정할 때 여전히 자체 사용자 인증 정보를 관리합니다. 이러한 수동 프로세스는 까다로울 수 있으며 사용자 환경이 저하되는 경우가 많습니다. Google Play 서비스에서 제공하는 라이브러리인 Block Store API는 앱이 사용자 비밀번호 저장과 관련된 복잡성이나 보안 위험 없이 사용자 인증 정보를 저장할 수 있는 방법을 제공하여 이 문제를 해결하고자 합니다.

Block Store API를 사용하면 앱에서 나중에 사용자 인증 정보를 저장하여 나중에 새 기기에서 사용자를 재인증할 수 있습니다. 이렇게 하면 사용자가 새 기기에서 처음으로 앱을 실행할 때 로그인 화면이 표시되지 않으므로 사용자에게 더 원활한 환경을 제공하는 데 도움이 됩니다.

블록 스토어 사용 시 다음과 같은 이점이 있습니다.

  • 개발자를 위한 암호화된 사용자 인증 정보 저장소 솔루션입니다. 사용자 인증 정보는 가능한 경우 엔드 투 엔드 암호화됩니다.
  • 사용자 이름과 비밀번호 대신 토큰을 저장합니다.
  • 로그인 흐름에서 장애 요소 제거
  • 복잡한 비밀번호를 관리해야 하는 수고를 덜어줍니다.
  • Google에서 사용자의 신원을 확인합니다.

시작하기 전에

앱을 준비하려면 다음 섹션의 단계를 완료합니다.

앱 구성

프로젝트 수준의 build.gradle 파일에서 buildscriptallprojects 섹션에 Google Maven 저장소를 포함합니다.

buildscript {
  repositories {
    google()
    mavenCentral()
  }
}

allprojects {
  repositories {
    google()
    mavenCentral()
  }
}

Google Gradle 빌드 파일(일반적으로 app/build.gradle)에 Block Store API의 Google Play 서비스 종속 항목을 추가합니다.

dependencies {
  implementation 'com.google.android.gms:play-services-auth-blockstore:16.1.0'
}

사용 방법

블록 저장소는 엔드 투 엔드 암호화 및 백업 및 복원 인프라 위에 구축되는 토큰 기반 로그인 메커니즘입니다. 다음 단계는 블록 스토어를 활용하는 앱의 작동 방식을 설명합니다.

  1. 앱의 인증 흐름 도중이나 그 이후에도 언제든지 사용자의 인증 토큰을 블록 스토어에 저장하여 나중에 검색할 수 있습니다.
  2. 토큰은 로컬에 저장되며 가능하면 클라우드에 엔드 투 엔드 암호화하여 백업할 수 있습니다.
  3. 사용자가 새 기기에서 복원 흐름을 시작할 때 데이터가 전송됩니다.
  4. 사용자가 복원 흐름 중에 앱을 복원하면 앱은 새 기기의 블록 저장소에서 저장된 토큰을 검색할 수 있습니다.

토큰 저장

사용자가 앱에 로그인하면 해당 사용자를 위해 생성한 인증 토큰을 블록 스토어에 저장할 수 있습니다. 이 작업은 StoreBytesData.Builder 인스턴스에서 setBytes()를 호출하여 사용자의 사용자 인증 정보를 소스 기기에 저장합니다. 블록 저장소에 토큰을 저장하면 토큰이 암호화되어 기기에 로컬로 저장됩니다.

다음 샘플은 인증 토큰을 로컬 기기에 저장하는 방법을 보여줍니다.

val client = Blockstore.getClient(this)
val data = StoreBytesData.Builder()
        .setBytes(/* BYTE_ARRAY */)
        .build()
client.storeBytes(data)
        .addOnSuccessListener{ result ->
            Log.d(TAG, "Stored: ${result} bytes")
        }
        .addOnFailureListener { e ->
            Log.e(TAG, “Failed to store bytes”, e)
        }

토큰 검색

나중에 사용자가 새 기기에서 복원 흐름을 진행할 때 Google Play 서비스는 먼저 사용자를 확인한 다음 블록 스토어 데이터를 검색합니다. 사용자가 이미 복원 흐름의 일부로 앱 데이터를 복원하는 데 동의했으므로 추가 동의가 필요하지 않습니다. 사용자가 앱을 열면 retrieveBytes()를 호출하여 Block Store에 토큰을 요청할 수 있습니다. 이렇게 하면 검색된 토큰을 사용하여 사용자가 새 기기에서 로그인 상태를 유지하도록 할 수 있습니다.

다음 샘플은 이전에 Block Store로 저장된 암호화된 토큰을 검색하는 방법을 보여줍니다.

val client = Blockstore.getClient(this)
client.retrieveBytes()
            .addOnSuccessListener { result ->
                Log.d(TAG, "Retrieved: ${String(result)}")
            }
            .addOnFailureListener { e ->
                Log.e(TAG, "Failed to retrieve bytes", e)
            }
}

엔드 투 엔드 암호화

엔드 투 엔드 암호화를 사용하려면 기기에서 Android 9 이상을 실행해야 하며 사용자가 기기의 화면 잠금(PIN, 패턴 또는 비밀번호)을 설정해야 합니다. isEndToEndEncryptionAvailable()를 호출하여 기기에서 암호화를 사용할 수 있는지 확인할 수 있습니다.

다음 샘플은 클라우드 백업 중에 암호화를 사용할 수 있는지 확인하는 방법을 보여줍니다.

client.isEndToEndEncryptionAvailable()
        .addOnSuccessListener { result ->
          Log.d(TAG, "Will Block Store cloud backup be end-to-end encrypted? $result")
        }

클라우드 백업 사용 설정

클라우드 백업을 사용 설정하려면 StoreBytesData 객체에 setShouldBackupToCloud() 메서드를 추가합니다. 블록 저장소는 setShouldBackupToCloud()가 true로 설정된 경우 저장된 바이트를 주기적으로 클라우드에 백업합니다.

다음 샘플에서는 클라우드 백업이 엔드 투 엔드 암호화된 경우에만 클라우드 백업을 사용 설정하는 방법을 보여줍니다.

val client = Blockstore.getClient(this)
val storeBytesDataBuilder = StoreBytesData.Builder()
        .setBytes(/* BYTE_ARRAY */)

client.isEndToEndEncryptionAvailable()
        .addOnSuccessListener { isE2EEAvailable ->
          if (isE2EEAvailable) {
            storeBytesDataBuilder.setShouldBackupToCloud(true)
            Log.d(TAG, "E2EE is available, enable backing up bytes to the cloud.")

            client.storeBytes(storeBytesDataBuilder.build())
                .addOnSuccessListener { result ->
                  Log.d(TAG, "stored: ${result.getBytesStored()}")
                }.addOnFailureListener { e ->
                  Log.e(TAG, “Failed to store bytes”, e)
                }
          } else {
            Log.d(TAG, "E2EE is not available, only store bytes for D2D restore.")
          }
        }

테스트 방법

개발 중에 다음 방법을 사용하여 복원 흐름을 테스트합니다.

동일한 기기 제거/재설치

사용자가 백업 서비스를 사용 설정하면(설정 > Google 및 백업에서 확인 가능) 앱 제거/재설치 전반에 걸쳐 블록 스토어 데이터가 유지됩니다.

다음 단계에 따라 테스트할 수 있습니다.

  1. 테스트 앱에 BlockStore API를 통합합니다.
  2. 테스트 앱을 사용하여 블록 스토어 API를 호출하여 데이터를 저장합니다.
  3. 테스트 앱을 제거한 다음 동일한 기기에 앱을 재설치합니다.
  4. 테스트 앱을 사용하여 BlockStore API를 호출하여 데이터를 검색합니다.
  5. 검색된 바이트가 설치 제거 전에 저장된 바이트와 동일한지 확인합니다.

기기 간

대부분의 경우 대상 기기를 초기화해야 합니다. 그런 다음 Android 무선 복원 흐름 또는 Google 케이블 복원(지원되는 기기용)을 입력할 수 있습니다.

클라우드 복원

  1. 테스트 앱에 Blockstore API를 통합합니다. 테스트 앱을 Play 스토어에 제출해야 합니다.
  2. 소스 기기에서 testBackUpToCloud를 true로 설정하고 테스트 앱을 사용하여 블록 스토어 API를 호출하여 데이터를 저장합니다.
  3. O 이상 기기의 경우 블록 스토어 클라우드 백업을 수동으로 트리거할 수 있습니다. 설정 > Google 및 백업으로 이동하여 '지금 백업' 버튼을 클릭합니다.
    1. 블록 스토어 클라우드 백업이 성공했는지 확인하려면 다음 안내를 따르세요.
      1. 백업이 완료되면 'CloudSyncBpTkSvc' 태그가 있는 로그 줄을 검색합니다.
      2. 다음과 같은 행이 표시됩니다. '......, CloudSyncBpTkSvc: 동기화 결과: SUCCESS, ..., 업로드된 크기: XXX바이트 ...'
    2. 블록 스토어 클라우드 백업 후 5분의 '대기' 기간이 적용됩니다. 5분 이내에 '지금 백업' 버튼을 클릭해도 다른 블록 스토어 클라우드 백업이 트리거되지 않습니다.
  4. 대상 기기를 초기화하고 클라우드 복원 절차를 진행합니다. 복원 흐름 중에 테스트 앱을 복원하려면 선택하세요. 클라우드 복원 흐름에 대한 자세한 내용은 지원되는 클라우드 복원 흐름을 참조하세요.
  5. 대상 기기에서 테스트 앱을 사용하여 Blockstore API를 호출하여 데이터를 검색합니다.
  6. 검색된 바이트가 소스 기기에 저장된 바이트와 동일한지 확인합니다.

기기 요구사항

엔드 투 엔드 암호화

  • 엔드 투 엔드 암호화는 Android 9 (API 29) 이상을 실행하는 기기에서 지원됩니다.
  • 엔드 투 엔드 암호화를 사용 설정하고 사용자의 데이터를 올바르게 암호화하려면 기기에 PIN, 패턴 또는 비밀번호로 화면 잠금이 설정되어 있어야 합니다.

기기 간 복원 절차

기기 간 복원을 사용하려면 소스 기기와 대상 기기가 있어야 합니다. 이 두 기기가 데이터를 전송합니다.

소스 기기는 백업하려면 Android 6 (API 23) 이상을 실행해야 합니다.

Android 9 (API 29) 이상을 실행하는 기기를 타겟팅하여 복원할 수 있습니다.

기기에서 기기로의 복원 과정에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

Cloud 백업 및 복원 흐름

클라우드 백업 및 복원을 사용하려면 소스 기기와 대상 기기가 필요합니다.

소스 기기는 백업하려면 Android 6 (API 23) 이상을 실행해야 합니다.

대상 기기는 공급업체에 따라 지원됩니다. Pixel 기기는 Android 9 (API 29)의 이 기능을 사용할 수 있으며 다른 모든 기기는 Android 12 (API 31) 이상을 실행해야 합니다.