다음을 통해 공유


Android용 Intune 앱 SDK - 앱 참여 기능

Android용 Microsoft Intune 앱 SDK를 사용하면 Intune 앱 보호 정책( APP 또는 MAM 정책이라고도 함)을 네이티브 Java/Kotlin Android 앱에 통합할 수 있습니다. Intune 관리형 애플리케이션은 Intune 앱 SDK와 통합된 애플리케이션입니다. Intune 관리자는 Intune이 앱을 적극적으로 관리할 때 Intune 관리 앱에 앱 보호 정책을 쉽게 배포할 수 있습니다.

참고

이 가이드는 여러 가지 개별 단계로 나뉩니다. 먼저 통합 계획을 검토합니다.

7단계: 앱 참여 기능

스테이지 목표

  • Intune 앱 SDK에서 제공하는 다양한 앱 참여 기능에 대해 알아봅니다.
  • 앱 및 사용자와 관련된 앱 참여 기능을 통합합니다.
  • 이러한 기능의 통합을 테스트합니다.

"앱 참여 기능"이란?

이 SDK 통합 프로세스는 개발자가 작성해야 하는 앱별 코드의 양을 최소화하려고 시도합니다. SDK 통합의 이전 단계를 성공적으로 완료하면 이제 앱에서 파일 암호화, 복사/붙여넣기 제한, 스크린샷 차단 및 데이터 전송 제한과 같은 대부분의 앱 보호 정책 설정을 적용할 수 있습니다.

그러나 제대로 적용하려면 앱별 코드가 필요한 몇 가지 설정이 있습니다. 이를 앱 참여 기능이라고 합니다. 일반적으로 SDK는 애플리케이션의 코드 또는 최종 사용자 시나리오에 대한 컨텍스트가 부족하여 이러한 설정을 자동으로 적용하므로 개발자가 SDK API를 적절하게 호출해야 합니다.

앱 참여 기능이 반드시 선택 사항인 것은 아닙니다. 앱의 기존 기능에 따라 이러한 기능이 필요할 수 있습니다. 자세한 내용은 SDK 통합에 대한 주요 결정을 참조하세요.

이 가이드의 이전 단계에서는 이미 몇 가지 앱 참여 기능을 설명했습니다.

이 가이드의 나머지 부분에는 나머지 앱 참여 기능 집합이 설명되어 있습니다.

  • 로컬 또는 클라우드 스토리지에서 파일 저장을 /여는 것으로 제한하는 정책을 적용합니다.
  • 알림의 콘텐츠를 제한하는 정책을 적용합니다.
  • 백업 데이터를 보호하는 정책을 적용합니다.
  • 앱에 사용자 지정 화면 캡처 코드가 있는 경우 화면 캡처를 제한하는 정책을 적용합니다.
  • App Protection CA를 지원합니다.
  • SDK에서 알림을 등록합니다.
  • 사용자 지정 애플리케이션 테마를 적용합니다.
  • Intune의 신뢰할 수 있는 인증서를 사용하여 온-프레미스 엔드포인트에 대한 신뢰 체인을 보장합니다.

앱 참여 기능 기본 사항

AppPolicy 인터페이스에는 특정 작업이 허용되는지 여부를 앱에 알리는 많은 메서드가 포함되어 있습니다.

대부분의 앱 참여 기능은 다음과 같습니다.

  • 작업이 허용되는지 확인하기 위해 앱 코드에서 올바른 위치를 식별합니다.
  • 메서드를 AppPolicy 호출하여 현재 구성된 정책에 따라 작업이 허용되는지 확인합니다.
  • 결과에 따라 작업을 완료하도록 허용하거나 작업이 차단될 때 앱 동작을 수정합니다.

인스턴스를 AppPolicy 검색하려면 또는 getPolicyForIdentity(final String identity)와 같은 getPolicyMAMPolicyManager 메서드 중 하나를 사용합니다.

AppPolicy의 정보 메서드

AppPolicy 모든 메서드가 앱 참여 기능에 연결된 것은 아닙니다. 일부 메서드는 정보를 제공하여 SDK에서 해당 정책을 자동으로 적용하더라도 현재 구성된 정책을 앱에 제공합니다. 이러한 메서드는 특정 정책을 구성할 때 앱에서 사용자 지정 사용자 환경을 제공할 수 있는 기회를 제공하기 위해 존재합니다.

예: 스크린샷이 차단되었는지 확인

앱에 사용자가 스크린샷을 찍을 수 있는 컨트롤이 있는 경우 앱 보호 정책에 스크린샷이 차단된 경우 해당 컨트롤을 사용하지 않도록 설정하거나 숨길 수 있습니다.

앱에서 를 호출 MAMPolicyManager.getPolicy(currentActivity).getIsScreenCaptureAllowed()하여 이를 확인할 수 있습니다.

앱과 디바이스 또는 클라우드 스토리지 위치 간의 데이터 전송을 제한하는 정책

대부분의 앱을 사용하면 최종 사용자가 로컬 파일 스토리지 또는 클라우드 스토리지 서비스에서 데이터를 저장하거나 열 수 있습니다. Intune 앱 SDK를 사용하면 IT 관리자가 앱이 데이터를 저장하고 데이터를 열 수 있는 위치를 제한하여 데이터 수신 및 데이터 유출로부터 보호할 수 있습니다.

참고

앱이 앱에서 직접 개인 또는 클라우드 위치에 저장 을 허용하거나 데이터를 앱에 직접 열 수 있도록 허용하는 경우 IT 관리자가 이 저장/열기를 차단할 수 있도록 이 Intune 앱 SDK 앱 참여 기능을 구현해야 합니다 .

디바이스 또는 클라우드 스토리지에 저장

API를 통해 앱은 getIsSaveToLocationAllowed 구성된 정책에 따라 특정 위치에 저장이 지정된 ID에 허용되는지 여부를 알 수 있습니다.

MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(
SaveLocation service, String username);

앱이 검사를 구현 getIsSaveToLocationAllowed 해야 하는지 여부를 확인하려면 다음 표를 검토하여 앱이 데이터 송신을 지원하는지 확인합니다.

service 매개 변수: SaveLocation 열거형 값 사용 사례 연결된 사용자 이름
ONEDRIVE_FOR_BUSINESS 앱이 OneDrive에 데이터를 저장하고 있습니다. username 클라우드 서비스 인증 및 Microsoft Entra 인증 모두에 사용되는 계정의 입니다. 이러한 사용자 이름이 없거나 사용자 이름을 알 수 없는 경우 을 사용합니다 null.
SHAREPOINT 앱이 Sharepoint에 데이터를 저장하고 있습니다. username 클라우드 서비스 인증 및 Microsoft Entra 인증 모두에 사용되는 계정의 입니다. 이러한 사용자 이름이 없거나 사용자 이름을 알 수 없는 경우 을 사용합니다 null.
BOX 이 앱은 Box에 데이터를 저장합니다. username 클라우드 서비스 인증 및 Microsoft Entra 인증 모두에 사용되는 계정의 입니다. 이러한 사용자 이름이 없거나 사용자 이름을 알 수 없는 경우 을 사용합니다 null.
LOCAL 앱은 앱의 프라이빗 스토리지가 아닌 디바이스의 외부 스토리지 위치에 데이터를 저장합니다. 외부 스토리지는 클라우드 서비스로 간주되지 않으므로 항상 사용자 이름 매개 변수와 함께 null 사용해야 합니다.
PHOTO_LIBRARY 앱이 Android 로컬 사진 저장소에 데이터를 저장하고 있습니다. Android 로컬 사진 스토리지는 클라우드 서비스로 간주되지 않으므로 항상 사용자 이름 매개 변수와 함께 null 사용해야 합니다.
ACCOUNT_DOCUMENT 앱은 앱 내의 계정과 연결된 위치에 데이터를 저장하고 있으며 위에서 지정한 특정 클라우드 위치 중 하나가 아닙니다. *이 위치는 다중 ID 앱 내의 계정 간에 데이터를 전달할 수 있는지 확인하는 데 사용해야 합니다.- username Microsoft Entra 인증에 사용되는 계정의 입니다. 이러한 사용자 이름이 없거나 사용자 이름을 알 수 없는 경우 을 사용합니다 null.
OTHER 앱은 위에서 지정하지 않고 에 대한 ACCOUNT_DOCUMENT조건을 충족하지 않는 위치에 데이터를 저장합니다. username 이 위치에 대해 평가되지 않으므로 이어야 null합니다.

