다음을 통해 공유


Android 디바이스용 공유 디바이스 모드

소매점 직원, 비행 승무원 및 현장 서비스 작업자 같은 최전방 직원은 공유 모바일 디바이스를 사용해 업무를 수행하는 경우가 많습니다. 사용자가 자신의 비밀번호나 PIN을 공유 디바이스에서 고객 및 비즈니스 데이터에 액세스하기 위해 의도적으로 또는 비의도적으로 공유하는 경우 이러한 공유 디바이스는 보안 위험을 초래할 수 있습니다.

공유 디바이스 모드에서는 직원들이 디바이스를 안전하게 공유할 수 있도록 Android 8.0 이상의 디바이스를 구성할 수 있습니다. 직원은 한 번만 로그인하면 SSO(Single Sign-On)를 지원하는 모든 앱에 해당 기능이 적용되어 정보에 더 빠르게 액세스할 수 있게 됩니다. 교대 근무 또는 작업을 완료한 후 직원이 로그아웃하면 디바이스 및 지원되는 모든 애플리케이션에서 자동으로 로그아웃되어 다음 사용자가 디바이스를 준비할 수 있습니다.

공유 디바이스 모드 기능을 활용하려면 앱 개발자와 클라우드 디바이스 관리자가 함께 작업해야 합니다.

  1. 디바이스 관리자가 수동으로 또는 Microsoft Intune과 같은 MDM(모바일 장치 관리) 공급자를 사용하여 장치를 공유할 수 있도록 준비합니다. 제로 터치 프로비전을 통해 공유 장치 모드에서 대규모로 장치를 설정할 수 있으므로 기본 옵션은 MDM을 사용하는 것입니다. MDM은 장치에 대한 관리형 구성 업데이트를 통해 Microsoft Authenticator 앱을 장치에 푸시하고 각 장치에 대해 '공유 모드'를 켭니다. 이 공유 모드 설정은 디바이스에서 지원되는 앱의 동작을 변경합니다. MDM 공급자의 이 구성은 디바이스에 대한 공유 디바이스 모드를 설정하고 Authenticator 앱을 사용하여 공유 디바이스 등록을 트리거합니다.

  2. 애플리케이션 개발자는 단일 계정 앱(공유 디바이스 모드에서는 다중 계정 앱을 지원하지 않음)을 써서 다음 시나리오를 처리합니다.

    • 지원되는 모든 애플리케이션을 통해 디바이스 전체에서 사용자 로그인
    • 지원되는 모든 애플리케이션을 통해 디바이스 전체에서 사용자 로그아웃
    • 디바이스 상태를 쿼리하여 애플리케이션이 공유 디바이스 모드에 있는 디바이스에 있는지 확인합니다.
    • 디바이스에서 사용자의 상태를 쿼리하여 애플리케이션을 마지막으로 사용한 이후 변경 내용이 있는지 확인합니다.

    공유 디바이스 모드 지원은 애플리케이션의 기능 업그레이드로 간주되어야 하며, 여러 사용자가 동일한 디바이스를 사용하는 환경에서 도입을 향상시킬 수 있습니다.

    중요

    Android에서 공유 디바이스 모드를 지원하는 Microsoft 애플리케이션은 변경할 필요가 없으며 디바이스에 설치하기만 하면 공유 디바이스 모드의 이점을 누릴 수 있습니다.

공유 디바이스 모드에서 디바이스 설정

공유 디바이스 모드를 지원하도록 Android 디바이스를 구성하려면 Android OS 8.0 이상을 실행해야 합니다. 또한 공장 초기화로 디바이스를 초기화하거나 모든 Microsoft 및 기타 공유 디바이스 모드를 사용하도록 설정된 앱을 제거하고 다시 설치해야 합니다.

Microsoft Intune은 Microsoft Entra 공유 디바이스 모드에서 디바이스 관련 제로 터치 프로비전을 지원합니다. 즉, Intune에서는 최전방 직원과의 상호 작용을 최소화하면서 디바이스를 설정해 등록할 수 있습니다. Microsoft Intune을 MDM으로 사용하면서 공유 디바이스 모드에서 디바이스를 설정하려면 Microsoft Entra 디바이스 공유 모드에서 디바이스 등록 설정을 참조하세요.

공유 디바이스 모드를 지원하도록 Android 애플리케이션 수정

