다음을 통해 공유


자습서: Android 애플리케이션에 공유 디바이스 모드 지원 추가

이 자습서에서는 Android 개발자가 Android용 MSAL(Microsoft 인증 라이브러리)을 사용하여 Android 애플리케이션에서 공유 디바이스 모드 지원을 추가하는 방법을 알아봅니다.

이 자습서에서는 다음을 수행합니다.

  • 기존 Android 애플리케이션 프로젝트를 만들거나 수정합니다.
  • 공유 디바이스 모드 사용 및 감지
  • 단일 또는 다중 계정 모드 감지
  • 사용자 스위치 검색
  • 전역 로그인 및 로그아웃 사용

기존 Android 애플리케이션 만들기 또는 수정

자습서의 나머지 부분을 완료하려면 새 Android 애플리케이션을 만들거나 기존 Android 애플리케이션을 수정해야 합니다. 아직 수행하지 않은 경우 MSAL Android 자습서에서 MSAL을 Android 앱과 통합하는 방법, 사용자 로그인, Microsoft Graph 호출, 사용자 로그아웃에 대한 안내를 참조합니다. 학습 및 테스트를 위해 완성된 코드 샘플을 사용하려면 GitHub에서 응용 프로그램 예제를 복제합니다. 샘플에는 단일 또는 다중 계정 모드에서 작동하는 기능이 있습니다.

로컬 Maven 리포지토리에 MSAL SDK 추가

샘플 앱을 사용하지 않는 경우 다음과 같이 MSAL 라이브러리를 종속성으로 build.gradle 파일에 추가합니다.

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

단일 계정 모드에 대한 지원 추가

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

앱에서 사용할 수 있는 Microsoft ID 플랫폼 기능은 애플리케이션이 단일 계정 모드로 실행되는지, 다중 계정 모드로 실행되는지에 따라 달라집니다.

공유 디바이스 모드 앱은 단일 계정 모드에서만 작동합니다.

중요

다중 계정 모드만 지원하는 애플리케이션은 공유 디바이스에서 실행할 수 없습니다. 직원이 단일 계정 모드를 지원하지 않는 앱을 로드하는 경우, 이 앱은 공유 디바이스에서 실행되지 않습니다.

MSAL SDK가 출시되기 전에 작성된 앱은 다중 계정 모드로 실행되며, 단일 계정 모드를 지원하도록 업데이트해야 공유 모드 디바이스를 실행할 수 있습니다. 단일 계정과 다중 계정 모두 지원

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

앱이 실행 중인 디바이스 유형에 따라 동작을 변경하도록 할 수도 있습니다. 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;
            ...
        }

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

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

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

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

MSAL 구성 파일에서 "shared_device_mode_supported"true로 설정합니다.

다중 계정 모드를 지원하지 않을 수도 있습니다. 이는 공유 디바이스를 사용하지 않고 사용자가 동시에 둘 이상의 계정으로 앱에 로그인할 수 있는 경우일 수 있습니다. 그렇다면 "account_mode""SINGLE"로 설정합니다. 이를 통해 앱에서 항상 ISingleAccountPublicClientApplication을 받을 수 있으며, MSAL 통합을 크게 간소화합니다. "account_mode"의 기본값은 "MULTIPLE"이므로 "single account" 모드를 사용하는 경우 구성 파일에서 이 값을 변경해야 합니다.

다음은 샘플 앱의 app>main>res>raw 디렉터리에 포함된 auth_config.json 파일의 예제입니다.

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

공유 디바이스 모드 검색

공유 디바이스 모드를 사용하면 여러 직원이 Android 디바이스를 공유하도록 구성하는 한편, 해당 디바이스에 대한 Microsoft ID 지원 관리를 제공할 수 있습니다. 직원은 자신의 디바이스에 로그인하여 고객 정보에 빠르게 액세스할 수 있습니다. 교대 근무나 업무가 끝나면 클릭 한 번으로 공유 디바이스의 모든 앱에서 로그아웃할 수 있으며, 다음 직원이 사용할 수 있도록 디바이스가 즉시 준비됩니다.

isSharedDevice()를 사용하여 앱이 공유 디바이스 모드의 디바이스에서 실행되고 있는지 확인합니다. 앱에서 이 플래그를 사용하여 UX를 적절하게 수정할지 여부를 결정할 수 있습니다.

다음은 isSharedDevice()를 사용하는 방법을 보여 주는 코드 조각입니다. 샘플 앱의 SingleAccountModeFragment 클래스에서 가져온 것입니다.

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

PublicClientApplication 개체 초기화

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

private ISingleAccountPublicClientApplication mSingleAccountApp;

/*Configure your sample app and save state for this activity*/
PublicClientApplication.create(this.getApplicationCOntext(),
  R.raw.auth_config,
  new PublicClientApplication.ApplicationCreatedListener(){
  @Override
  public void onCreated(IPublicClientApplication application){
  mSingleAccountApp = (ISingleAccountPublicClientApplication)application;
  loadAccount();
  }
  @Override
  public void onError(MsalException exception){
  /*Fail to initialize PublicClientApplication */
  }
});