앱 작업에 필요하거나 표시를 위해 일시적으로 다운로드되는 프라이빗 앱 스토리지에 배치된 파일은 항상 허용됩니다. 를 확인할 getIsSaveToLocationAllowed필요가 없습니다. 확인 SaveLocation.LOCAL

  1. 프라이빗 앱 스토리지 외부에 저장된 파일입니다.
  2. 앱 작업에 필요하지 않은 프라이빗 앱 스토리지에 다운로드된 파일(예: 사용자가 의도적으로 디바이스에 다운로드하도록 선택).

참고

저장 정책을 username 확인할 때 은 저장되는 클라우드 서비스와 연결된 UPN/username/email이어야 합니다(저장되는 문서를 소유한 계정과 반드시 동일하지는 않음 ).

로컬 또는 클라우드 스토리지 위치에서 데이터 열기

API를 통해 앱은 getIsOpenFromLocationAllowed 구성된 정책에 따라 특정 위치에서 열기가 지정된 ID에 허용되는지 여부를 알 수 있습니다.

MAMPolicyManager.getPolicy(currentActivity).getIsOpenFromLocationAllowed(
OpenLocation location, String username);

앱이 검사를 구현 getIsOpenFromLocationAllowed 해야 하는지 여부를 확인하려면 다음 표를 검토하여 앱이 데이터 수신을 지원하는지 확인합니다.

location 매개 변수: OpenLocation 열거형 값 사용 사례 연결된 사용자 이름
ONEDRIVE_FOR_BUSINESS 앱이 OneDrive에서 데이터를 열고 있습니다. username 클라우드 서비스 인증 및 Microsoft Entra 인증 모두에 사용되는 계정의 입니다. 이러한 사용자 이름이 없거나 사용자 이름을 알 수 없는 경우 을 사용합니다 null.
SHAREPOINT 앱이 Sharepoint에서 데이터를 열고 있습니다. username 클라우드 서비스 인증 및 Microsoft Entra 인증 모두에 사용되는 계정의 입니다. 이러한 사용자 이름이 없거나 사용자 이름을 알 수 없는 경우 을 사용합니다 null.
CAMERA 앱이 카메라에서 데이터를 열고 있습니다. null 디바이스 카메라가 클라우드 서비스가 아니기 때문에 값입니다.
LOCAL 앱이 앱의 프라이빗 스토리지가 아닌 디바이스의 외부 스토리지 위치에서 데이터를 열고 있습니다. 외부 스토리지는 클라우드 서비스 위치가 아니지만 소유권을 username 나타내기 때문에 매개 변수가 필요합니다.
로컬 스토리지에서 파일을 열 때 파일 소유자의 다른 ID가 파일을 열도록 허용할 수도 있거나 허용하지 않을 수도 있으므로 파일 소유자는 항상 고려해야 합니다.
- ID 태그가 지정된 파일username 의 경우 파일 소유자의 ID여야 합니다.
- ID 태그 username가 없는 파일의 경우 은 이어야 null합니다.
PHOTO_LIBRARY 앱이 Android 사진 로컬 스토리지에서 데이터를 열고 있습니다. Android 로컬 사진 스토리지는 클라우드 서비스로 간주되지 않으므로 항상 사용자 이름 매개 변수와 함께 null 사용해야 합니다.
ACCOUNT_DOCUMENT 앱이 앱 내의 계정과 연결된 위치에서 데이터를 열고 있으며 위에서 지정한 특정 클라우드 위치 중 하나가 아닙니다. *이 위치는 다중 ID 앱 내의 계정 간에 데이터를 전달할 수 있는지 확인하는 데 사용해야 합니다.- username Microsoft Entra 인증에 사용되는 계정의 입니다. 이러한 사용자 이름이 없거나 사용자 이름을 알 수 없는 경우 을 사용합니다 null.
OTHER 앱이 위에서 지정하지 않고 에 대한 ACCOUNT_DOCUMENT조건을 충족하지 않는 위치에서 데이터를 열고 있습니다. username 이 위치에 대해 평가되지 않으므로 이어야 null합니다.

참고

열린 정책을 확인할 때 는 username 열려 있는 파일 또는 클라우드 서비스와 연결된 UPN/username/email이어야 합니다(문서를 여는 계정과 반드시 동일하지는 않음 ).

편의를 위해 SDK는 로컬 스토리지의 파일에 대한 매개 변수를 사용하는 File 메서드 AppPolicy.isOpenFromLocalStorageAllowed 를 제공합니다. 정책 적용 조건은 에서 파일 소유자 usernameFile의 구문 분석을 처리하는 경우를 제외하고 를 호출 AppPolicy.isOpenFromLocationAllowed(OpenLocation.LOCAL, username) 하는 것과 기능적으로 동일합니다.

차단된 공유 대화 상자

SDK는 MAM 정책에 의해 데이터 전송 작업이 차단되었음을 사용자에게 알리는 대화 상자를 제공합니다.

또는 isOpenFromAllowedForLocation API 호출로 인해 저장/열기 작업이 차단될 때마다 isSaveToAllowedForLocation 대화 상자가 사용자에게 표시되어야 합니다. 대화 상자에 제네릭 메시지가 표시되고 해제되면 호출 Activity 로 돌아갑니다.

대화 상자를 표시하려면 다음 코드를 추가합니다.

MAMUIHelper.showSharingBlockedDialog(currentActivity)

파일 공유 허용

퍼블릭 스토리지 위치에 저장할 수 없는 경우 앱에서 앱 프라이빗 스토리지 에 파일을 다운로드한 다음 시스템 선택기로 열어 파일을 볼 수 있도록 허용해야 합니다.

알림 내 콘텐츠 제한 정책

단일 ID 앱의 경우 Intune 앱 SDK의 기본 동작은 앱 보호 정책이 알림을 제한할 때 모든 알림을 차단하려고 시도합니다.

SDK의 기본 동작은 제한됩니다. SDK는 알림에서 관리되는 콘텐츠만 제거하기 위한 "조직 데이터 차단" 값을 자동으로 적용할 수 없습니다. 다중 ID 앱의 경우 SDK는 관리되는 콘텐츠가 포함된 알림을 확인할 수 없습니다.

앱이 알림을 표시하고 다중 ID이거나 "조직 데이터 차단" 값을 적용하려는 경우 알림을 표시하기 전에 알림과 연결된 계정에 대한 알림 제한 정책을 확인해야 합니다.

정책이 적용되는지 확인하려면 다음을 호출합니다.

NotificationRestriction notificationRestriction =
    MAMPolicyManager.getPolicyForIdentity(notificationIdentity).getNotificationRestriction();

반환된 NotificationRestriction 열거형의 값은 다음과 같습니다.

NotificationRestriction 열거형 예상 앱 동작
BLOCKED 앱은 이 정책과 연결된 계정에 대한 알림을 표시 해서는 안 됩니다 . 단일 ID 앱의 경우 Intune 앱 SDK는 모든 알림을 자동으로 차단하며 추가 코드가 필요하지 않습니다.
BLOCK_ORG_DATA 앱에는 조직 데이터가 포함되지 않은 수정된 알림이 표시되어야 합니다.
UNRESTRICTED 앱에 모든 알림이 표시되어야 합니다.

앱이 를 제대로 호출 getNotificationRestriction하지 않는 경우 MAM SDK는 단일 ID 앱에 대해서만 알림을 자동으로 제한하기 위해 최선을 다할 것입니다.

이 경우 는 BLOCK_ORG_DATA 와 동일하게 BLOCKED 처리되며 알림은 전혀 표시되지 않습니다.

보다 세분화된 컨트롤을 보려면 의 getNotificationRestriction 값을 확인하고 앱 알림을 적절하게 수정합니다.

백업 데이터 보호 정책

Intune 앱 SDK는 Android의 기본 제공 백업 및 복원 기능에 대한 데이터 업로드를 차단할 수 있습니다. Android의 백업 및 복원에 대한 자세한 내용은 Android API 가이드 및 Android S/12에 도입된 변경 내용을 참조하세요. 백업 및 복원으로 변경합니다.

앱용 자동 백업

Android M부터 Android는 앱의 대상 API에 관계없이 앱용 Google 드라이브에 자동 전체 백업 을 제공하기 시작했습니다.

Intune을 사용하면 데이터 보호가 적용되도록 특정 Intune 통합 지침과 함께 XML에서 사용자 지정 규칙을 정의하는 기능을 포함하여 Android에서 사용할 수 있는 모든 자동 복구 기능을 활용할 수 있습니다.

앱 매니페스트에서 백업 동작 구성