한 사용자의 데이터가 다른 사용자에게 유출되지 않도록 하는 작업은 개발자인 여러분에게 달렸습니다. 다음 섹션에서는 변경이 발생하여 처리해야 함을 애플리케이션에 알리는 데 유용한 신호를 제공합니다. 앱이 사용될 때마다 디바이스에서 사용자의 상태를 확인한 다음, 이전 사용자의 데이터를 지워야 합니다. 이는 멀티태스킹 중 백그라운드에서 다시 로드되는 경우를 포함합니다. 사용자가 바뀌는 경우 이전 사용자의 데이터를 모두 지우고 애플리케이션에 표시되는 캐시된 데이터가 모두 제거되었는지 확인해야 합니다. 공유 디바이스 모드를 지원하도록 앱을 업데이트한 후 사용자와 회사에서 보안 검토 프로세스를 수행하는 것이 좋습니다.

애플리케이션의 종속성에 MSAL(Microsoft 인증 라이브러리) SDK 추가

다음과 같이 build.gradle 파일에 MSAL 라이브러리를 종속성으로 추가합니다.

dependencies{
  implementation 'com.microsoft.identity.client.msal:5.+'
}

공유 디바이스 모드를 사용하도록 앱 구성

MSAL(Microsoft Authentication Library) SDK를 사용하여 작성된 애플리케이션은 단일 계정 또는 다중 계정을 관리할 수 있습니다. 자세한 내용은 단일 계정 모드 또는 다중 계정 모드를 참조하세요. 공유 디바이스 모드 앱은 단일 계정 모드에서만 작동합니다.

다중 계정 모드를 지원하지 않을 계획이라면 msal 구성 파일에서 "account_mode""SINGLE"로 설정합니다. 이를 통해 앱에서 항상 ISingleAccountPublicClientApplication을 받을 수 있으며, MSAL 통합을 크게 간소화합니다. "account_mode"의 기본값은 "MULTIPLE"이므로 "single account" 모드를 사용하는 경우 구성 파일에서 이 값을 변경해야 합니다.

구성 파일의 예는 다음과 같습니다.

{
  "client_id": "Client ID after app registration at https://aka.ms/MobileAppReg",
  "authorization_user_agent": "WEBVIEW",
  "redirect_uri": "Redirect URI after app registration at https://aka.ms/MobileAppReg",
  "account_mode": "SINGLE",
  "broker_redirect_uri_registered": true,
  "authorities": [
    {
      "type": "AAD",
      "audience": {
        "type": "AzureADandPersonalMicrosoftAccount",
        "tenant_id": "common"
      }
    }
  ]
}

구성 파일을 설정하는 방법에 대한 자세한 내용은 구성 문서를 참조하세요.

단일 계정과 다중 계정 모두 지원

개인 디바이스와 공유 디바이스에서 모두 실행을 지원하도록 앱을 빌드할 수 있습니다. 앱에서 현재 여러 계정을 지원하고 있고 공유 디바이스 모드를 지원하려는 경우, 단일 계정 모드 지원 기능을 추가합니다.

앱이 실행 중인 디바이스 유형에 따라 동작을 변경하도록 할 수도 있습니다. ISingleAccountPublicClientApplication.isSharedDevice()을(를) 사용하여 단일 계정 모드로 실행할 경우를 결정합니다.

애플리케이션이 있는 디바이스 유형을 나타내는 인터페이스는 두 가지가 있습니다. MSAL의 애플리케이션 팩터리에서 애플리케이션 인스턴스를 요청하면 올바른 애플리케이션 개체가 자동으로 제공됩니다.

다음 개체 모델은 사용자가 받을 수 있는 개체의 유형과 공유 디바이스의 컨텍스트에서 의미하는 바를 나타냅니다.

퍼블릭 클라이언트 애플리케이션 상속 모델

PublicClientApplication 개체를 가져올 때 형식을 검사하고 적절한 인터페이스로 캐스팅해야 합니다. 다음 코드는 여러 계정 모드인지, 단일 계정 모드인지를 확인하고 애플리케이션 개체를 적절하게 캐스팅합니다.

private IPublicClientApplication mApplication;

        // Running in personal-device mode?
        if (mApplication instanceOf IMultipleAccountPublicClientApplication) {
          IMultipleAccountPublicClientApplication multipleAccountApplication = (IMultipleAccountPublicClientApplication) mApplication;
          ...
        // Running in shared-device mode?
        } else if (mApplication instanceOf ISingleAccountPublicClientApplication) {
           ISingleAccountPublicClientApplication singleAccountApplication = (ISingleAccountPublicClientApplication) mApplication;
            ...
        }

