콘텐츠로 건너뛰기

자주 방문한 페이지

최근 방문한 페이지

navigation

직접 부팅 지원

기기에 전원이 들어와 있지만 사용자가 기기의 잠금을 해제하지 않았을 경우, Android 7.0은 안전한 직접 부팅 모드에서 실행됩니다. 이를 지원하기 위해 시스템에서 다음과 같은 두 가지 데이터 저장소 위치를 제공합니다.

기본적으로 직접 부팅 모드 시에는 앱이 실행되지 않습니다. 직접 부팅 모드 시 앱이 작동해야 하는 경우, 이 모드에서 실행되어야 하는 앱 구성 요소를 등록할 수 있습니다. 직접 부팅 모드에서 실행되어야 하는 앱의 몇 가지 공통 사용 사례는 다음과 같습니다.

앱이 직접 부팅 모드에서 실행되는 동안 데이터에 액세스해야 하는 경우, 기기 암호화 저장소를 사용합니다. 기기 암호화 저장소에는 '기기가 성공적으로 확인된 부팅을 수행한 후에만 사용할 수 있는' 키로 암호화된 데이터가 포함됩니다.

PIN이나 비밀번호와 같이 사용자 자격 증명과 연관된 키로 암호화되어야 하는 데이터는 자격 증명 암호화 저장소를 사용합니다. 자격 증명 암호화 저장소는 사용자가 기기의 잠금을 해제한 뒤부터 기기를 다시 시작할 때까지만 사용될 수 있습니다. 사용자가 기기의 잠금을 해제한 뒤 잠금 화면을 활성화해도 자격 증명 암호화 저장소가 잠기지 않습니다.

직접 부팅 시 실행하기 위한 액세스 요청

앱은 직접 부팅 모드에서 실행되거나 기기 암호화 저장소에 액세스하기 전까지 시스템에 구성 요소를 등록해야 합니다. 앱은 구성 요소를 암호화 인식으로 표시하여 시스템에 등록합니다. 구성 요소를 암호화 인식으로 표시하려면 매니페스트에서 android:directBootAware 속성을 true로 설정합니다.

암호화 인식 구성 요소로 등록하면, 기기가 다시 시작되었을 때 시스템에서 ACTION_LOCKED_BOOT_COMPLETED 브로드캐스트 메시지를 수신할 수 있습니다. 이 시점에서 기기 암호화 저장소를 사용할 수 있고, 여러분의 구성 요소는 예약된 알람 트리거 등과 같이 직접 부팅 모드에서 실행해야 하는 작업을 실행할 수 있습니다.

다음 코드 조각은 BroadcastReceiver를 암호화 인식으로 등록하고 ACTION_LOCKED_BOOT_COMPLETED의 인텐트 필터를 앱 매니페스트에 추가하는 예시입니다.

<receiver
  android:directBootAware="true" >
  ...
  <intent-filter>
    <action android:name="android.intent.action.ACTION_LOCKED_BOOT_COMPLETED" />
  </intent-filter>
</receiver>

사용자가 기기의 잠금을 해제하면, 모든 구성 요소가 기기 암호화 저장소와 자격 증명 암호화 저장소에 액세스할 수 있습니다.

기기 암호화 저장소 액세스

기기 암호화 저장소에 액세스하려면 Context.createDeviceProtectedStorageContext()를 호출하여 두 번째 Context 인스턴스를 생성합니다. 이 컨텍스트를 사용하여 수행된 모든 저장소 API 호출은 기기 암호화 저장소에 액세스합니다. 다음은 기기 암호화 저장소에 액세스하고 기존 앱 데이터 파일을 여는 예시입니다.

Context directBootContext = appContext.createDeviceProtectedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...

직접 부팅 모드 중에 액세스해야 하는 정보에만 기기 암호화 저장소를 사용합니다. 기기 암호화 저장소를 범용 암호화 저장소로 사용하지 마십시오. 개인 사용자 정보나 직접 부팅 모드 중에 필요없는 암호화 데이터에는 자격 증명 암호화 저장소를 사용합니다.

사용자 잠금 해제 알림 수신

사용자가 재시작 후 기기의 잠금을 해제하면, 앱이 자격 증명 암호화 저장소 액세스로 전환하고, 사용자 자격 증명을 따르는 일반 시스템 서비스를 사용할 수 있습니다.

사용자가 재부팅 후 기기의 잠금을 해제할 때 알림을 받으려면, 실행 중인 구성 요소에서 BroadcastReceiver를 등록하여 잠금 해제 알림 메시지를 수신합니다. 사용자가 부팅 후에 기기의 잠금을 해제할 때 다음과 같이 합니다.

사용자가 기기의 잠금을 해제한 경우, UserManager.isUserUnlocked()를 호출하여 확인할 수 있습니다.