기본적으로 는 android:allowBackup백업 사용 및 사용 안 함에서 설명한 대로 true로 설정됩니다.

앱에 전체 백업 및 복원 기능이 필요하지 않은 경우 false로 설정합니다android:allowBackup. 이 경우 추가 작업이 필요하지 않으며 "회사" 데이터가 앱 내에 유지됩니다.

앱에 전체 백업 및 복원 기능이 필요한 경우 true로 설정하고 android:allowBackup 다음 추가 단계를 수행합니다.

  1. 앱에서 자체 사용자 지정 BackupAgent를 사용하지 않는 경우 기본 MAMBackupAgent를 사용하여 Intune 정책을 준수하는 자동 전체 백업을 허용합니다. 앱 매니페스트에 다음을 배치합니다.

    <application
    ...
      android:fullBackupOnly="true"
      android:backupAgent="com.microsoft.intune.mam.client.app.backup.MAMDefaultBackupAgent"
      ...>
      </application>
    
  2. [선택 사항] 선택적 사용자 지정 BackupAgent를 구현한 경우 MAMBackupAgent 또는 MAMBackupAgentHelper를 사용해야 합니다. 다음 섹션을 참조하세요. Android M 이상에서 간편한 백업을 제공하는 1단계에서 설명한 Intune의 MAMDefaultBackupAgent를 사용하도록 전환하는 것이 좋습니다.

  3. 앱에서 수신해야 하는 전체 백업 유형(필터링되지 않음, 필터링됨 또는 없음)을 결정하는 경우 특성을 android:fullBackupContent 앱에서 true, false 또는 XML 리소스로 설정해야 합니다.

  4. 그런 다음 에 대한 android:fullBackupContent 값을 메타데이터 태그에 com.microsoft.intune.mam.FullBackupContent 복사하고 API 31에 추가된 새 XML 구성 형식을 지원하는 앱의 com.microsoft.intune.mam.DataExtractionRules 경우 메타데이터 태그에 복사해야 합니다.

    • 예제 1: 앱에서 제외 없이 전체 백업을 수행하려면 특성 및 메타데이터 태그를 true로 설정해야 합니다.

      <application
        ...
        android:fullBackupContent="true"
        ...>
      </application>
      ...
      <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:value="true" />
      <meta-data android:name="com.microsoft.intune.mam.DataExtractionRules" android:value="true" />
      
    • 예제 2: 앱에서 사용자 지정 BackupAgent 을 사용하고 Intune 정책 준수 자동 백업을 완전히 옵트아웃하려면 특성 및 메타데이터 태그를 false로 설정해야 합니다.

      <application
        ...
        android:fullBackupContent="false"
        ...>
      </application>
      ...
      <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:value="false" />
      <meta-data android:name="com.microsoft.intune.mam.DataExtractionRules" android:value="false" />
      
    • 예제 3: 앱이 XML 파일에 정의된 사용자 지정 규칙에 따라 전체 백업을 수행하도록 하려면 특성 및 메타데이터 태그를 동일한 XML 리소스로 설정합니다.

      <application
        ...
        android:fullBackupContent="@xml/my_full_backup_content_scheme"
        android:dataExtractionRules="@xml/my_data_extraction_rules_scheme"
        ...>
      </application>
      ...
      <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:resource="@xml/my_full_backup_content_scheme" />
      <meta-data android:name="com.microsoft.intune.mam.DataExtractionRules" android:resource="@xml/my_data_extraction_rules_scheme" />
      

키/값 백업

키/값 백업 옵션은 모든 API 8 이상에서 사용할 수 있으며 Android Backup 서비스에 앱 데이터를 업로드합니다. 앱당 데이터 양은 5MB로 제한됩니다. 키/값 백업을 사용하는 경우 BackupAgentHelper 또는 BackupAgent를 사용해야 합니다.

BackupAgentHelper

BackupAgentHelper 는 네이티브 Android 기능과 Intune MAM 통합 BackupAgentHelper 측면에서 BackupAgent 보다 구현하기 쉬우며, 개발자는 전체 파일 및 공유 기본 설정을 FileBackupHelperSharedPreferencesBackupHelper (각각)에 등록할 수 있습니다. 그러면 생성 시 BackupAgentHelper에 추가됩니다. Intune MAM에서 BackupAgentHelper를 사용하려면 아래 단계를 수행합니다.

  1. 를 사용하여 다중 ID 백업을 BackupAgentHelper활용하려면 Android 가이드에서 BackupAgentHelper 확장을 참조하세요.

  2. 클래스가 BackupAgentHelper, FileBackupHelper 및 SharedPreferencesBackupHelper에 해당하는 MAM을 확장하게 합니다.

Android 클래스 MAM 등가
BackupAgentHelper MAMBackupAgentHelper
FileBackupHelper MAMFileBackupHelper
SharedPreferencesBackupHelper MAMSharedPreferencesBackupHelper

이러한 지침에 따라 다중 ID 백업 및 복원이 성공합니다.

BackupAgent

BackupAgent를 사용하면 백업되는 데이터에 대해 훨씬 더 명시적일 수 있습니다. 개발자는 구현을 상당히 책임지므로 Intune에서 적절한 데이터 보호를 보장하기 위해 더 많은 단계가 필요합니다. 대부분의 작업이 사용자에게 푸시되기 때문에 개발자인 Intune 통합은 약간 더 많이 관련됩니다.

MAM 통합:

  1. 키/값 백업 및 특히 BackupAgent 확장에 대한 Android 가이드를 주의 깊게 읽어 BackupAgent 구현이 Android 지침을 따르도록 합니다.

  2. 클래스가 MAMBackupAgent를 확장하게 합니다.

다중 ID 백업:

  1. 백업을 시작하기 전에 백업하려는 파일 또는 데이터 버퍼가 실제로 IT 관리자가 다중 ID 시나리오에서 백업할 수 있는지 확인합니다. 이를 확인하려면 MAMFileProtectionManagerMAMDataProtectionManager에서 를 사용합니다isBackupAllowed. 파일 또는 데이터 버퍼를 백업할 수 없는 경우 백업에 포함하면 안 됩니다.

  2. 백업 중에 1단계에서 확인한 파일의 ID를 백업하려면 데이터를 추출하려는 파일로 를 호출 backupMAMFileIdentity(BackupDataOutput data, File … files) 해야 합니다. 그러면 새 백업 엔터티가 자동으로 만들어지고 에 기록 BackupDataOutput 됩니다. 이러한 엔터티는 복원 시 자동으로 소비됩니다.

다중 ID 복원: 데이터 백업 가이드는 애플리케이션의 데이터를 복원하기 위한 일반 알고리즘을 지정하고 BackupAgent 확장 섹션의 코드 샘플을 제공합니다. 다중 ID 복원에 성공하려면 다음 사항에 특별히 주의하여 이 코드 샘플에 제공된 일반 구조를 따라야 합니다.

  1. * 루프를 while(data.readNextHeader())활용하여 백업 엔터티를 통과해야 합니다.

  2. 에 쓴 onBackup키와 일치하지 않는 경우 data.getKey() 를 호출 data.skipEntityData() 해야 합니다. 이 단계를 수행하지 않으면 복원이 실패할 수 있습니다.

  3. 자동으로 작성하는 엔터티가 손실되므로 * 구문에서 while(data.readNextHeader())백업 엔터티를 사용하는 동안 반환하지 마세요.

  • 여기서 data 은 복원 시 앱에 전달되는 MAMBackupDataInput 의 지역 변수 이름입니다.

사용자 지정 화면 캡처 제한

앱에 Android의 Window수준 FLAG_SECURE 제한을 우회하는 사용자 지정 화면 캡처 기능이 포함된 경우 기능에 대한 모든 권한을 허용하기 전에 화면 캡처 정책을 확인해야 합니다. 예를 들어 앱에서 사용자 지정 렌더링 엔진을 사용하여 현재 보기를 PNG 파일로 렌더링하는 경우 먼저 를 확인해야 AppPolicy.getIsScreenCaptureAllowed()합니다.

참고

앱에 사용자 지정 또는 타사 화면 캡처 기능이 없는 경우 화면 캡처를 제한하는 작업을 수행할 필요가 없습니다. 화면 캡처 정책은 모든 MAM 통합 앱에 Window 대해 수준에서 자동으로 적용됩니다. OS 또는 다른 앱이 앱에서 를 Window 캡처하려는 모든 시도는 필요에 따라 차단됩니다. 예를 들어 사용자가 Android의 기본 제공 스크린샷 또는 화면 녹화 기능을 통해 앱의 화면을 캡처하려고 하면 앱의 참여 없이 캡처가 자동으로 제한됩니다.