앱이 공유 디바이스에서 실행되는지, 개인 디바이스에서 실행되는지에 따라 다음과 같은 차이점이 적용됩니다.

공유 모드 디바이스 개인 디바이스
계정 단일 계정 여러 계정
로그인 전역 전역
로그아웃 전역 각 애플리케이션은 로그아웃이 앱에 대해 로컬인지 여부를 제어할 수 있습니다.
지원되는 계정 유형 회사 계정 전용 개인/회사 계정 지원

PublicClientApplication 개체 초기화

MSAL 구성 파일에서 "account_mode":"SINGLE"을 설정하는 경우 반환된 애플리케이션 개체를 ISingleAccountPublicCLientApplication으로 안전하게 캐스팅할 수 있습니다.

private ISingleAccountPublicClientApplication mSingleAccountApp;

PublicClientApplication.create(
    this.getApplicationCOntext(),
    R.raw.auth_config_single_account,
    new PublicClientApplication.ApplicationCreatedListener() {

        @Override
        public void onCreated(IPublicClientApplication application){
            mSingleAccountApp = (ISingleAccountPublicClientApplication)application;
        }

        @Override
        public void onError(MsalException exception){
            /*Fail to initialize PublicClientApplication */
        }
    });

공유 디바이스 모드 검색

공유 디바이스 모드를 검색하는 것은 애플리케이션에 중요합니다. 애플리케이션을 공유 디바이스에서 사용하는 경우 많은 애플리케이션에서 UX(사용자 환경)을 변경해야 합니다. 예를 들어 애플리케이션에 "등록" 기능이 있을 수 있습니다. 이 기능은 일선 작업자에게 이미 계정이 있을 가능성이 있으므로 적합하지 않습니다. 또한 공유 디바이스 모드에 있는 경우 애플리케이션의 데이터 처리에 추가 보안을 추가할 수 있습니다.

IPublicClientApplication에서 isSharedDevice API를 사용하여 앱이 공유 디바이스 모드의 디바이스에서 실행되고 있는지 확인합니다.

다음 코드 조각에서는 isSharedDevice API를 사용하는 예제를 보여 줍니다.

deviceModeTextView.setText(mSingleAccountApp.isSharedDevice() ? "Shared" : "Non-Shared");

로그인한 사용자를 가져와서 사용자가 디바이스에서 변경되었는지 확인

공유 디바이스 모드 지원의 또 다른 중요한 부분은 디바이스의 사용자 상태를 확인하고 사용자가 변경되었거나 디바이스에 사용자가 없는 경우 애플리케이션 데이터를 지우는 것입니다. 다른 사용자가 데이터를 유출하지 않도록 할 책임이 있습니다.

getCurrentAccountAsync API를 사용하여 디바이스에서 현재 로그인된 계정을 쿼리할 수 있습니다.

loadAccount 메서드는 로그인한 사용자의 계정을 검색합니다. onAccountChanged 메서드는 로그인한 사용자가 변경되었는지 여부를 확인하고, 변경된 경우 정리합니다.

private void loadAccount()
{
  mSingleAccountApp.getCurrentAccountAsync(new ISingleAccountPublicClientApplication.CurrentAccountCallback())
  {
    @Override
    public void onAccountLoaded(@Nullable IAccount activeAccount)
    {
      if (activeAccount != null)
      {
        signedInUser = activeAccount;
        final AcquireTokenSilentParameters silentParameters = new AcquireTokenSilentParameters.Builder()
                        .fromAuthority(signedInUser.getAuthority())
                        .forAccount(signedInUser)
                        .withScopes(Arrays.asList(getScopes()))
                        .withCallback(getAuthSilentCallback())
                        .build();
        mSingleAccountApp.acquireTokenSilentAsync(silentParameters);
      }
    }
    @Override
    public void onAccountChanged(@Nullable IAccount priorAccount, @Nullable Iaccount currentAccount)
    {
      if (currentAccount == null)
      {
        //Perform a cleanup task as the signed-in account changed.
        cleaUp();
      }
    }
    @Override
    public void onError(@NonNull Exception exception)
    {
        //getCurrentAccountAsync failed
    }
  }
}

전역적으로 사용자 로그인

