이 페이지에서는 Android 9에서 사용할 수 있는 엔터프라이즈 API, 기능, 동작 변경사항을 간략하게 설명합니다.
직장 프로필 사용자 인터페이스
Android 9 (API 수준 28)에는 사용자가 개인 앱과 업무용 앱을 구분할 수 있도록 기본 런처의 사용자 인터페이스가 변경되었습니다. 이를 지원하는 기기 제조업체는 사용자의 앱을 별도의 직장 탭과 개인 탭에 표시할 수 있습니다. 또한 기기 사용자가 런처의 직장 탭에 있는 스위치를 포함하여 직장 프로필을 더 쉽게 켜고 끌 수 있도록 했습니다.
![](https://developer.android.com/static/images/about/versions/pie/p-work-profile.jpg?authuser=7&hl=ko)
직장 프로필 및 관리 기기를 프로비저닝할 때 Android 9에는 기기 사용자가 이러한 기능을 이해하는 데 도움이 되는 애니메이션 삽화가 포함되어 있습니다.
프로필 간 앱 전환
Android 9에는 사용자가 계정 간에 전환할 수 있도록 다른 프로필에서 앱의 다른 인스턴스를 실행하는 API가 포함되어 있습니다. 예를 들어 이메일 앱은 사용자가 두 이메일 계정에 액세스하기 위해 개인 프로필과 직장 프로필 간에 전환할 수 있는 UI를 제공할 수 있습니다. 다른 프로필에 이미 설치된 경우 모든 앱은 이 API를 호출하여 동일한 앱의 기본 활동을 시작할 수 있습니다. 앱에 교차 프로필 계정 전환을 추가하려면 CrossProfileApps
클래스의 메서드를 호출하는 아래 단계를 따르세요.
- 앱의 다른 인스턴스를 실행할 수 있는 프로필 목록을 가져오려면
getTargetUserProfiles()
를 호출합니다. 이 메서드는 앱이 프로필에 설치되어 있는지 확인합니다. getProfileSwitchingIconDrawable()
를 호출하여 다른 프로필을 나타내는 데 사용할 수 있는 아이콘을 가져옵니다.getProfileSwitchingLabel()
를 호출하여 사용자에게 프로필을 전환하도록 요청하는 현지화된 텍스트를 가져옵니다.startMainActivity()
를 호출하여 다른 프로필에서 앱의 인스턴스를 실행합니다.
실행하려는 기본 활동이 앱의 매니페스트 파일에 ACTION_MAIN
인텐트 작업으로 선언되었고 CATEGORY_LAUNCHER
인텐트 카테고리가 포함되어 있는지 확인합니다.
프로그래매틱 방식으로 직장 프로필 사용 또는 사용 중지
기본 런처 (또는 MANAGE_USERS
또는 MODIFY_QUIET_MODE
권한이 있는 앱)는 UserManager.requestQuietModeEnabled()
를 호출하여 직장 프로필을 사용 또는 사용 중지할 수 있습니다. 반환 값을 검사하여 상태가 변경되기 전에 사용자가 사용자 인증 정보를 확인해야 하는지 알 수 있습니다. 변경사항이 즉시 적용되지 않을 수 있으므로 ACTION_MANAGED_PROFILE_AVAILABLE
또는 ACTION_MANAGED_PROFILE_UNAVAILABLE
브로드캐스트를 수신 대기하여 사용자 인터페이스를 언제 업데이트해야 하는지 알 수 있습니다.
앱에서 UserManager.isQuietModeEnabled()
를 호출하여 직장 프로필의 상태를 확인할 수 있습니다.
기기에 앱 잠그기
Android 9부터 기기 소유자와 프로필 소유자 (보조 사용자의)는 앱을 작업 잠금 모드로 전환하여 모든 앱을 기기 화면에 잠글 수 있습니다. 이전에는 앱 개발자가 앱에서 작업 잠금 모드 지원을 추가해야 했습니다. 또한 Android 9는 lock Task API를 연결되지 않은 보조 사용자의 프로필 소유자로 확장합니다. 앱을 화면에 고정하려면 다음 단계를 따르세요.
DevicePolicyManager.setLockTaskPackages()
를 호출하여 작업 잠금 모드를 앱 허용 목록에 추가합니다.ActivityOptions.setLockTaskEnabled()
를 호출하여 허용 목록에 있는 앱을 작업 잠금 모드로 실행합니다.
작업 잠금 모드에서 앱을 중지하려면 DevicePolicyManager.setLockTaskPackages()
를 사용하여 잠금 작업 모드 허용 목록에서 앱을 삭제합니다.
시스템 UI 기능 사용 설정
작업 잠금 모드가 사용 설정되면 기기 소유자와 프로필 소유자는 DevicePolicyManager.setLockTaskFeatures()
를 호출하고 다음 기능 플래그의 비트 필드를 전달하여 기기에서 특정 시스템 UI 기능을 사용 설정할 수 있습니다.
LOCK_TASK_FEATURE_NONE
LOCK_TASK_FEATURE_SYSTEM_INFO
LOCK_TASK_FEATURE_HOME
LOCK_TASK_FEATURE_NOTIFICATIONS
는LOCK_TASK_FEATURE_HOME
와 함께만 사용할 수 있습니다.LOCK_TASK_FEATURE_KEYGUARD
LOCK_TASK_FEATURE_OVERVIEW
는LOCK_TASK_FEATURE_HOME
와 함께만 사용할 수 있습니다.LOCK_TASK_FEATURE_GLOBAL_ACTIONS
작업 잠금 모드가 사용 설정된 경우 DevicePolicyManager.getLockTaskFeatures()
를 호출하여 기기에서 사용 가능한 기능 목록을 가져올 수 있습니다. 기기가 잠금 작업 모드를 종료하면 다른 기기 정책에서 요구하는 상태로 돌아갑니다.
오류 대화상자 숨기기
소매 데모 또는 공개 정보 디스플레이와 같은 일부 환경에서는 사용자에게 오류 대화상자를 표시하지 않는 것이 좋습니다. 기기 정책 컨트롤러 (DPC)는 DISALLOW_SYSTEM_ERROR_DIALOGS
사용자 제한을 추가하여 비정상 종료되거나 응답하지 않는 앱의 시스템 오류 대화상자를 억제할 수 있습니다. 이 제한은 기기 소유자가 적용하면 모든 대화상자에 영향을 미치지만 프로필 소유자가 제한을 적용하면 기본 또는 보조 사용자에게 표시되는 오류 대화상자만 표시되지 않습니다. 이 제한사항은 직장 프로필에는 영향을 미치지 않습니다.
Android 9에서 몰입형 전체 화면 모드로 실행되는 앱은 작업 잠금 모드일 때 알림 풍선을 표시하지 않습니다. 알림 풍선은 처음 실행할 때 사용자에게 표시되는 패널로, 몰입형 모드를 종료하는 방법을 설명합니다.
전용 기기에서 여러 사용자 지원
Android 9에서는 전용 기기 (이전의 COSU 기기)를 위한 임시 사용자 개념이 도입되었습니다. 임시 사용자는 여러 사용자가 하나의 전용 기기를 공유하는 경우를 위한 단기 사용자입니다. 여기에는 도서관 또는 숙박 시설 체크인 키오스크와 같은 기기의 공개 사용자 세션과 기기의 고정된 사용자(예: 교대 근무자) 간의 영구 세션이 포함됩니다.
임시 사용자는 백그라운드에서 생성해야 합니다. 보조 사용자는 기기에서 보조 사용자로 생성되고 중지, 전환 또는 기기 재부팅 시 연결된 앱 및 데이터와 함께 삭제됩니다. 임시 사용자를 만들려면 기기 소유자가 다음을 수행하면 됩니다.
DevicePolicyManager.createAndManageUser()
를 호출할 때MAKE_USER_EPHEMERAL
플래그를 설정합니다.DevicePolicyManager.startUserInBackground()
를 호출하여 백그라운드에서 임시 사용자를 시작합니다.
Android 9를 타겟팅하는 앱은 createAndManageUser()
를 호출할 때 UserManager.UserOperationException
을 포착해야 합니다. 예외의 getUserOperationResult()
메서드를 호출하여 사용자가 생성되지 않은 이유를 확인합니다.
활동 알림 수신
DeviceAdminReceiver
는 다음 이벤트에 관한 알림을 수신합니다.
onUserStarted()
: 사용자가 시작할 때 호출됩니다.onUserSwitched()
: 사용자 전환이 완료될 때 호출됩니다.onUserStopped()
: 사용자가 중지하거나 로그아웃할 때onUserRemoved()
와 함께 호출됩니다.
사용자에게 이벤트 메시지 표시
기기 소유자는 사용자가 세션을 시작하고 종료할 때 사용자에게 표시되는 메시지를 구성할 수 있습니다.
DevicePolicyManager.setStartUserSessionMessage()
를 사용하여 사용자 세션이 시작될 때 사용자에게 표시할 메시지를 설정합니다. 메시지를 검색하려면DevicePolicyManager.getStartUserSessionMessage()
를 호출합니다.DevicePolicyManager.setEndUserSessionMessage()
를 사용하여 사용자 세션이 종료될 때 사용자에게 표시될 메시지를 설정합니다. 메시지를 검색하려면DevicePolicyManager.getEndUserSessionMessage()
를 호출합니다.
사용자 로그아웃 및 중지
기기 소유자는 DevicePolicyManager.setLogoutEnabled()
를 사용하여 보조 사용자의 로그아웃 사용 설정 여부를 지정할 수 있습니다. 로그아웃이 사용 설정되어 있는지 확인하려면 DevicePolicyManager.isLogoutEnabled()
를 호출합니다.
보조 사용자의 프로필 소유자는 DevicePolicyManager.logoutUser()
를 호출하여 보조 사용자를 중지하고 기본 사용자로 다시 전환할 수 있습니다.
기기 소유자는 DevicePolicyManager.stopUser()
를 사용하여 지정된 보조 사용자를 중지할 수 있습니다.
패키지 캐싱
교대 근무자용 기기와 같이 사용자가 고정된 공유 기기에서 사용자 프로비저닝을 간소화하기 위해 멀티 사용자 세션에 필요한 패키지를 캐시할 수 있습니다.
DevicePolicyManager.setKeepUninstalledPackages()
를 호출하여 APK로 유지할 패키지 목록을 지정합니다. 이러한 패키지 목록을 검색하려면DevicePolicyManager.getKeepUninstalledPackages()
를 호출합니다.DevicePolicyManager.installExistingPackage()
를 호출하여setKeepUninstalledPackages()
를 통해 삭제 후 보관된 패키지를 설치합니다.
추가 메서드 및 상수
또한 Android 9에는 공유 기기에서 사용자 세션을 추가로 지원하기 위한 다음 메서드와 상수가 포함되어 있습니다.
DevicePolicyManager.getSecondaryUsers()
는 기기의 모든 보조 사용자 목록을 가져옵니다.DISALLOW_USER_SWITCH
는DevicePolicyManager.addUserRestriction()
를 호출하여 사용자 전환을 차단하여 사용 설정할 수 있는 사용자 제한입니다.LEAVE_ALL_SYSTEM_APPS_ENABLED
은DevicePolicyManager.createAndManageUser()
에 사용할 수 있는 플래그입니다. 이 플래그를 설정하면 사용자 프로비저닝 중에 시스템 앱이 사용 중지되지 않습니다.UserManager.UserOperationException
는 사용자를 만들 수 없을 때DevicePolicyManager.createAndManageUser()
에 의해 발생합니다. 예외에 실패 이유가 포함됩니다.
패키지 데이터 삭제 및 계정 삭제
기기 소유자 및 프로필 소유자는 clearApplicationUserData()
를 호출하여 지정된 패키지의 사용자 데이터를 삭제할 수 있습니다. AccountManager
에서 계정을 삭제하려면 기기 및 프로필 소유자가 removeAccount()
를 호출하면 됩니다.
사용자 제한 및 설정 제어 강화
Android 9에는 DPC에 대한 사용자 제한사항 모음과 함께 기기에서 APN, 시간 및 시간대, 시스템 설정을 구성할 수 있는 기능이 도입되었습니다.
APN 구성
기기 소유자는 DevicePolicyManager
클래스의 다음 메서드를 사용하여 기기에서 APN을 구성할 수 있습니다.
addOverrideApn()
updateOverrideApn()
removeOverrideApn()
getOverrideApns()
setOverrideApnEnabled()
isOverrideApnEnabled()
시간 및 시간대 구성
기기 소유자는 DevicePolicyManager
클래스의 다음 메서드를 사용하여 기기의 시간과 시간대를 설정할 수 있습니다.
중요 설정에 사용자 제한사항 적용
Android 9에서는 시스템 기능 및 설정을 사용 중지하도록 사용자 제한을 추가합니다. 제한을 추가하려면 다음 UserManager
상수 중 하나를 사용하여 DevicePolicyManager.addUserRestriction()
를 호출하세요.
DISALLOW_AIRPLANE_MODE
DISALLOW_AMBIENT_DISPLAY
DISALLOW_CONFIG_BRIGHTNESS
DISALLOW_CONFIG_DATE_TIME
DISALLOW_CONFIG_LOCATION
DISALLOW_CONFIG_SCREEN_TIMEOUT
DISALLOW_PRINTING
기기에 DISALLOW_CONFIG_BRIGHTNESS
및 DISALLOW_CONFIG_SCREEN_TIMEOUT
이 적용되면 기기 소유자는 계속해서 API DevicePolicyManager.setSystemSetting()
를 사용하여 기기의 화면 밝기, 화면 밝기 모드, 화면 시간 제한 설정을 지정할 수 있습니다.
측정된 데이터
기기 소유자 및 프로필 소유자는 앱이 기기의 데이터 전송량 제한이 있는 데이터 네트워크를 사용하지 못하도록 할 수 있습니다. 사용자가 비용, 데이터 한도 또는 배터리, 성능 문제로 인해 과도한 데이터 사용량에 민감한 경우 데이터 전송량 제한이 있는 네트워크로 간주됩니다. 앱이 데이터 전송량 제한이 있는 네트워크를 사용하지 못하게 하려면 DevicePolicyManager.setMeteredDataDisabledPackages()
를 호출하여 패키지 이름 목록을 전달합니다. 현재 제한된 앱을 검색하려면 DevicePolicyManager.getMeteredDataDisabledPackages()
를 호출합니다.
Android의 데이터 전송량 제한이 있는 데이터에 관한 자세한 내용은 네트워크 데이터 사용 최적화를 참고하세요.
DPC 이전
기기 정책 컨트롤러 (DPC)는 기기 또는 직장 프로필의 소유권을 다른 DPC로 이전할 수 있습니다. 소유권을 이전하여 일부 기능을 Android Management API로 이동하거나, 기존 DPC에서 기기를 이전하거나, IT 관리자가 EMM으로 이전하도록 지원할 수 있습니다. DPC 소유권만 변경하는 것이므로 이 기능을 사용하여 관리 유형을 변경할 수 없습니다(예: 관리 기기에서 직장 프로필로 이전 또는 그 반대로).
기기 관리 정책 XML 리소스를 사용하여 이 DPC 버전이 이전을 지원함을 나타낼 수 있습니다. 타겟 DPC는 <support-transfer-ownership>
라는 요소를 포함하여 소유권을 받을 수 있음을 나타냅니다. 아래 예는 DPC의 기기 관리 XML 파일에서 이를 실행하는 방법을 보여줍니다.
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<support-transfer-ownership />
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
</uses-policies>
</device-admin>
새 DPC 앱으로 소유권을 이전하려는 DPC는 DeviceAdminInfo
메서드 supportsTransferOwnership()
를 호출하여 타겟 DPC 버전이 이전을 지원하는지 확인할 수 있습니다. 소유권을 이전하기 전에 앱 서명을 비교하여 타겟 DPC를 확인할 책임은 소스 DPC에 있습니다. PackageManager
클래스에는 코드 서명 서명을 사용하는 메서드가 포함되어 있습니다.
Android는 소유권 이전을 통해 소스 DPC 시스템과 사용자 정책을 유지 관리하므로 DPC가 시스템 및 사용자 정책을 이전할 필요가 없습니다. 소스 DPC는 PersistableBundle
의 키-값 쌍을 사용하여 맞춤 데이터를 타겟 DPC에 전달할 수 있습니다. 전송이 성공하면 타겟 DPC에서 DevicePolicyManager.getTransferOwnershipBundle()
를 호출하여 이 데이터를 검색할 수 있습니다.
관리 기기 또는 직장 프로필의 소유권을 이전하는 단계는 동일합니다.
- 소스 DPC는 타겟 DPC 버전이 이전을 지원하는지, 타겟 DPC의 앱 서명이 예상값과 일치하는지 확인합니다.
- 소스 DPC는
transferOwnership()
를 호출하여 전송을 시작합니다. - 시스템에서 대상 DPC를 활성 관리자로 만들고 관리 기기 또는 직장 프로필의 소유자로 설정합니다.
- 타겟 DPC는 콜백
onTransferOwnershipComplete()
를 수신하고,bundle
인수의 값을 사용하여 자체적으로 구성할 수 있습니다. - 전송에 문제가 발생하면 시스템은 소유권을 소스 DPC로 되돌립니다. 소스 DPC에서 소유권 이전이 성공했는지 확인해야 하는 경우
isAdminActive()
를 호출하여 소스 DPC가 더 이상 활성 관리자가 아닌지 확인합니다.
직장 프로필에서 실행되는 모든 앱은 프로필 소유자가 변경될 때 ACTION_PROFILE_OWNER_CHANGED
브로드캐스트를 수신합니다. 관리 기기에서 실행되는 앱은 기기 소유자가 변경되면 ACTION_DEVICE_OWNER_CHANGED
브로드캐스트를 수신합니다.
완전 관리형 기기의 직장 프로필
기기 소유자와 프로필 소유자로 실행되는 DPC의 인스턴스 두 개 전송은 두 단계로 이루어집니다. 개인 프로필과 직장 프로필이 연결되면 다음 순서로 전송을 완료합니다.
- 먼저 직장 프로필의 소유권을 이전합니다.
DeviceAdminReceiver
콜백onTransferAffiliatedProfileOwnershipComplete()
에서 직장 프로필이 대상 DPC로 전송되었는지 확인할 때까지 기다립니다.- 마지막으로 관리 기기의 소유권을 대상 DPC에 이전합니다.
무선 업데이트 (OTA) 연기
기기 소유자는 OTA 시스템 업데이트를 최대 90일까지 연기하여 중요한 기간 (예: 연말연시)에 기기에서 실행 중인 OS 버전을 고정할 수 있습니다. 시스템은 정의된 정지 기간이 지나면 필수 60일 버퍼를 적용하여 기기가 무기한 정지되는 것을 방지합니다.
동결 기간:
- 기기가 대기 중인 OTA 업데이트에 관한 알림을 수신하지 않습니다.
- 기기가 OS에 OTA 업데이트를 설치하지 않습니다.
- 기기 사용자는 설정에서 OTA 업데이트를 수동으로 확인할 수 없습니다.
정지 기간을 설정하려면 SystemUpdatePolicy.setFreezePeriods()
를 호출합니다. 고정 기간은 매년 반복되므로 기간의 시작 날짜와 종료 날짜는 연도 시작 이후의 일수를 계산하는 정수로 표시됩니다. 시작일은 이전 동결 기간이 종료된 후 최소 60일 이후에 시작되어야 합니다. 기기 소유자는 SystemUpdatePolicy.getFreezePeriods()
를 호출하여 이전에 시스템 업데이트 정책 객체에 설정된 정지 기간 목록을 가져올 수 있습니다.
기기 소유자가 설정한 모든 정지 기간을 반환하도록 DevicePolicyManager.getSystemUpdatePolicy()
가 업데이트되었습니다.
직장 프로필로 공유 제한
프로필 소유자는 사용자 제한사항 DISALLOW_SHARE_INTO_MANAGED_PROFILE
을 추가하여 사용자가 기기의 직장 프로필에 개인 정보를 공유하지 못하도록 할 수 있습니다.
이 제한을 적용하면 다음과 같은 인텐트 처리와 공유가 금지됩니다.
- 직장 프로필 앱과 데이터 및 파일을 공유하는 개인 프로필 앱
- 직장 프로필 앱이 개인 프로필에서 항목(예: 사진 또는 파일)을 선택하는 경우
이 제한을 설정한 후에도 DPC는 addCrossProfileIntentFilter()
를 호출하여 여전히 교차 프로필 활동 인텐트를 허용할 수 있습니다.
하드웨어 보안 키 및 머신 인증서
Android 9에는 키와 인증서로 작업하는 데 도움이 되는 API를 추가했습니다. 이러한 키와 인증서는 함께 사용하여 기기를 안전하게 식별할 수 있습니다. 프로필 소유자 또는 기기 소유자 모드에서 실행되는 DPC 또는 위임된 인증서 설치 프로그램은 다음 작업을 완료할 수 있습니다.
- Android 기기의 보안 하드웨어 (예: TEE (신뢰할 수 있는 실행 환경) 또는 SE (보안 요소))에서 키와 인증서를 생성합니다. 생성된 키는 보안 하드웨어를 벗어나지 않으며 Android KeyChain에서 사용할 수 있습니다.
DevicePolicyManager.generateKeyPair()
를 호출하여 알고리즘(KeyPairGenerator
참고)과 증명하려는 하드웨어 ID(예: 일련번호 또는 IMEI)를 제공합니다. 안전한 하드웨어 변경사항에 관한 자세한 내용은 Android 9 보안 개선사항을 참고하세요. - 인증서를 기존 기기에서 생성된 키와 연결합니다. 리프 인증서에서 시작하여 신뢰 체인을 순서대로 포함하여 기존 키의 별칭과 인증서 체인을 제공하는
DevicePolicyManager.setKeyPairCertificate()
를 호출합니다. - 키를 사용하기 전에 보안 하드웨어가 키를 보호하는지 확인합니다. 어떤 메커니즘이 키를 보호하는지 확인하려면 키 증명의 단계를 따르세요.
- 기기 소유자와 위임된 인증서 설치 프로그램은 Android 시스템 버전과 함께 기기 하드웨어 ID의 서명된 문을 받을 수 있습니다.
DevicePolicyManager.generateKeyPair()
를 호출하여idAttestationFlags
인수에서ID_TYPE_BASE_INFO
,ID_TYPE_SERIAL
,ID_TYPE_IMEI
,ID_TYPE_MEID
중 하나 이상을 전달합니다. 반환된 인증서에는 증명 레코드의 하드웨어 ID가 포함됩니다. 하드웨어 ID를 포함하지 않으려면0
를 전달합니다. 프로필 소유자는ID_TYPE_BASE_INFO
을 전달하여 제조업체 정보만 수신할 수 있습니다. 기기가 ID를 증명할 수 있는지 확인하려면isDeviceIdAttestationSupported()
를 호출합니다. - 키 인증서를 선택할 수 없도록 하여 기기 사용자가 (엔터프라이즈가 아닌 작업에서) 엔터프라이즈 키를 오용하지 못하게 합니다. 선택 불가능한 인증서가 시스템의 선택 도구 패널에 포함되지 않습니다.
DeviceAdminReceiver.onChoosePrivateKeyAlias()
콜백 메서드에서 엔터프라이즈 키에 별칭을 반환하여 시스템에서 사용자 대신 인증서를 자동으로 선택하도록 합니다. 키를 선택할 수 없도록 하려면 다음DevicePolicyManager
메서드를 호출합니다.setKeyPairCertificate()
및isUserSelectable
인수에false
를 전달합니다.installKeyPair (ComponentName, PrivateKey, Certificate[], String, int)
하고flags
인수에서INSTALLKEY_SET_USER_SELECTABLE
를 생략합니다.
이러한 API를 결합하면 기업에서 액세스 권한을 제공하기 전에 기기를 안전하게 식별하고 무결성을 확인할 수 있습니다.
- Android 기기는 보안 하드웨어에서 새로운 비공개 키를 생성합니다. 개인 키가 보안 하드웨어 밖으로 유출되지 않기 때문에 보안이 유지됩니다.
- 기기는 키를 사용하여 인증서 서명 요청(CSR)을 생성하고 서버에 전송합니다. CSR에는 기기 ID가 포함된 증명 기록이 포함됩니다.
- 서버는 Google 인증서를 기반으로 하는 인증서 체인을 검증하고 증명 레코드에서 기기 메타데이터를 추출합니다.
- 서버에서 보안 하드웨어가 비공개 키를 보호하는지, 기기 ID가 기업의 기록과 일치하는지 확인합니다. 또한 서버는 Android 시스템과 패치 버전이 요구사항을 충족하는지 확인할 수 있습니다.
- 서버가 CSR에서 인증서를 생성하고 기기로 전송합니다.
- 기기는 인증서를 비공개 키 (보안 하드웨어에 남아 있음)와 페어링하여 앱을 엔터프라이즈 서비스에 연결할 수 있도록 합니다.
보안 API, 기능, 변경사항 더보기
보안 로그 및 네트워크 로그의 ID
Android 9에는 보안 및 네트워크 활동 로그에 ID가 포함되어 있습니다. 이벤트마다 숫자 ID가 일정하게 증가하므로 IT 관리자는 로그의 공백을 쉽게 파악할 수 있습니다. 보안 로그와 네트워크 로그는 별도의 컬렉션이므로 시스템에서 별도의 ID 값을 유지합니다.
SecurityEvent.getId()
, DnsEvent.getId()
또는 ConnectEvent.getId()
를 호출하여 ID 값을 가져옵니다. 시스템은 DPC가 로깅을 사용 설정할 때마다 또는 기기가 다시 시작될 때 ID를 재설정합니다.
DevicePolicyManager.retrievePreRebootSecurityLogs()
를 호출하여 가져온 보안 로그에는 이러한 ID가 포함되지 않습니다.
보안 로깅
보안 로깅은 각 SecurityEvent
에 로그 수준을 할당합니다. 로그 수준을 가져오려면 getLogLevel()
를 호출합니다. 이 메서드는 로그 수준 값을 반환하며 이 값은 LEVEL_INFO
, LEVEL_WARNING
, LEVEL_ERROR
중 하나일 수 있습니다.
Android 9에서는 아래 표에 나열된 이벤트를 보안 로그에 로깅합니다. 이벤트 태그를 확인하려면 getTag()
를 호출합니다. 이벤트
데이터를 검색하려면 getData()
를 호출합니다.
태그 | 이벤트 설명 |
---|---|
TAG_CERT_AUTHORITY_INSTALLED |
시스템의 사용자 인증 정보 저장소에 새 루트 인증서를 설치하려고 합니다. |
TAG_CERT_AUTHORITY_REMOVED |
시스템의 사용자 인증 정보 저장소에서 루트 인증서를 삭제하려는 시도입니다. |
TAG_CERT_VALIDATION_FAILURE |
연결 중에 Wi-Fi 인증서가 유효성 검사에 실패했습니다. |
TAG_CRYPTO_SELF_TEST_COMPLETED |
시스템에서 암호화 자동 테스트를 완료했습니다. |
TAG_KEYGUARD_DISABLED_FEATURES_SET |
관리자 앱에서 기기 또는 직장 프로필 잠금 화면의 기능을 사용 중지했습니다. |
TAG_KEY_DESTRUCTION |
암호화 키를 삭제하려는 시도입니다. |
TAG_KEY_GENERATED |
새 암호화 키를 생성하려는 시도입니다. |
TAG_KEY_IMPORT |
새 암호화 키를 가져오려고 합니다. |
TAG_KEY_INTEGRITY_VIOLATION |
Android에서 손상된 암호화 또는 인증 키가 감지되었습니다. |
TAG_LOGGING_STARTED |
보안 로깅에서 기록을 시작했습니다. |
TAG_LOGGING_STOPPED |
보안 로깅에서 기록이 중지되었습니다. |
TAG_LOG_BUFFER_SIZE_CRITICAL |
보안 로그 버퍼가 용량의 90% 에 도달했습니다. |
TAG_MAX_PASSWORD_ATTEMPTS_SET |
관리자 앱에서 잘못된 비밀번호 입력 시도 허용 횟수를 설정했습니다. |
TAG_MAX_SCREEN_LOCK_TIMEOUT_SET |
관리자 앱에서 최대 화면 잠금 시간 제한을 설정했습니다. |
TAG_MEDIA_MOUNT |
기기에서 이동식 저장소 미디어를 마운트했습니다. |
TAG_MEDIA_UNMOUNT |
기기에서 이동식 저장소 미디어를 마운트 해제했습니다. |
TAG_OS_SHUTDOWN |
Android 시스템이 종료되었습니다. |
TAG_OS_STARTUP |
Android 시스템이 시작되었습니다. |
TAG_PASSWORD_COMPLEXITY_SET |
관리자 앱에서 비밀번호 복잡성 요구사항을 설정했습니다. |
TAG_PASSWORD_EXPIRATION_SET |
관리자 앱에서 비밀번호 만료 기간을 설정했습니다. |
TAG_PASSWORD_HISTORY_LENGTH_SET |
관리자 앱이 사용자가 이전 비밀번호를 재사용할 수 없도록 비밀번호 기록 길이를 설정했습니다. |
TAG_REMOTE_LOCK |
관리자 앱에서 기기 또는 직장 프로필을 잠갔습니다. |
TAG_USER_RESTRICTION_ADDED |
관리자 앱에서 사용자 제한을 설정했습니다. |
TAG_USER_RESTRICTION_REMOVED |
관리자 앱에서 사용자 제한을 삭제했습니다. |
TAG_WIPE_FAILURE |
기기 또는 직장 프로필 초기화에 실패했습니다. |
직장 프로필 잠금 화면 보안 질문
Android 9부터 프로필 소유자는 사용자에게 DISALLOW_UNIFIED_PASSWORD
사용자 제한을 사용하여 직장 프로필에 별도의 잠금 화면 챌린지를 설정하도록 요구할 수 있습니다. 사용자의 기기 및 직장 프로필에 동일한 잠금 화면 챌린지가 설정되어 있는지 확인하려면 DevicePolicyManager.isUsingUnifiedPassword()
를 호출합니다.
기기에 별도의 직장 프로필 잠금 화면이 있는 경우 DevicePolicyManager.setMaximumTimeToLock()
는 전체 기기가 아닌 직장 프로필의 잠금 화면 시간 제한만 설정합니다.
개발자 도구 액세스
업무 데이터를 직장 프로필에 보관하기 위해 Android 디버그 브리지 (adb) 도구에서 직장 프로필의 디렉터리와 파일에 액세스할 수 없습니다.
더 많은 생체 인식 옵션 지원
Android 9에는 직장 프로필의 잠금 화면에서 생체 인식 하드웨어 인증을 세밀하게 제어할 수 있는 기능이 추가되었습니다. KEYGUARD_DISABLE_FACE
및 KEYGUARD_DISABLE_IRIS
를 사용하여 기존 DevicePolicyManager.setKeyguardDisabledFeatures()
메서드를 호출합니다.
기기에서 제공하는 모든 생체 인식 인증 방법을 사용 중지하려면 KEYGUARD_DISABLE_BIOMETRICS
를 추가합니다.
기기 관리 정책의 지원 중단
Android 9에서는 기기 관리자를 사용하여 DPC에 아래 나열된 정책을 지원 중단한 것으로 표시합니다. 정책은 이전과 마찬가지로 Android 9에서도 계속 작동합니다. Android 10 버전부터 기기 관리자가 호출하면 동일한 정책에서 SecurityException이 발생합니다.
USES_POLICY_DISABLE_CAMERA
USES_POLICY_DISABLE_KEYGUARD_FEATURES
USES_POLICY_EXPIRE_PASSWORD
USES_POLICY_LIMIT_PASSWORD
일부 애플리케이션은 소비자 기기 관리에 기기 관리자를 사용합니다. 예를 들어 분실한 기기를 잠그고 완전 삭제합니다. 이 기능을 사용 설정하기 위해 다음 정책은 계속 사용할 수 있습니다.
이 변경사항에 관한 자세한 내용은 기기 관리자 지원 중단을 참고하세요.
간소화된 QR 코드 등록
내장 QR 라이브러리
Android 9에는 QR 코드 기기 프로비저닝을 간소화하기 위해 QR 라이브러리가 번들로 제공됩니다. IT 관리자는 기기를 설정하기 위해 더 이상 Wi-Fi 세부정보를 수동으로 입력할 필요가 없습니다. 대신 Android 9에서는 QR 코드 내에 이러한 Wi-Fi 세부정보를 포함할 수 있습니다. IT 관리자가 회사 소유 기기로 QR 코드를 스캔하면 기기가 자동으로 Wi-Fi에 연결되고 추가 수동 입력 없이 프로비저닝 프로세스가 시작됩니다.
QR 코드 프로비저닝 방법은 Wi-Fi 세부정보를 지정하는 다음 프로비저닝 추가 항목을 지원합니다.
EXTRA_PROVISIONING_WIFI_HIDDEN
EXTRA_PROVISIONING_WIFI_PAC_URL
EXTRA_PROVISIONING_WIFI_PASSWORD
EXTRA_PROVISIONING_WIFI_PROXY_BYPASS
EXTRA_PROVISIONING_WIFI_PROXY_HOST
EXTRA_PROVISIONING_WIFI_PROXY_PORT
EXTRA_PROVISIONING_WIFI_SECURITY_TYPE
EXTRA_PROVISIONING_WIFI_SSID
프로비저닝 추가 항목을 사용하여 날짜 및 시간대 설정
QR 코드 프로비저닝 메서드는 기기의 시간과 시간대를 설정하는 프로비저닝 추가 기능을 지원합니다.
데이터 완전 삭제 옵션
기기 관리자는 직장 프로필 또는 보조 사용자를 삭제할 때 사용자에게 맞춤설정된 메시지를 표시할 수 있습니다. 이 메시지를 통해 기기 사용자는 IT 관리자가 직장 프로필 또는 보조 사용자를 삭제했음을 알 수 있습니다. wipeData(int, CharSequence)
를 호출하고 짧은 설명 메시지를 제공합니다. 기본 사용자 또는 기기 소유자가 호출하면 시스템은 메시지를 표시하지 않고 기기 초기화를 시작합니다.
삽입된 eUICC SIM에서 구독 데이터를 삭제하려면 wipeData()
를 호출하고 flags
인수에 WIPE_EUICC
를 포함합니다.
연결된 프로필 소유자를 위한 방법
연결된 프로필 소유자는 다음 방법을 사용할 수 있습니다.
DevicePolicyManager.setKeyguardDisabled()
DevicePolicyManager.setStatusBarDisabled()
PackageInstaller.createSession()