App Protection CA 지원

앱 기반 CA라고도 하는 App Protection CA(조건부 액세스)는 애플리케이션이 Intune 앱 보호 정책에 의해 관리될 때까지 리소스에 대한 액세스를 제한합니다. Microsoft Entra ID는 CA 보호 리소스에 액세스하기 위한 토큰을 부여하기 전에 앱을 APP에서 등록하고 관리하도록 요구하여 이를 적용합니다.

참고

App Protection CA를 지원하려면 MSAL 라이브러리 버전 1.0.0 이상이 필요합니다.

MSAL 비준수 처리

계정에 대한 토큰을 획득할 때 MSAL 라이브러리는 을 반환하거나 throw MsalIntuneAppProtectionPolicyRequiredException 하여 앱 보호 정책 관리를 준수하지 않았음을 나타낼 수 있습니다. 규정 준수 수정에 사용하기 위해 예외에서 추가 매개 변수를 추출할 수 있습니다( MAMComplianceManager 참조). 수정에 성공하면 앱은 MSAL을 통해 토큰 획득을 다시 수행할 수 있습니다.

MAMComplianceManager

MAMComplianceManager 인터페이스는 MSAL에서 정책 필수 오류가 수신될 때 사용됩니다. 여기에는 앱을 규격 상태로 전환하기 위해 호출해야 하는 [remediateCompliance] 메서드가 포함되어 있습니다. 에 대한 참조는 MAMComplianceManager 다음과 같이 가져올 수 있습니다.

MAMComplianceManager mgr = MAMComponents.get(MAMComplianceManager.class);

// make use of mgr

MAMComplianceManager 반환된 인스턴스는 가 아님을 보장합니다null.

package com.microsoft.intune.mam.policy;

public interface MAMComplianceManager {
    void remediateCompliance(String upn, String aadId, String tenantId, String authority, boolean showUX);
}

remediateCompliance() 메서드는 Microsoft Entra ID가 요청된 토큰을 부여하는 조건을 충족하기 위해 앱을 관리 하에 두려고 시도하기 위해 호출됩니다. 처음 네 개의 매개 변수는 MSAL AuthenticationCallback.onError() 메서드에서 받은 예외에서 추출할 수 있습니다(아래 코드 샘플 참조). 최종 매개 변수는 준수 시도 중에 UX가 표시되는지 여부를 제어하는 부울입니다.

remediateCompliance 는 이 작업 중에 앱이 사용자 지정된 UX를 표시할 필요가 없도록 간단한 차단 진행률 대화 상자를 표시합니다. 이 대화 상자는 규정 준수 수정이 진행되는 동안에만 표시됩니다. 최종 결과가 표시되지 않습니다. 앱은 준수 수정 시도의 COMPLIANCE_STATUS 성공 또는 실패를 처리하기 위해 알림에 대한 수신기를 등록할 수 있습니다. 자세한 내용은 준수 상태 알림을 참조하세요.

remediateCompliance() 는 규정 준수 설정의 일부로 MAM 등록을 시작할 수 있습니다. 앱이 등록 알림에 대한 알림 수신자를 등록한 경우 등록 알림을 받을 수 있습니다. 앱의 등록된 MAMServiceAuthenticationCallback 메서드는 acquireToken() 등록에 대한 토큰을 가져오기 위해 호출됩니다. acquireToken() 는 앱이 자체 토큰을 획득하기 전에 호출되므로 성공적인 토큰 획득 후에 앱이 수행하는 모든 부기 또는 계정 만들기 작업은 아직 수행되지 않았을 수 있습니다. 콜백은 이 경우 토큰을 획득할 수 있어야 합니다.

에서 acquireToken()토큰을 반환할 수 없는 경우 규정 준수 수정 시도가 실패합니다.

요청된 리소스에 대한 유효한 토큰을 사용하여 나중에 호출 updateToken 하는 경우 지정된 토큰을 사용하여 준수 수정이 즉시 다시 시도됩니다.

참고

사용자가 이미 브로커를 설치하고 예외가 수신되기 전에 MsalIntuneAppProtectionPolicyRequiredException 디바이스를 등록하도록 안내되었기 때문에 에서 자동 토큰 획득이 계속 가능합니다acquireToken(). 이로 인해 브로커는 캐시에 유효한 새로 고침 토큰을 갖기 때문에 요청된 토큰을 자동으로 획득할 수 있습니다.

다음은 메서드에서 AuthenticationCallback.onError() 정책 필수 오류를 수신하고 MAMComplianceManager 를 호출하여 오류를 처리하는 샘플입니다.

public void onError(@Nullable MsalException exc) {
    if (exc instanceof MsalIntuneAppProtectionPolicyRequiredException) {

        final MsalIntuneAppProtectionPolicyRequiredException policyRequiredException =
            (MsalIntuneAppProtectionPolicyRequiredException) ex;

        final String upn = policyRequiredException.getAccountUpn();
        final String aadId = policyRequiredException.getAccountUserId();
        final String tenantId = policyRequiredException.getTenantId();
        final String authority = policyRequiredException.getAuthorityURL();

        MAMComplianceManager complianceManager = MAMComponents.get(MAMComplianceManager.class);
        complianceManager.remediateCompliance(upn, aadId, tenantId, authority, showUX);
    }
}

준수 상태 알림

앱이 형식 COMPLIANCE_STATUSMAMComplianceNotification 의 알림을 등록하는 경우 준수 수정 시도의 최종 상태를 앱에 알리기 위해 가 전송됩니다. 등록에 대한 자세한 내용은 SDK에서 알림 등록을 참조하세요.

public interface MAMComplianceNotification extends MAMUserNotification {
    MAMCAComplianceStatus getComplianceStatus();
    String getComplianceErrorTitle();
    String getComplianceErrorMessage();
}

메서드는 getComplianceStatus() 준수 수정 시도의 결과를 [MAMCAComplianceStatus] 열거형의 값으로 반환합니다.

상태 코드 설명
UNKNOWN 상태를 알 수 없습니다. 이는 예기치 않은 실패 이유를 나타낼 수 있습니다. 추가 정보는 회사 포털 로그에서 찾을 수 있습니다.
COMPLIANT 규정 준수 수정에 성공했으며 앱이 이제 정책을 준수합니다. MSAL 토큰 획득을 다시 시도해야 합니다.
NOT_COMPLIANT 규정 준수 수정 시도가 실패했습니다. 앱이 규정을 준수하지 않으며 오류 조건이 수정될 때까지 MSAL 토큰 획득을 다시 시도하면 안 됩니다. 추가 오류 정보는 MAMComplianceNotification과 함께 전송됩니다.
SERVICE_FAILURE Intune 서비스에서 규정 준수 데이터를 검색하는 동안 오류가 발생했습니다. 추가 정보는 회사 포털 로그에서 찾을 수 있습니다.
NETWORK_FAILURE Intune 서비스에 연결하는 동안 오류가 발생했습니다. 네트워크 연결이 복원되면 앱이 토큰 획득을 다시 시도해야 합니다.
CLIENT_ERROR 클라이언트와 관련된 몇 가지 이유로 규정 준수 수정 시도가 실패했습니다. 예를 들어 토큰 또는 잘못된 사용자가 없습니다. 추가 오류 정보는 MAMComplianceNotification과 함께 전송됩니다.
PENDING 시간 제한을 초과할 때 상태 응답이 서비스에서 아직 수신되지 않았기 때문에 규정 준수 수정 시도가 실패했습니다. 앱은 나중에 토큰 획득을 다시 시도해야 합니다.
COMPANY_PORTAL_REQUIRED 준수 수정이 성공하려면 회사 포털을 디바이스에 설치해야 합니다. 회사 포털이 디바이스에 이미 설치된 경우 앱을 다시 시작해야 합니다. 이 경우 사용자에게 앱을 다시 시작하라는 대화 상자가 표시됩니다.

규정 준수 상태가 인 경우 앱은 MAMCAComplianceStatus.COMPLIANT원래 토큰 획득(자체 리소스용)을 다시 시작해야 합니다.

규정 준수 수정 시도가 실패하면 getComplianceErrorTitle()getComplianceErrorMessage() 메서드는 앱이 선택하는 경우 최종 사용자에게 표시할 수 있는 지역화된 문자열을 반환합니다. 대부분의 오류 사례는 앱에서 수정할 수 없으므로 일반적인 경우 계정 생성 또는 로그인에 실패하고 사용자가 나중에 다시 시도할 수 있도록 하는 것이 가장 좋습니다.