기존 데이터 마이그레이션

직접 부팅 모드를 사용하도록 사용자가 자신의 기기를 업데이트하는 경우, 여러분이 기존 데이터를 기기 암호화 저장소로 마이그레이션해야 할 수도 있습니다. Context.moveSharedPreferencesFrom()Context.moveDatabaseFrom()을 사용하여 자격 증명 암호화 저장소와 기기 암호화 저장소 간에 기본 설정과 데이터베이스 데이터를 마이그레이션합니다.

어떤 데이터를 자격 증명 암호화 저장소에서 기기 암호화 저장소로 마이그레이션할지를 신중히 결정하세요. 암호나 인증 토큰 등의 개인 사용자 정보는 기기 암호화 저장소로 마이그레이션해서는 안 됩니다. 일부 시나리오에서는 두 가지 암호화 저장소에 있는 별도의 데이터 세트를 관리해야 할 수 있습니다.

암호화 인식 앱 테스트

직접 부팅 모드를 활성화하고 암호화 인식 앱을 테스트합니다. 직접 부팅을 활성화하는 방법은 두 가지가 있습니다.

주의: 직접 부팅을 활성화하면 기기에서 모든 사용자 데이터가 삭제됩니다.

Android 7.0이 설치된 지원 기기에서 직접 부팅을 활성화하는 방법:

테스트 기기에서 모드를 전환해야 할 경우, 에뮬레이션된 직접 부팅 모드도 사용할 수 있습니다. 에뮬레이션된 모드는 개발 시에만 사용해야 하며 데이터가 손실될 수 있습니다. 에뮬레이션된 직접 부팅 모드를 활성화하려면 기기에서 잠금 패턴을 설정합니다. 잠금 패턴을 설정할 때 안전 모드 화면으로 시작할지 묻는 메시지가 나오면 "No thanks"를 선택한 뒤 다음과 같은 adb shell 명령을 사용합니다.

$ adb shell sm set-emulate-fbe true

에뮬레이션된 직접 부팅 모드를 끄려면 다음 명령을 사용합니다.

$ adb shell sm set-emulate-fbe false

이 명령을 사용하면 기기가 재부팅됩니다.

기기 정책 암호화 상태 확인

기기 관리 앱에서 DevicePolicyManager.getStorageEncryptionStatus()를 사용하여 기기의 현재 암호화 상태를 확인할 수 있습니다. 앱이 24.0 미만의 API 레벨(Android 7.0)을 대상으로 하는 경우, 기기가 전체 디스크 암호화를 사용하거나 또는 직접 부팅을 통한 파일 기반 암호화를 사용하면 getStorageEncryptionStatus()ENCRYPTION_STATUS_ACTIVE를 반환합니다. 두 경우 모두 데이터는 항상 암호화되어 저장됩니다. 앱이 24.0 이상의 API 레벨을 대상으로 하는 경우, 기기가 전체 디스크 암호화를 사용하면 getStorageEncryptionStatus()ENCRYPTION_STATUS_ACTIVE를 반환합니다. 기기가 직접 부팅을 통한 파일 기반 암호화를 사용하면 ENCRYPTION_STATUS_ACTIVE_PER_USER를 반환합니다.

Android 7.0을 대상으로 하는 기기 관리 앱을 빌드하는 경우에는, 기기의 암호화 여부를 판별하기 위해 ENCRYPTION_STATUS_ACTIVEENCRYPTION_STATUS_ACTIVE_PER_USER를 둘다 선택해야 합니다.

이 사이트는 쿠키를 사용하여 사이트별 언어 및 표시 옵션에 대한 환경설정을 저장합니다.

Google Play에서 성공을 거두는 데 도움이 되는 최신 Android 개발자 뉴스 및 도움말을 받아 보세요.

* 필수 입력란

완료되었습니다.

WeChat에서 Google Developers 팔로우하기

이 사이트를 (으)로 탐색할까요?

페이지를 요청했지만 이 사이트의 언어 환경설정은 입니다.

언어 환경설정을 변경하고 이 사이트를 (으)로 탐색할까요? 언어 환경설정을 나중에 변경하려면 각 페이지 하단의 언어 메뉴를 사용하세요.

이 클래스를 사용하려면 API 수준 이상이 필요합니다.

문서에 대해 선택한 API 수준이 이므로 이 문서가 표시되지 않습니다. 왼쪽 탐색 메뉴의 선택기로 문서 API 수준을 변경할 수 있습니다.

앱에 필요한 API 수준 지정에 관한 자세한 내용은 다양한 플랫폼 버전 지원을 참조하세요.

Take a short survey?
Help us improve the Android developer experience. (April 2018 — Developer Survey)