다음을 통해 공유


조정된 인증을 사용하여 로컬 개발 중에 Azure 서비스에 Java 앱 인증

조정된 인증은 시스템 인증 브로커를 사용하여 사용자 자격 증명을 수집하여 앱을 인증합니다. 시스템 인증 브로커는 연결된 모든 계정에 대한 인증 핸드셰이크 및 토큰 유지 관리를 관리하는 사용자의 컴퓨터에서 실행되는 앱입니다.

조정된 인증은 다음과 같은 이점을 제공합니다.

  • Enables SSO(Single Sign-On): 앱을 사용하여 사용자가 Microsoft Entra ID 인증하는 방법을 간소화하고 Microsoft Entra ID 새로 고침 토큰을 반출 및 오용으로부터 보호합니다.
  • 향상된 보안: 앱 논리를 업데이트할 필요 없이 브로커와 함께 많은 보안 향상 기능이 제공됩니다.
  • 향상된 기능 지원: 브로커의 도움으로 개발자는 풍부한 OS 및 서비스 기능에 액세스할 수 있습니다.
  • 시스템 통합: 브로커 플러그 앤 플레이를 기본 제공 계정 선택기와 함께 사용하는 애플리케이션을 통해 사용자는 동일한 자격 증명을 반복해서 다시 입력하는 대신 기존 계정을 빠르게 선택할 수 있습니다.
  • 토큰 보호: 새로 고침 토큰이 디바이스에 바인딩되어 있는지 확인하고 앱이 디바이스 바인딩된 액세스 토큰을 획득할 수 있도록 합니다. 토큰 보호를 참조하세요.

Windows WAM(계정 관리자) 인증 브로커를 제공합니다. WAM을 사용하면 Microsoft Entra ID 같은 ID 공급자가 기본적으로 OS에 연결하고 앱에 보안 로그인 서비스를 제공할 수 있습니다. 조정된 인증을 사용하면 대화형 로그인 자격 증명에서 허용하는 모든 작업에 대해 앱을 사용할 수 있습니다.

개인 Microsoft 계정 및 회사 또는 학교 계정이 지원됩니다. 지원되는 Windows 버전에서 기본 브라우저 기반 UI는 기본 제공 Windows 앱과 유사한 원활한 인증 환경으로 대체됩니다.

앱을 중개 인증에 맞게 구성

애플리케이션에서 조정된 인증을 사용하도록 설정하려면 다음 단계를 수행합니다.

  1. Azure 포털Microsoft Entra ID로 이동하고 왼쪽 메뉴에서 App registrations를 선택합니다.

  2. 앱에 대한 등록 을 선택한 다음 인증을 선택합니다.

  3. 플랫폼 구성을 통해 앱 등록에 적절한 리디렉션 URI를 추가합니다.

    1. 플랫폼 구성에서+ 플랫폼 추가를 선택합니다.

    2. 플랫폼 구성에서 애플리케이션 유형(플랫폼)에 대한 타일을 선택하여 모바일 및 데스크톱 애플리케이션과 같은 설정을 구성합니다.

    3. 사용자 지정 리디렉션 URI에서 다음 리디렉션 URI를 입력합니다.

      ms-appx-web://Microsoft.AAD.BrokerPlugin/{your_client_id}

      앱 등록 {your_client_id} 창에서 애플리케이션(클라이언트) ID로 바꿉 니다.

    4. 설정을 선택합니다.

    자세한 내용은 앱 등록에 리디렉션 URI 추가를 참조하세요.

  4. 인증 창으로 돌아가, 고급 설정에서 공용 클라이언트 흐름 허용로 선택합니다.

  5. 변경 내용을 적용하려면 저장을 선택합니다.

  6. 특정 리소스에 대해 애플리케이션에 권한을 부여하려면 해당 리소스로 이동하여 API 사용 권한을 선택하고 액세스하려는 Microsoft Graph 및 기타 리소스를 사용하도록 설정합니다.

    중요합니다

    또한 처음으로 로그인할 때 애플리케이션에 동의를 부여하려면 테넌트 관리자여야 합니다.

역할 할당