오류가 지속되면 회사 포털 로그가 원인을 파악하는 데 도움이 될 수 있습니다. 최종 사용자는 로그를 제출할 수 있습니다. 자세한 내용은 업로드 및 전자 메일 로그를 참조하세요.

다음은 익명 클래스를 사용하여 MAMNotificationReceiver 인터페이스를 구현하는 수신기를 등록하는 예제입니다.

final MAMNotificationReceiverRegistry notificationRegistry = MAMComponents.get(MAMNotificationReceiverRegistry.class);
// create a receiver
final MAMNotificationReceiver receiver = new MAMNotificationReceiver() {
    public boolean onReceive(MAMNotification notification) {
        if (notification.getType() == MAMNotificationType.COMPLIANCE_STATUS) {
            MAMComplianceNotification complianceNotification = (MAMComplianceNotification) notification;
            
            // take appropriate action based on complianceNotification.getComplianceStatus()
            
            // unregister this receiver if no longer needed
            notificationRegistry.unregisterReceiver(this, MAMNotificationType.COMPLIANCE_STATUS);
        }
        return true;
    }
};
// register the receiver
notificationRegistry.registerReceiver(receiver, MAMNotificationType.COMPLIANCE_STATUS);

참고

알림 수신자를 호출 remediateCompliance() 하기 전에 등록해야 알림이 누락될 수 있는 경합 상태를 방지할 수 있습니다.

App Protection CA에 대한 지원 선언

앱이 앱 CA 수정을 처리할 준비가 되면 앱이 App CA 준비됨임을 Microsoft ID에 알릴 수 있습니다. MSAL 애플리케이션에서 이 작업을 수행하려면 "protapp"의 클라이언트 기능을 사용하여 퍼블릭 클라이언트를 빌드합니다.

{
      "client_id" : "[YOUR_CLIENT_ID]",
      "authorization_user_agent" : "DEFAULT",
      "redirect_uri" : "[YOUR_REDIRECT_URI]",
      "multiple_clouds_supported":true,
      "broker_redirect_uri_registered": true,
      "account_mode": "MULTIPLE",
      "client_capabilities": "protapp",
      "authorities" : [
        {
          "type": "AAD",
          "audience": {
            "type": "AzureADandPersonalMicrosoftAccount"
          }
        }
      ]
    }

위의 작업을 완료했으면 아래 의 App Protection CA 유효성 검사 로 진행합니다.

구현 정보

참고

앱의 MAMServiceAuthenticationCallback.acquireToken() 메서드는 플래그에 대해 falseforceRefreshacquireTokenSilentAsync()전달해야 합니다.

AcquireTokenSilentParameters acquireTokenSilentParameters =
        builder.withScopes(Arrays.asList(scopes))
               .forceRefresh(false)
               .build();

acquireTokenSilentAsync(acquireTokenSilentParameters);

참고

수정 시도 중에 사용자 지정 차단 UX를 표시하려면 showUX 매개 변수remediateCompliance()에 대해 false를 에 전달해야 합니다. 를 호출 remediateCompliance()하기 전에 UX를 표시하고 먼저 알림 수신기를 등록해야 합니다. 이렇게 하면 매우 빠르게 실패할 경우 remediateCompliance() 알림을 놓칠 수 있는 경합 상태가 방지됩니다. 예를 들어 활동 onCreate() 서브클래스의 또는 onMAMCreate() 메서드는 알림 수신기를 등록한 다음 를 호출 remediateCompliance()하는 데 이상적인 위치입니다. 에 대한 remediateCompliance() 매개 변수는 의도 엑스트라로 UX에 전달할 수 있습니다. 준수 상태 알림이 수신되면 결과를 표시하거나 작업을 완료하기만 하면 됩니다.

참고

remediateCompliance() 은 계정을 등록하고 등록을 시도합니다. 기본 토큰을 획득하면 호출 registerAccountForMAM() 이 필요하지 않지만 이 작업을 수행하는 데는 아무런 해가 없습니다. 반면 앱이 토큰을 획득하지 못하고 사용자 계정을 제거하려는 경우 를 호출 unregisterAccountForMAM() 하여 계정을 제거하고 백그라운드 등록 재시도를 방지해야 합니다.

SDK에서 알림 등록

Intune 앱 SDK 가이드에서는 다음과 같은 SDK의 알림을 등록하기 위해 앱이 필요할 수 있는 몇 가지 시나리오에 대해 이미 설명했습니다.

이 섹션에서는 SDK가 보낼 수 있는 모든 유형의 알림, 애플리케이션이 수신 대기하려는 시기 및 이유, 알림 수신기를 구현하는 방법에 대해 설명합니다.

알림 유형

모든 SDK 알림은 MAMNotificationType 열거형을 반환하는 단일 함수인 getType()가 있는 MAMNotification 인터페이스를 구현합니다.

대부분의 알림은 함수를 통해 검색할 수 있는 단일 ID와 관련된 정보를 제공하는 MAMUserNotification입니다 getUserIdentity() .

MAMEnrollmentNotificationMAMComplianceNotification 은 MAM 서비스에 사용자/디바이스를 등록하려는 시도 결과와 각각 App Protection CA에 대한 규정 준수를 수정하려는 결과를 포함하는 을 추가로 확장 MAMUserNotification합니다.

알림 유형 알림 클래스 알림 이유 적용 가능 여부 처리 팁 스레드 정보
COMPLIANCE_STATUS MAMComplianceNotification 규정 준수 수정 시도의 결과를 반환합니다. App Protection CA를 구현하는 앱은 이를 처리해야 합니다. - 비결 정적
MAM_ENROLLMENT_RESULT MAMEnrollmentNotification 등록 시도의 결과를 반환합니다. 모든 앱은 이를 받습니다. - 비결 정적
MANAGEMENT_REMOVED MAMUserNotification 앱이 관리되지 않습니다. 활용하는 앱은 MAMDataProtectionManager 이를 처리해야 합니다. 아래 MANAGEMENT_REMOVED 참조하세요. UI 스레드에서는 안 됩니다.
REFRESH_APP_CONFIG MAMUserNotification 앱 구성 값이 변경되었을 수 있습니다. 앱 구성 및 캐시 앱 구성 데이터를 구현하는 앱은 이를 처리해야 합니다. 앱은 캐시된 앱 구성 데이터를 무효화하고 업데이트해야 합니다. 비결 정적
REFRESH_POLICY MAMUserNotification 앱 보호 정책이 변경되었을 수 있습니다. 앱 보호 정책을 캐시하는 앱은 이를 처리해야 합니다. 앱은 캐시된 앱 보호 정책 데이터를 무효화하고 업데이트해야 합니다. 비결 정적
WIPE_USER_DATA MAMUserNotification 초기화가 발생하려고 합니다(*). 활용하는 MAMDataProtectionManager 앱은 이 또는WIPE_USER_AUXILIARY_DATA 를 처리해야 합니다. 선택적 초기화를 참조하세요. UI 스레드에서는 안 됩니다.
WIPE_USER_AUXILIARY_DATA MAMUserNotification 초기화가 발생하려고 합니다(*). 다중 ID 앱만 이 기능을 수신합니다.
활용하는 MAMDataProtectionManager 앱은 이 또는WIPE_USER_DATA 를 처리해야 합니다.
선택적 초기화를 참조하세요. UI 스레드에서는 안 됩니다.
WIPE_COMPLETED MAMUserNotification 초기화가 완료되었습니다. 항상 선택 사항입니다. 또는 WIPE_USER_AUXILIARY_DATA이후에 WIPE_USER_DATA 배달됩니다. *앱이 또는 WIPE_USER_AUXILIARY_DATA에 대한 WIPE_USER_DATA 처리기에서 오류를 보고하는 경우 이 알림은 전송되지 않습니다.- UI 스레드에서는 안 됩니다.

(*) 초기화는 다음과 같은 여러 가지 이유로 발생할 수 있습니다.

  • 앱이 unregisterAccountForMAM이라고 합니다.
  • IT 관리자가 원격 초기화를 시작했습니다.
  • 관리자가 요구하는 조건부 액세스 정책이 충족되지 않았습니다.

경고

앱은 및 WIPE_USER_AUXILIARY_DATA 알림 모두에 WIPE_USER_DATA 등록해서는 안 됩니다.

MANAGEMENT_REMOVED

