Java용 Azure ID 클라이언트 라이브러리의 자격 증명 체인
Azure Identity 클라이언트 라이브러리는 Azure Core 라이브러리의
연결된 자격 증명의 작동 방식
런타임 시 자격 증명 체인은 시퀀스의 첫 번째 자격 증명을 사용하여 인증을 시도합니다. 해당 자격 증명이 액세스 토큰을 획득하지 못하면 액세스 토큰을 성공적으로 가져올 때까지 시퀀스의 다음 자격 증명이 시도됩니다. 다음 시퀀스 다이어그램은 이 동작을 설명합니다:
자격 증명 체인을 사용하는 이유
연결된 자격 증명은 다음과 같은 이점을 제공할 수 있습니다.
환경 인식: 앱이 실행 중인 환경에 따라 가장 적합한 자격 증명을 자동으로 선택합니다. 이 코드가 없으면 다음과 같은 코드를 작성해야 합니다.
import com.azure.core.credential.TokenCredential; import com.azure.identity.AzureCliCredentialBuilder; import com.azure.identity.ManagedIdentityCredentialBuilder; // Code omitted for brevity TokenCredential credential = null; // Set up credential based on environment (Azure or local development) String environment = System.getenv("ENV"); if (environment != null && environment.equals("production")) { credential = new ManagedIdentityCredentialBuilder() .clientId(userAssignedClientId) .build(); } else { credential = new AzureCliCredentialBuilder() .build(); }
원활한 전환: 앱은 인증 코드를 변경하지 않고 로컬 개발에서 스테이징 또는 프로덕션 환경으로 이동할 수 있습니다.
향상된 복원력: 이전에 액세스 토큰을 획득하지 못한 경우 다음 자격 증명으로 이동하는 대체 메커니즘을 포함합니다.
연결된 자격 증명을 선택하는 방법
자격 증명 체인에는 다음과 같은 두 가지 서로 다른 철학이 있습니다.
- 미리 구성된 체인 사용: 가장 일반적인 인증 시나리오를 수용하는 사전 구성 체인으로 시작합니다. 이 접근 방식에 대해서는 DefaultAzureCredential 개요 섹션을 참조하세요.
- 체인 "구축": 빈 체인으로 시작하고 필요한 것만 포함합니다. 이 접근 방식에 대해서는 DefaultAzureCredential 개요 섹션을 참조하세요.
DefaultAzureCredential 개요
DefaultAzureCredential 은 미리 구성된 자격 증명 체인입니다. 가장 일반적인 인증 흐름 및 개발자 도구와 함께 많은 환경을 지원하도록 설계되었습니다. 그래픽 형식의 기본 체인은 다음과 같습니다.
DefaultAzureCredential
이 자격 증명을 시도하는 순서는 다음과 같습니다.
순서 | 자격 증명 | 설명 |
---|---|---|
1 | 환경 | 환경 변수 컬렉션을 읽어 애플리케이션 서비스 주체(애플리케이션 사용자)가 앱에 대해 구성되어 있는지 확인합니다. 그렇다면 DefaultAzureCredential 은 이러한 값을 사용하여 Azure에 앱을 인증합니다. 이 방법은 서버 환경에서 가장 많이 사용되지만, 로컬로 개발할 때도 사용할 수 있습니다. |
2 | 워크로드 ID | 앱이 워크로드 ID를 사용하도록 설정된 Azure 호스트에 배포된 경우 해당 계정을 인증합니다. |
3 | 관리 ID | 앱이 관리되는 ID를 사용하도록 설정된 Azure 호스트에 배포된 경우, 해당 관리되는 ID를 사용하여 Azure에 앱을 인증합니다. |
4 | 공유 토큰 캐시 | 개발자가 Visual Studio에 로그인하여 Azure에 인증한 경우 동일한 계정을 사용하여 Azure에 앱을 인증합니다. (Windows에만 해당) |
5 | IntelliJ | 개발자가 IntelliJ용 Azure 도구 키트를 통해 인증한 경우 해당 계정을 인증합니다. |
6 | Azure CLI | 개발자가 Azure CLI의 az login 명령을 사용하여 Azure에 인증한 경우 동일한 계정을 사용하여 Azure에 앱을 인증합니다. |
7 | Azure PowerShell | 개발자가 Azure PowerShell의 Connect-AzAccount cmdlet을 사용하여 Azure에 인증한 경우 동일한 계정을 사용하여 Azure에 앱을 인증합니다. |
8 | Azure Developer CLI | 개발자가 Azure 개발자 CLI의 azd auth login 명령을 사용하여 Azure에 인증한 경우 해당 계정으로 인증합니다. |
가장 간단한 형태인 DefaultAzureCredential
의 매개변수 없는 버전은 다음과 같이 사용할 수 있습니다:
import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
// Code omitted for brevity
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.build();
ChainedTokenCredential 개요
ChainedTokenCredential은 앱의 필요에 맞게 자격 증명을 추가하는 빈 체인입니다. 예시:
import com.azure.identity.AzureCliCredential;
import com.azure.identity.AzureCliCredentialBuilder;
import com.azure.identity.ChainedTokenCredential;
import com.azure.identity.ChainedTokenCredentialBuilder;
import com.azure.identity.ManagedIdentityCredential;
import com.azure.identity.ManagedIdentityCredentialBuilder;
// Code omitted for brevity
ManagedIdentityCredential miCredential = new ManagedIdentityCredentialBuilder()
.clientId(userAssignedClientId)
.build();
AzureCliCredential cliCredential = new AzureCliCredentialBuilder()
.build();
ChainedTokenCredential credential = new ChainedTokenCredentialBuilder()
.addLast(miCredential)
.addLast(cliCredential)
.build();
앞의 코드 샘플은 두 개의 자격 증명으로 구성된 맞춤형 자격 증명 체인을 생성합니다. 사용자가 지정한 ManagedIdentityCredential
의 관리형 ID 변형이 먼저 시도되고, 필요한 경우 AzureCliCredential
가 시도됩니다. 그래픽 형식으로 체인은 다음과 같이 표시됩니다:
팁
성능을 개선하려면 ChainedTokenCredential
에서 프로덕션 환경에 맞게 자격증명 순서를 최적화하세요. 로컬 개발 환경에서 사용하기 위한 자격 증명을 마지막으로 추가해야 합니다.
DefaultAzureCredential에 대한 사용 지침
DefaultAzureCredential
는 의심할 여지 없이 Azure ID 클라이언트 라이브러리를 시작하는 가장 쉬운 방법이지만 이러한 편의상 장단점이 있습니다. Azure에 앱을 배포한 후에는 앱의 인증 요구 사항을 이해해야 합니다. 따라서 DefaultAzureCredential
에서 다음 솔루션 중 하나로 이동하는 것을 강력히 고려하세요:
- 와 같은
ManagedIdentityCredential
특정 자격 증명 구현입니다. - 앱이 실행되는 Azure 환경에 최적화된 축소된
ChainedTokenCredential
구현입니다.
이유는 다음과 같습니다.
- 디버깅 문제: 인증에 실패하면 잘못된 자격 증명을 디버깅하고 식별하는 것이 어려울 수 있습니다. 한 자격 증명에서 다음 자격 증명으로의 진행률과 각 자격 증명의 성공/실패 상태를 보려면 로깅을 사용하도록 설정해야 합니다. 자세한 내용은 연결된 자격증명 디버깅하기를 참조하세요.
-
성능 오버헤드: 여러 자격 증명을 순차적으로 시도하는 프로세스로 인해 성능 오버헤드가 발생할 수 있습니다. 예를 들어 로컬 개발 머신에서 실행하는 경우 관리 ID를 사용할 수 없습니다. 따라서
ManagedIdentityCredential
로컬 개발 환경에서는 항상 실패합니다. -
예측할 수 없는 동작:
DefaultAzureCredential
특정 환경 변수가 있는지 확인합니다. 누군가 호스트 컴퓨터의 시스템 수준에서 이러한 환경 변수를 추가하거나 수정할 수 있습니다. 이러한 변경 사항은 전역적으로 적용되므로 해당 컴퓨터에서 실행 중인 모든 앱에서 런타임 시DefaultAzureCredential
의 동작이 변경됩니다.
연결된 자격 증명 디버그
예기치 않은 문제를 진단하거나 체인화된 자격 증명이 어떤 역할을 하는지 파악하려면 앱에서 로깅을 활성화하세요.
설명을 위해 매개 변수가 없는 형식 DefaultAzureCredential
이 Blob Storage 계정에 대한 요청을 인증하는 데 사용된다고 가정합니다. 앱은 로컬 개발 환경에서 실행되고 개발자는 Azure CLI를 사용하여 Azure에 인증됩니다. 앱이 실행되면 출력에 다음과 같은 관련 항목이 표시됩니다.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential EnvironmentCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential WorkloadIdentityCredential is unavailable.
[ForkJoinPool.commonPool-worker-1] WARN com.microsoft.aad.msal4j.ConfidentialClientApplication - [Correlation ID: aaaa0000-bb11-2222-33cc-444444dddddd] Execution of class com.microsoft.aad.msal4j.AcquireTokenByClientCredentialSupplier failed: java.util.concurrent.ExecutionException: com.azure.identity.CredentialUnavailableException: ManagedIdentityCredential authentication unavailable. Connection to IMDS endpoint cannot be established.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential ManagedIdentityCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential SharedTokenCacheCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential IntelliJCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential AzureCliCredential returns a token
앞의 출력에서 이를 확인할 수 있습니다:
-
EnvironmentCredential
,WorkloadIdentityCredential
,ManagedIdentityCredential
SharedTokenCacheCredential
및IntelliJCredential
각 항목이 해당 순서대로 Microsoft Entra 액세스 토큰을 획득하지 못했습니다. -
AzureCliCredential.getToken
접미사가 있는 항목으로 표시된 대로 호출이returns a token
성공합니다.AzureCliCredential
성공 이후 자격 증명이 시도되지 않았습니다.