단일 및 다중 계정 모드 검색

공유 디바이스에서 최전방 직원에게만 사용되는 앱을 작성하는 경우 단일 계정 모드만 지원하도록 앱을 작성하는 것이 좋습니다. 여기에는 의료 기록 앱, 청구서 앱 및 대부분의 LOB(기간 업무 앱)와 같이 작업에 중점을 둔 대부분의 애플리케이션이 포함됩니다. 이를 통해 SDK의 많은 기능을 수용할 필요가 없으므로 개발을 간소화할 수 있습니다.

앱이 다중 계정 및 공유 디바이스 모드를 지원하는 경우 아래와 같이 형식 검사를 수행하고 적절한 인터페이스로 캐스팅해야 합니다.

private IPublicClientApplication mApplication;

        if (mApplication instanceOf IMultipleAccountPublicClientApplication) {
          IMultipleAccountPublicClientApplication multipleAccountApplication = (IMultipleAccountPublicClientApplication) mApplication;
          ...
        } else if (mApplication instanceOf    ISingleAccountPublicClientApplication) {
           ISingleAccountPublicClientApplication singleAccountApplication = (ISingleAccountPublicClientApplication) mApplication;
            ...
        }

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

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

private void loadAccount()
{
  mSingleAccountApp.getCurrentAccountAsync(new ISingleAccountPublicClientApplication.CurrentAccountCallback())
  {
    @Override
    public void onAccountLoaded(@Nullable IAccount activeAccount)
    {
      if (activeAccount != null)
      {
        signedInUser = activeAccount;
        mSingleAccountApp.acquireTokenSilentAsync(SCOPES,"http://login.microsoftonline.com/common",getAuthSilentCallback());
      }
    }
    @Override
    public void onAccountChanged(@Nullable IAccount priorAccount, @Nullable Iaccount currentAccount)
    {
      if (currentAccount == null)
      {
        //Perform a cleanup task as the signed-in account changed.
        updateSingedOutUI();
      }
    }
    @Override
    public void onError(@NonNull Exception exception)
    {
    }
  }
}

전역적으로 사용자 로그인

다음은 Authenticator 앱에서 MSAL을 사용하는 다른 앱에 대한 디바이스에서 사용자를 로그인합니다.

private void onSignInClicked()
{
  mSingleAccountApp.signIn(getActivity(), SCOPES, null, getAuthInteractiveCallback());
}

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

다음은 로그인한 계정을 제거하고, 앱뿐만 아니라 공유 디바이스 모드에 있는 디바이스에서도 캐시된 토큰을 지웁니다.

private void onSignOutClicked()
{
  mSingleAccountApp.signOut(new ISingleAccountPublicClientApplication.SignOutCallback()
  {
    @Override
    public void onSignOut()
    {
      updateSignedOutUI();
    }
    @Override
    public void onError(@NonNull MsalException exception)
    {
      /*failed to remove account with an exception*/
    }
  });
}

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

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

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

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

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);
}

애플리케이션 등록 및 테스트를 위해 테넌트 설정

애플리케이션을 설정하고 디바이스를 공유 디바이스 모드로 전환하려면 조직 테넌트 내에서 애플리케이션을 등록해야 합니다. 그런 다음 애플리케이션이 올바르게 실행되도록 auth_config.json에 이 값을 입력합니다.

이 작업을 수행하는 방법에 대한 자세한 내용은 애플리케이션 등록을 참조하세요.

참고 항목

앱을 등록하는 경우 왼쪽에 있는 빠른 시작 가이드를 사용하고 Android를 선택합니다. 그러면 패키지 이름서명 해시를 앱에 제공하라는 페이지가 표시됩니다. 이러한 항목은 앱 구성이 작동하는지 확인하는 데 매우 중요합니다. 그런 다음, 앱에 사용할 수 있는 구성 개체를 받고 이를 잘라내어 auth_config.json 파일에 붙여넣습니다.

Android 앱 페이지 구성

자동으로 변경을 선택한 다음 빠른 시작에서 요구하는 값을 제공해야 합니다. 완료되면 Microsoft Entra ID는 필요한 모든 구성 파일을 생성합니다.

테스트를 위해 테넌트에서 최소 두 명의 직원과 클라우드 디바이스 관리자 역할을 설정합니다. 클라우드 디바이스 관리자를 설정하려면 조직 역할을 수정해야 합니다. Microsoft Entra 관리 센터에서 ID>역할 및 관리자>역할 및 관리자>모든 역할을 선택하여 조직 역할로 이동한 다음 클라우드 디바이스 관리자를 선택합니다. 디바이스를 공유 모드로 전환할 수 있는 사용자를 추가합니다.

샘플 앱 실행

샘플 애플리케이션은 조직의 Graph API를 호출하는 간단한 앱입니다. 처음 실행하는 경우 애플리케이션이 직원 계정에서 새로운 것이므로 동의하라는 메시지가 표시됩니다.

애플리케이션 구성 정보 화면

다음 단계

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