이 알림은 MANAGEMENT_REMOVED 이전에 정책 관리형 계정이 관리되지 않게 될 것임을 앱에 알릴 수 있습니다. 계정이 관리되지 않으면 앱은 더 이상 해당 계정의 암호화된 파일을 읽거나, 로 암호화된 계정의 데이터를 읽거나, 암호화된 MAMDataProtectionManager클립보드와 상호 작용하거나, 관리형 앱 에코시스템에 참여할 수 없습니다.

이렇게 하려면 사용자 데이터를 초기화하거나 사용자를 로그아웃할 필요가 없습니다(초기화가 필요한 WIPE_USER_DATA 경우 알림이 전송됨). 대부분의 앱은 이 알림을 처리할 필요가 없지만 를 사용하는 MAMDataProtectionManager 앱은 이를 처리해야 합니다. 자세한 내용은 데이터 버퍼 보호를 참조하세요.

SDK가 앱의 MANAGEMENT_REMOVED 수신기를 호출하면 다음이 true가 됩니다.

  • SDK는 앱에 속하는 이전에 암호화된 파일(보호된 데이터 버퍼는 아님)을 이미 해독했습니다. 앱에 직접 속하지 않는 sdcard의 공용 위치(예: 문서 또는 다운로드 폴더)의 파일은 암호 해독되지 않습니다.

  • 수신기 메서드(또는 수신기가 시작된 후 실행되는 다른 코드)에서 만든 새 파일 또는 보호된 데이터 버퍼는 암호화되지 않습니다.

  • 앱은 여전히 암호화 키에 액세스할 수 있으므로 데이터 버퍼 암호 해독과 같은 작업이 성공합니다.

앱의 수신기가 반환되면 더 이상 암호화 키에 액세스할 수 없습니다.

MAMNotificationReceiver 구현

SDK에서 알림을 등록하려면 앱이 MAMNotificationReceiver 를 만들고 MAMNotificationReceiverRegistry에 등록해야 합니다.

수신기를 등록하려면 메서드에서 수신기 및 원하는 알림 유형을 사용하여 을 호출 registerReceiver 합니다 Application.onCreate .

@Override
public void onCreate() {
  super.onCreate();
  MAMComponents.get(MAMNotificationReceiverRegistry.class)
    .registerReceiver(
      new ToastNotificationReceiver(),
      MAMNotificationType.WIPE_USER_DATA);
}

앱의 MAMNotificationReceiver 구현에는 메서드가 onReceive(MAMNotification notification) 포함되어야 합니다. 이 메서드는 수신된 각 알림에 대해 개별적으로 호출되며 를 반환 boolean해야 합니다. 일반적으로 이 메서드는 애플리케이션이 알림에 응답하는 데 오류가 발생하지 않는 한 항상 를 반환 true해야 합니다.

다른 유형의 Android 수신기와 마찬가지로 애플리케이션은 알림을 유연하게 처리할 수 있습니다.

  • 고유 알림 유형에 대한 고유한 MAMNotificationReceiver 구현을 만들 수 있습니다(아래 설명). 이 경우 각 구현과 각 알림 유형을 별도로 등록해야 합니다.
  • 여러 고유 알림 유형에 응답하기 위한 논리가 포함된 단일 MAMNotificationReceiver 구현을 사용할 수 있습니다. 이 경우 응답할 수 있는 각 알림 유형에 대해 등록해야 합니다.
  • 각각 동일한 알림 유형에 응답하는 여러 MAMNotificationReceiver 구현을 만들 수 있습니다. 이 경우 둘 다 동일한 알림 유형에 등록해야 합니다.

콜백이 UI 스레드에서 MAMNotificationReceiver.onReceive 실행되고 있지 않으므로 차단해도 안전합니다.

사용자 지정 테마

Intune 앱 SDK에 사용자 지정 테마를 제공할 수 있습니다. 이 사용자 지정 테마는 모든 SDK 화면 및 대화 상자에 적용됩니다. 테마가 제공되지 않으면 기본 SDK 테마가 사용됩니다.

사용자 지정 테마 제공

테마를 제공하려면 메서드에 Application.onMAMCreate 다음 코드 줄을 추가해야 합니다.

MAMThemeManager.setAppTheme(R.style.AppTheme);

위의 예제에서는 를 SDK가 적용할 스타일 테마로 바꿔 R.style.AppTheme 야 합니다.

신뢰할 수 있는 루트 인증서 관리

내부 웹 사이트 및 애플리케이션에 대한 보안 액세스를 제공하기 위해 온-프레미스 또는 프라이빗 인증 기관에서 발급한 SSL/TLS 인증서가 애플리케이션에 필요한 경우 Intune 앱 SDK는 API 클래스 MAMTrustedRootCertsManagerMAMCertTrustWebViewClient를 사용하여 인증서 신뢰 관리에 대한 지원을 추가했습니다.

참고

MAMCertTrustWebViewClient 는 Android 10 이상을 지원합니다.

신뢰할 수 있는 루트 인증서 관리는 다음을 지원합니다.

  • SSLContext
  • SSLSocketFactory
  • TrustManager
  • WebView

요구 사항

참고

신뢰할 수 있는 루트 인증서 관리는 Microsoft Tunnel VPN Gateway와 독립적으로 사용할 수 있지만 사용하기 위해 Microsoft MAM Tunnel에 라이선스를 부여해야 합니다.

Intune에서 신뢰할 수 있는 루트 인증서를 사용하여 트러스트 앵커 설정

신뢰할 수 있는 루트 인증서 관리를 사용하면 앱이 디바이스의 인증서와 함께 Intune의 신뢰할 수 있는 루트 인증서를 사용할 수 있습니다.

API 클래스 MAMTrustedRootCertsManagerMAMCertTrustWebViewClient 는 디바이스의 신뢰할 수 있는 루트 인증서 저장소에 온-프레미스 리소스에 대한 보안 연결을 설정하는 데 필요한 신뢰할 수 있는 루트 인증서가 없는 경우 앱 구성 정책을 통해 제공되는 Intune 신뢰할 수 있는 루트 인증서를 대체 옵션으로 사용합니다. 이러한 방식으로 앱은 디바이스 및 Intune 인증서를 모두 사용하여 보안 연결 및 신뢰할 수 있는 원본과의 통신을 확인할 수 있습니다.

네트워크 보안 설정을 향상시키기 위해 앱은 네트워크 보안 구성 XML 파일을 사용할 수 있습니다. 신뢰할 수 있는 루트 인증서 관리는 앱의 네트워크 보안 구성 XML에 다음 기능이 있는지 확인하여 이 추가 보안을 준수합니다.

  • 자체 서명된 인증서와 같은 추가 CA를 사용하여 사용자 지정 신뢰 앵커.
  • 신뢰할 수 있는 CA를 제한하기 위한 도메인별 규칙입니다.
  • 특정 도메인에 대한 인증서에 대한 핀 집합입니다.

참고

Android 네트워크 보안 구성에 대해 자세히 알아보기: 네트워크 보안 구성

트러스트를 검사하는 도메인에 적용되는 경우 신뢰할 수 있는 루트 인증서 관리는 이 도메인에 대한 사용자 지정 신뢰 검사를 건너뛰고 플랫폼의 기본 신뢰 관리자만 검사를 수행하도록 합니다.

클래스 MAMTrustedRootCertsManager

이 클래스는 다음 API를 제공합니다.

  • createSSLContext(String identity, String protocol): 지정된 ID 및 지정된 SSL/TLS 프로토콜에 대해 신뢰할 수 있는 루트 인증서를 사용하는 개체를 만듭니다 SSLContext . 이 클래스에서 반환된 SSLContext 개체는 디바이스 및 X509TrustManager MAM 서비스에서 결합된 신뢰할 수 있는 루트 인증서를 사용하는 개체를 사용하여 이미 올바르게 초기화되었습니다.
  • createSSLSocketFactory(String identity, String protocol): 지정된 ID 및 지정된 SSL/TLS 프로토콜에 대해 신뢰할 수 있는 루트 인증서를 사용하는 개체를 만듭니다 SSLSocketFactory . 반환 SSLSocketFactory 된 개체는 이 클래스의 동일한 SSLContext 개체에서 참조됩니다.
  • createX509TrustManagers(String identity): 디바이스에서 X509TrustManager 결합된 신뢰할 수 있는 루트 인증서를 사용하는 개체의 배열과 지정된 ID에 대한 MAM 서비스를 만듭니다.

참고