디바이스가 공유 디바이스로 구성된 경우 애플리케이션은 signIn API를 호출하여 계정에 로그인할 수 있습니다. 계정에서 첫 번째 앱 로그인 후 디바이스에서 모든 적격 앱에 대해 전역적으로 계정을 사용할 수 있습니다.

final SignInParameters signInParameters = ... /* create SignInParameters object */
mSingleAccountApp.signIn(signInParameters);

전역적으로 사용자 로그아웃

다음 코드는 로그인한 계정을 제거하고, 앱뿐만 아니라 공유 디바이스 모드에 있는 디바이스에서도 캐시된 토큰을 지웁니다. 그러나 애플리케이션에서 데이터를 지워야 하는 것은 아닙니다. 애플리케이션에서 데이터를 지우고 애플리케이션이 사용자에게 표시할 수 있는 캐시된 데이터를 지워야 합니다.

mSingleAccountApp.signOut(new ISingleAccountPublicClientApplication.SignOutCallback() {
    @Override
    public void onSignOut() {
        // clear data from your application
    }

    @Override
    public void onError(@NonNull MsalException exception) {
        // signout failed, show error
    }
});

브로드캐스트를 수신하여 다른 애플리케이션에서 시작된 전역 로그아웃 탐지

계정 변경 브로드캐스트를 받으려면 브로드캐스트 수신기를 등록해야 합니다. 컨텍스트 등록 수신기를 통해 브로드캐스트 수신기를 등록하는 것이 좋습니다.

계정 변경 브로드캐스트가 수신되면 즉시 로그인한 사용자를 가져와 디바이스에서 사용자가 변경되었는지 확인합니다. 변경 내용이 감지되면 이전에 로그인한 계정에 대한 데이터 정리를 시작합니다. 모든 작업을 올바르게 중지하고 데이터 정리를 수행하는 것이 좋습니다.

다음 코드 조각은 브로드캐스트 수신기를 등록하는 방법을 보여 줍니다.

private static final String CURRENT_ACCOUNT_CHANGED_BROADCAST_IDENTIFIER = "com.microsoft.identity.client.sharedmode.CURRENT_ACCOUNT_CHANGED";
private BroadcastReceiver mAccountChangedBroadcastReceiver;
private void registerAccountChangeBroadcastReceiver(){
    mAccountChangedBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //INVOKE YOUR PRIOR ACCOUNT CLEAN UP LOGIC HERE
        }
    };
    IntentFilter filter = new

    IntentFilter(CURRENT_ACCOUNT_CHANGED_BROADCAST_IDENTIFIER);
    this.registerReceiver(mAccountChangedBroadcastReceiver, filter);
}

공유 디바이스 모드를 지원하는 Microsoft 애플리케이션

다음 Microsoft 애플리케이션은 Microsoft Entra의 공유 디바이스 모드를 지원합니다.

공유 디바이스 모드를 지원하는 제3자 MDM

다음과 같은 타사 MDM(모바일 장치 관리) 공급자는 Microsoft Entra 공유 디바이스 모드를 지원합니다.

공유 디바이스 로그아웃 및 전체 앱 수명 주기

사용자가 로그아웃하면 사용자의 개인 정보와 데이터를 보호하기 위한 조치를 취해야 합니다. 예를 들어 의료 레코드 앱을 빌드하는 경우 사용자가 로그아웃할 때 이전에 표시된 환자 레코드가 지워지는지 확인하는 것이 좋습니다. 개인 정보 보호를 위해 애플리케이션을 준비하고 포그라운드에 들어갈 때마다 확인해야 합니다.

앱에서 MSAL을 사용하여 공유 모드에 있는 디바이스에서 실행 중인 앱의 사용자를 로그아웃하면, 로그인된 계정과 캐시된 토큰이 앱과 디바이스에서 모두 제거됩니다.

다음 다이어그램에는 앱이 실행되는 동안 발생할 수 있는 전체 앱 수명 주기와 일반적인 이벤트가 나와 있습니다. 다이어그램은 활동이 시작된 시간부터 계정 로그인/로그아웃 여부 그리고 활동 일시 중지, 다시 시작, 중지 같은 이벤트가 적용되는 방법을 보여 줍니다.

공유 디바이스 앱 수명 주기

다음 단계

공유 디바이스 모드에서 앱을 실행하고 앱을 테스트하도록 Android 디바이스를 설정합니다.

Android 디바이스용 공유 디바이스 모드