앱 코드를 브로커 인증을 사용하여 성공적으로 실행하려면, Azure 역할 기반 액세스 제어 (RBAC)를 통해 사용자 계정에 권한을 부여하십시오. 관련 Azure 서비스에 대한 사용자 계정에 적절한 역할을 할당합니다. 다음은 그 예입니다.

  • Azure Blob Storage: Storage 계정 데이터 기여자 역할을 할당합니다.
  • Azure Key Vault: Key Vault 비밀 책임자 역할을 할당합니다.

앱이 지정된 경우 user_impersonation Access Azure Storage(이전 섹션의 6단계)에 대해 설정된 API 권한이 있어야 합니다. 이 API 권한을 사용하면 로그인하는 동안 동의가 부여된 후 앱이 로그인한 사용자를 대신하여 Azure 스토리지에 액세스할 수 있습니다.

코드 구현

Azure ID 라이브러리는 InteractiveBrowserCredential 사용하여 조정된 인증을 지원합니다. azure-identity-broker 라이브러리InteractiveBrowserBrokerCredentialBuilder는 시스템 인증 브로커를 InteractiveBrowserCredential 사용할 수 있는 기능을 만듭니다. 예를 들어 Java 콘솔 앱에서 조정된 인증을 사용하여 SecretClient Azure Key Vault 인증하려면 다음 단계를 수행합니다.

  1. pom.xml 파일에 azure-identity-broker 종속성을 추가합니다.

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-broker</artifactId>
    </dependency>
    
  2. 계정 선택 대화 상자가 표시되어야 하는 상위 창에 대한 참조를 가져옵니다. 예제는 창 핸들 가져오기를 참조하세요.

  3. InteractiveBrowserCredential를 사용하여 InteractiveBrowserBrokerCredentialBuilder의 인스턴스를 생성합니다.

    import com.azure.identity.InteractiveBrowserCredential;
    import com.azure.identity.broker.InteractiveBrowserBrokerCredentialBuilder;
    import com.azure.security.keyvault.secrets.SecretClient;
    import com.azure.security.keyvault.secrets.SecretClientBuilder;
    import com.azure.security.keyvault.secrets.models.KeyVaultSecret;
    
    long windowHandle = getWindowHandle(); // See examples below
    
    InteractiveBrowserCredential credential = new InteractiveBrowserBrokerCredentialBuilder()
        .setWindowHandle(windowHandle)
        .useDefaultBrokerAccount()
        .build();
    
    SecretClient client = new SecretClientBuilder()
        .vaultUrl("https://<your-key-vault-name>.vault.azure.net")
        .credential(credential)
        .buildClient();
    
    KeyVaultSecret secret = client.getSecret("MySecret");
    System.out.println("Retrieved secret: " + secret.getName());
    

앞의 예제에서 useDefaultBrokerAccount는 기본 시스템 계정을 사용하여 무심히 처리된 중개 인증 흐름을 옵트인하도록 선택합니다. 이러한 방식으로 사용자는 동일한 계정을 반복적으로 선택할 필요가 없습니다. 조용한 중개된 인증이 실패할 경우, InteractiveBrowserCredential는 대화형 중개된 인증으로 전환됩니다.

다음 스크린샷은 대체 대화형 조정 인증 환경을 보여 줍니다.

브로커 지원 InteractiveBrowserCredential 인스턴스를 사용하여 사용자를 인증할 때 Windows 로그인 환경의 스크린샷

창 핸들 가져오기

대화형으로 InteractiveBrowserCredential을(를) 사용하여 인증할 때, 인증 대화 상자가 요청을 보내는 창의 앞에 올바르게 나타나도록 보장하려면 부모 창 핸들이 필요합니다.

JavaFX 애플리케이션

JavaFX 애플리케이션의 경우 JNA(Java Native Access)를 사용하여 창 핸들을 가져옵니다.

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;

public long getWindowHandle(Stage stage) {
    WinDef.HWND hwnd = User32.INSTANCE.FindWindow(null, stage.getTitle());
    return Pointer.nativeValue(hwnd.getPointer());
}

콘솔 애플리케이션

Windows 콘솔 애플리케이션의 경우 JNA를 사용하여 콘솔 창 핸들을 가져옵니다.

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinDef;

WinDef.HWND hwnd = Kernel32.INSTANCE.GetConsoleWindow();
long windowHandle = Pointer.nativeValue(hwnd.getPointer());