매개 변수는 identity UPN과 같은 애플리케이션을 실행하는 특정 사용자의 문자열 식별자여야 합니다. 사용자 식별자를 미리 알 수 없는 경우 null 값을 전달할 수 있으며 MAM은 이러한 API가 호출되는 스레드 또는 프로세스에서 올바른 ID를 검색하려고 시도합니다. ID를 검색하려면 MAM이 ID를 검색하려면 프로세스 또는 스레드에서 ID를 올바르게 설정해야 합니다. 프로세스 또는 스레드에서 활성 ID를 설정하는 방법에 대한 자세한 내용은 5단계: 다중 ID를 방문하세요.

참고

매개 변수가 protocol 제공되지 않으면 플랫폼에서 지원되는 가장 높은 SSL/TLS 프로토콜이 사용됩니다.

다음은 이 클래스를 사용하는 몇 가지 예입니다.

HttpsUrlConnection을 사용하는 예제
// Create an SSL socket factory using supplying the optional parameters identity and protocol
SSLSocketFactory sslSocketFactory = MAMTrustedRootCertsManager.createSSLSocketFactory(identity, "TLSv1.3");

// Create a URL object for the desired endpoint
URL url = new URL("https://example.com");

// Open a connection using the URL object
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();

// Set the SSL socket factory for the connection
httpsURLConnection.setSSLSocketFactory(sslSocketFactory);

// Perform any other configuration or operations on the connection as needed
...
OkHttpClient를 사용하는 예제
// Get the TrustManager instances for an identity from the SDK
TrustManager[] trustManagers = MAMTrustedRootCertsManager.createX509TrustManagers(identity);

// Get SSLContext from the platform
SSLContext sslContext = SSLContext.getInstance("TLSv1.3");

// Initialize the SSLContext with the trust managers from the Intune App SDK
sslContext.init(null, trustManagers, null);  

// Create an OkHttpClient.Builder object
OkHttpClient.Builder builder = new OkHttpClient.Builder();

// Set the SSLSocketFactory and the trust managers from the SDK
builder.sslSocketFactory(sslContext.socketFactory, trustManagers[0] as X509TrustManager).build();

// Build an OkHttpClient object from the builder
OkHttpClient okHttpClient = builder.build();

// Create a Request object for the desired endpoint
Request request = new Request.Builder().url("https://example.com").build();

// Execute the request using the OkHttpClient object and get a Response object
Response response = okHttpClient.newCall(request).execute();

// Perform any other operations on the response as needed
...

클래스 MAMCertTrustWebViewClient

이 클래스는 에서 SSL 오류를 android.net.http.SslError.SSL_UNTRUSTED 처리하는 방법을 제공하는 Android 클래스 android.webkit.WebViewClient 의 사용자 지정 구현을 WebView제공합니다. 오류를 처리할 때 클래스는 Intune에서 구성되고 MAM 서비스에서 받은 신뢰할 수 있는 루트 인증서를 사용하여 에서 SSL 오류를 WebView생성한 대상 URL에서 호스트의 신뢰성을 확인합니다. 사용자 지정 구현이 SSL 오류를 처리하지 않으면 슈퍼클래스에서 상속된 기본 동작이 호출됩니다. 이 클래스를 사용하는 경우 인스턴스를 만든 다음 를 호출 WebView.setWebViewClient(WebViewClient) 하여 인스턴스에 WebView 등록해야 합니다.

다음은 이 클래스를 사용하는 예제입니다.

WebView 사용 예제
// Get the MAM implementation of WebViewClient from the Intune App SDK
MAMCertTrustWebViewClient mamCertTrustWebViewClient = new MAMCertTrustWebViewClient();

// Set the MAM WebViewClient from the SDK as the current handler on the instance of WebView
webView.setWebViewClient(mamCertTrustWebViewClient);

// Perform any other operations on WebView
...

종료 조건

테스트의 용이성을 위해 변경 정책을 사용하여 신속하게 테스트를 참조하세요.

제한 사항에서 /open에 저장 유효성 검사

앱과 디바이스 또는 클라우드 스토리지 위치 간의 데이터 전송을 제한하는 정책을 구현하지 않은 경우 건너뜁니다.

앱이 클라우드 서비스 또는 로컬 데이터에 데이터를 저장하고 클라우드 서비스 또는 로컬 데이터에서 데이터를 열 수 있는 모든 시나리오를 다시 분류합니다.

간단히 하기 위해 이러한 테스트는 앱 내의 단일 위치에서 비즈니스용 OneDrive에서 데이터를 저장하고 여는 지원만 앱에 포함되어 있다고 가정합니다. 그러나 모든 조합의 유효성을 검사해야 합니다. 앱에서 데이터를 저장할 수 있는 모든 위치에 대해 지원되는 모든 저장 위치와 앱에서 데이터를 열 수 있는 모든 위치에 대해 지원되는 모든 열린 위치.

이러한 테스트의 경우 앱 및 Intune 회사 포털을 설치합니다. 테스트를 시작하기 전에 관리되는 계정으로 로그인합니다. 또한

  • 관리되는 계정의 정책을 다음과 같이 설정합니다.
    • "조직 데이터를 다른 앱으로 보내기"를 "정책 관리 앱"으로 보냅니다.
    • "다른 앱에서 데이터 받기"에서 "정책 관리 앱"으로.
시나리오 전제 조건 단계
에 저장, 완전히 허용됨 "조직 데이터 복사본 저장" 정책이 "허용"으로 설정됩니다. - 앱이 비즈니스용 OneDrive에 데이터를 저장할 수 있는 위치로 이동합니다.
- 비즈니스용 OneDrive에 문서를 앱에 로그인한 것과 동일한 관리 계정에 저장하려고 시도합니다.
- 저장이 허용되는지 확인합니다.
에 저장, 제외됨 - "조직 데이터 복사본 저장" 정책이 "차단"으로 설정됩니다.
- "사용자가 선택한 서비스에 복사본을 저장할 수 있도록 허용" 정책이 "비즈니스용 OneDrive"로만 설정됨
- 앱이 비즈니스용 OneDrive에 데이터를 저장할 수 있는 위치로 이동합니다.
- 비즈니스용 OneDrive에 문서를 앱에 로그인한 것과 동일한 관리 계정에 저장하려고 시도합니다.
- 저장이 허용되는지 확인합니다.
- 앱이 허용하는 경우 파일을 다른 클라우드 스토리지 위치에 저장하고 차단되었는지 확인합니다.
에 저장, 차단됨 "조직 데이터 복사본 저장" 정책이 "차단"으로 설정되었습니다. - 앱이 비즈니스용 OneDrive에 데이터를 저장할 수 있는 위치로 이동합니다.
- 비즈니스용 OneDrive에 문서를 앱에 로그인한 것과 동일한 관리 계정에 저장하려고 시도합니다.
- 저장이 차단되어 있는지 확인합니다.
- 앱이 허용하는 경우 파일을 다른 클라우드 스토리지 위치에 저장하고 차단되었는지 확인합니다.
에서 열기, 완전히 허용됨 "조직 문서에 데이터 열기" 정책이 "허용"으로 설정됩니다. - 앱이 비즈니스용 OneDrive에서 데이터를 열 수 있는 위치로 이동합니다.
- 비즈니스용 OneDrive에서 앱의 스토리지에 로그인한 동일한 관리 계정에서 문서를 열려고 시도합니다.
- 열기가 허용되는지 확인합니다.
에서 열기, 제외됨 - "조직 문서에 데이터 열기" 정책이 "차단"으로 설정
- "사용자가 선택한 서비스에서 데이터를 열 수 있도록 허용" 정책이 "비즈니스용 OneDrive"로만 설정됨
- 앱이 비즈니스용 OneDrive에서 데이터를 열 수 있는 위치로 이동합니다.
- 비즈니스용 OneDrive에서 앱의 스토리지에 로그인한 동일한 관리 계정에서 문서를 열려고 시도합니다.
- 열기가 허용되는지 확인합니다.
- 앱이 허용하는 경우 다른 클라우드 스토리지 위치에서 다른 파일을 열고 차단되었는지 확인합니다.
에서 열기, 차단됨 "조직 문서에 데이터 열기" 정책이 "차단"으로 설정되었습니다. - 앱이 비즈니스용 OneDrive에서 데이터를 열 수 있는 위치로 이동합니다.
- 비즈니스용 OneDrive에서 앱의 스토리지에 로그인한 동일한 관리 계정에서 문서를 열려고 시도합니다.
- 열기가 차단되어 있는지 확인합니다.
- 앱이 허용하는 경우 다른 클라우드 스토리지 위치에서 다른 파일을 열고 차단되었는지 확인합니다.

알림 제한 유효성 검사

알림 내 콘텐츠를 제한하는 정책을 구현하지 않은 경우 건너뜁니다.

앱 보호 정책에 관한 한 애플리케이션은 다음과 같은 세 가지 유형의 알림을 발생할 수 있습니다.

  1. 계정 데이터가 포함되지 않은 알림입니다.
  2. 관리되는 계정에 속하는 데이터가 포함된 알림입니다.
  3. 관리되지 않는 계정에 속하는 데이터가 포함된 알림입니다.

애플리케이션이 단일 ID인 경우 단독 계정이 관리되지 않는 경우 보호가 적용되지 않으므로 처음 2개만 관련이 있습니다.

서로 다른 정책 값이 구성된 세 가지 유형의 알림을 모두 트리거하여 알림 제한의 유효성을 검사할 수 있습니다.

이러한 테스트의 경우 앱 및 Intune 회사 포털을 설치합니다. 테스트를 시작하기 전에 관리되는 계정으로 로그인합니다. 앱이 다중 ID인 경우 관리되지 않는 계정으로 앱에 로그인합니다.

시나리오 전제 조건 단계
전체 콘텐츠 차단됨 "조직 데이터 알림" 정책이 "차단"으로 설정 - 계정 데이터 없이 알림을 실행하도록 앱을 트리거합니다.
- 이 알림에 콘텐츠가 표시되지 않는지 확인합니다.
- 관리되는 계정의 데이터로 알림을 실행하도록 앱을 트리거합니다.
- 이 알림에 콘텐츠가 표시되지 않는지 확인합니다.
- 관리되지 않는 계정의 데이터로 알림을 실행하도록 앱을 트리거합니다.
- 이 알림에 콘텐츠가 표시되지 않는지 확인합니다.
부분 콘텐츠 차단됨 "조직 데이터 알림" 정책이 "조직 데이터 차단"으로 설정 - 계정 데이터 없이 알림을 실행하도록 앱을 트리거합니다.
- 이 알림이 전체 콘텐츠를 표시하는지 확인합니다.
- 관리되는 계정의 데이터로 알림을 실행하도록 앱을 트리거합니다.
- 이 알림이 관리되는 계정의 콘텐츠를 수정하는지 확인합니다.
- 관리되지 않는 계정의 데이터로 알림을 실행하도록 앱을 트리거합니다.
- 이 알림이 전체 콘텐츠를 표시하는지 확인합니다.
차단된 콘텐츠 없음 "조직 데이터 알림" 정책이 "허용"으로 설정됩니다.

데이터 백업 및 복원 유효성 검사

백업 데이터를 보호하기 위한 정책을 구현하지 않은 경우 건너뜁니다.

앱이 백업을 위해 구성한 콘텐츠(파일 및/또는 키-값 쌍)를 다시 숙지합니다. 예상 콘텐츠 복원의 일부인지 확인해야 합니다. 복원의 추가 콘텐츠는 데이터 유출로 이어질 수 있습니다.

이러한 테스트의 경우 앱 및 Intune 회사 포털을 설치합니다. 테스트를 시작하기 전에 관리되는 계정으로 로그인합니다. 앱이 다중 ID인 경우 관리되지 않는 계정으로 앱에 로그인합니다.

백업 테스트에 대한 Android의 공식 지침을 따릅니다. 이러한 지침은 자동 복구 및 키/값 백업에 따라 다르므로 자세히 따르세요.

정책에 대한 사용자 지정 화면 캡처 유효성 검사

사용자 지정 화면 캡처 제한을 구현하지 않은 경우 건너뜁니다.

애플리케이션에 Android 수준 WindowFLAG_SECURE을 우회하는 기능이 있는 경우 이 기능이 앱 보호 정책 화면 캡처 제한에 의해 차단되었는지 확인합니다.

이러한 테스트의 경우 앱 및 Intune 회사 포털을 설치합니다. 테스트를 시작하기 전에 관리되는 계정으로 로그인합니다.

시나리오 전제 조건 단계
화면 캡처가 차단됨 "화면 캡처 및 Google Assistant" 정책이 "차단"으로 설정되었습니다. - 사용자 지정 FLAG_SECURE 코드를 활용하는 앱의 위치로 이동합니다.
- 해당 기능을 활용하려고 시도합니다.
- 기능이 차단되어 있는지 확인합니다.
화면 캡처 허용 "화면 캡처 및 Google Assistant" 정책이 "허용"으로 설정됩니다. - 사용자 지정 FLAG_SECURE 코드를 활용하는 앱의 위치로 이동합니다.
- 해당 기능을 활용하려고 시도합니다.
- 기능이 허용되는지 확인합니다.

App Protection CA 유효성 검사

지원 앱 보호 CA를 구현하지 않은 경우 건너뜁니다.

앱 및 테스트 계정에 앱 보호 정책을 만들고 할당하는 일반적인 유효성 검사 단계 외에도 앱 보호 조건부 액세스 정책을 만들고 테스트 계정에 할당해야 합니다. 자세한 내용은 Intune을 사용하여 앱 기반 조건부 액세스 정책 설정을 참조하세요.

테스트 단계:

  1. 이 테스트를 시작하기 전에 Microsoft Authenticator 및 Intune 회사 포털을 제거합니다.
  2. 앱을 설치합니다.
  3. 앱 보호 정책 및 앱 기반 CA 정책을 모두 대상으로 하는 테스트 계정으로 앱에 로그인합니다.
  4. 앱에서 회사 포털을 설치하라는 메시지가 표시되는지 확인합니다.
  5. 다시 로그인합니다.
  6. 앱에서 디바이스를 등록하라는 메시지가 표시되는지 확인합니다. 프롬프트를 따릅니다. 앱에서 여기에 등록하라는 메시지가 표시되지 않으면 테스트 디바이스가 다른 SDK 지원 앱, 회사 포털 및 Authenticator를 먼저 제거했는지 확인합니다. 그래도 메시지가 표시되지 않으면 위의 구현 지침을 다시 방문하세요.
  7. 등록 후 모든 앱 데이터에 액세스할 수 있는지 확인합니다.

알림 수신자 유효성 검사

SDK에서 알림 등록을 구현하지 않은 경우 건너뜁니다.

유효성 검사 단계는 앱이 등록한 알림 유형에 따라 달라집니다. 모든 유형의 알림에 대해 로깅을 추가하여 수신자가 제대로 호출되고 있는지 확인합니다.

MAM_ENROLLMENT_RESULT 은 먼저 앱 보호 정책을 대상으로 하는 계정으로 애플리케이션에 로그인하여 트리거할 수 있습니다.

REFRESH_APP_CONFIGREFRESH_POLICY 는 테스트 계정을 대상으로 하는 각 앱 구성 정책 및 앱 보호 정책을 업데이트하고 SDK가 업데이트된 정책을 받을 때까지 대기하여 트리거할 수 있습니다.

이 프로세스의 속도를 높이기 위해 변경 정책을 사용하여 신속하게 테스트를 참조하세요.

MANAGEMENT_REMOVED, WIPE_USER_DATA, WIPE_USER_AUXILIARY_DATA, WIPE_COMPLETED 알림은 모두 Microsoft Intune에서 선택적 초기화를 실행하여 트리거할 수 있습니다.

사용자 지정 테마 유효성 검사

사용자 지정 테마를 구현하지 않은 경우 건너뜁니다.

사용자 지정 테마 지원은 SDK 대화 상자에서 색을 검사하여 유효성을 검사할 수 있습니다. 확인할 가장 간단한 대화 상자는 MAM PIN 화면입니다.

전제 조건:

  • 관리되는 계정의 정책을 다음과 같이 설정합니다.
    • "액세스용 PIN"을 "필수"로 설정합니다.
  • 앱 및 Intune 회사 포털을 설치합니다.

테스트 단계:

  1. 애플리케이션을 시작하고 테스트 계정으로 로그인합니다.
  2. MAM PIN 화면이 나타나고 SDK에 제공한 사용자 지정 테마에 따라 테마가 지정되었는지 확인합니다.

다음 단계

이 가이드를 순서대로 따르고 위의 모든 종료 기준을 완료한 경우 축하합니다. 이제 앱이 Intune 앱 SDK와 완전히 통합되어 앱 보호 정책을 적용할 수 있습니다. 이전 앱 참여 섹션인 5단계: 다중 ID6단계: 앱 구성 중 하나를 건너뛰고 앱이 이러한 기능을 지원해야 하는지 확실하지 않은 경우 SDK 통합을 위한 주요 결정을 다시 방문하세요.

앱 보호는 이제 앱의 핵심 시나리오입니다. 앱을 계속 개발할 때 이 가이드와 부록 을 계속 참조하세요.