Azure ID 라이브러리는 -Azure Core 라이브러리의 TokenCredential 인터페이스를 구현하는 공용 클래스를 제공합니다. 자격 증명은 Microsoft Entra ID 액세스 토큰을 획득하기 위한 고유한 인증 흐름을 나타냅니다. 이러한 자격 증명을 함께 연결하여 정렬된 일련의 인증 메커니즘을 구성할 수 있습니다.
연결된 자격 증명의 작동 방식
런타임 시 자격 증명 체인은 시퀀스의 첫 번째 자격 증명을 사용하여 인증을 시도합니다. 해당 자격 증명이 액세스 토큰을 획득하지 못하면 액세스 토큰을 성공적으로 가져올 때까지 시퀀스의 다음 자격 증명이 시도됩니다. 다음 시퀀스 다이어그램은 이 동작을 설명합니다:
자격 증명 체인을 사용하는 이유
연결된 자격 증명은 다음과 같은 이점을 제공할 수 있습니다.
환경 인식: 앱이 실행 중인 환경에 따라 가장 적합한 자격 증명을 자동으로 선택합니다. 이 코드가 없으면 다음과 같은 코드를 작성해야 합니다.
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 개요 섹션을 참조하세요.
- 체인 "구축": 빈 체인으로 시작하고 필요한 것만 포함합니다. 이 접근 방식에 대해서는 ChainedTokenCredential 개요 섹션을 참조하세요.
DefaultAzureCredential 개요
DefaultAzureCredential 은 특정 의도를 가진 미리 구성된 자격 증명 체인입니다. 가장 일반적인 인증 흐름 및 개발자 도구와 함께 많은 환경을 지원하도록 설계되었습니다. 그래픽 형식의 기본 체인은 다음과 같습니다.
DefaultAzureCredential이 자격 증명을 시도하는 순서는 다음과 같습니다.
| 순서 | 자격 증명 | 설명 |
|---|---|---|
| 1 | 환경 |
환경 변수 컬렉션을 읽어 애플리케이션 서비스 주체(애플리케이션 사용자)가 앱에 대해 구성되었는지 확인합니다. 이 경우 DefaultAzureCredential 이러한 값을 사용하여 Azure 앱을 인증합니다. 이 메서드는 로컬로 개발할 때 사용할 수 있지만 서버 환경에서 가장 자주 사용됩니다. |
| 2 | 워크로드 ID | 앱이 워크로드 ID를 사용하도록 설정된 Azure 호스트에 배포된 경우 해당 계정을 인증합니다. |
| 3 | 관리되는 ID | 관리 ID를 사용하도록 설정된 Azure 호스트에 앱을 배포하는 경우 해당 관리 ID를 사용하여 Azure 앱을 인증합니다. |
| 4 | IntelliJ | 개발자가 intelliJ용 Azure 도구 키트를 통해 인증한 경우 해당 계정을 인증합니다. |
| 5 | Visual Studio Code | 개발자가 Visual Studio Code Azure 리소스 확장 및 azure-identity-broker 패키지를 통해 인증한 경우 해당 계정을 인증합니다. |
| 6 | Azure CLI | 개발자가 Azure CLI az login 명령을 사용하여 Azure 인증한 경우 동일한 계정을 사용하여 Azure 앱을 인증합니다. |
| 7 | Azure PowerShell | 개발자가 Azure PowerShell Connect-AzAccount cmdlet을 사용하여 Azure 인증한 경우 동일한 계정을 사용하여 Azure 앱을 인증합니다. |
| 8 (여덟) | Azure 개발자 CLI | 개발자가 Azure Developer CLI의 azd auth login 명령을 사용하여 Azure 인증한 경우 해당 계정으로 인증합니다. |
| 9 | 브로커 | broker를 통해 OS에 로그인한 기본 계정을 사용하여 인증합니다. broker 지원 인스턴스 가 사용되므로 InteractiveBrowserCredential 설치해야 합니다. |
가장 간단한 형태인 DefaultAzureCredential의 매개변수 없는 버전은 다음과 같이 사용할 수 있습니다:
import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
// Code omitted for brevity
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.build();
DefaultAzureCredential을 사용자 지정하는 방법
다음 섹션에서는 체인에 포함되는 자격 증명을 제어하기 위한 전략을 설명합니다.
자격 증명 형식 범주 제외
전체 Developer tool 또는 Deployed service 자격 증명을 제외하려면 환경 변수 AZURE_TOKEN_CREDENTIALS를 prod 또는 dev로 각각 설정합니다. 값 prod 이 사용되는 경우 기본 자격 증명 체인은 다음과 같습니다.
값 dev 이 사용되는 경우 체인은 다음과 같이 표시됩니다.
중요합니다
AZURE_TOKEN_CREDENTIALS 환경 변수는 패키지 azure-identity 버전 1.16.1 이상에서 지원됩니다.
환경 변수가 정의되고 지원되는 문자열로 설정되도록 하려면 다음과 같이 메서드 requireEnvVars 를 호출합니다.
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
.build();
중요합니다
패키지 버전 1.18.0 이상에서 사용할 수 있는 requireEnvVars 메서드입니다.
기본값 AZURE_TOKEN_CREDENTIALS대신 사용자 지정 환경 변수 이름을 사용하려면 사용자 지정 변수에 대한 참조를 만드는 데 사용합니다 AzureIdentityEnvVars.fromString() .
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.requireEnvVars(AzureIdentityEnvVars.fromString("MY_CUSTOM_TOKEN_CREDENTIALS"))
.build();
비고
지정된 환경 변수가 설정되지 않았거나 비어 있으면 메서드가 IllegalStateException을(를) throw합니다.
특정 자격 증명 사용
하나의 자격 증명을 제외하고 모든 자격 증명을 제외하려면 환경 변수 AZURE_TOKEN_CREDENTIALS 를 자격 증명 이름으로 설정합니다. 예를 들어, DefaultAzureCredential를 AzureCliCredential로 설정하여 AZURE_TOKEN_CREDENTIALS 체인을 AzureCliCredential로 줄일 수 있습니다. 문자열 비교는 대/소문자를 구분하지 않는 방식으로 수행됩니다. 환경 변수에 유효한 문자열 값은 다음과 같습니다.
AzureCliCredentialAzureDeveloperCliCredentialAzurePowerShellCredentialEnvironmentCredentialIntelliJCredentialManagedIdentityCredentialVisualStudioCodeCredentialWorkloadIdentityCredential
중요합니다
환경 변수는 AZURE_TOKEN_CREDENTIALS 패키지 버전 1.17.0 이상에서 azure-identity 개별 자격 증명 이름을 지원합니다.
환경 변수가 정의되고 지원되는 문자열로 설정되도록 하려면 다음과 같이 호출 메서드 에EnvVars가 필요합니다 .
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
.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.IntelliJCredential;
import com.azure.identity.IntelliJCredentialBuilder;
// Code omitted for brevity
AzureCliCredential cliCredential = new AzureCliCredentialBuilder()
.build();
IntelliJCredential ijCredential = new IntelliJCredentialBuilder()
.build();
ChainedTokenCredential credential = new ChainedTokenCredentialBuilder()
.addLast(cliCredential)
.addLast(ijCredential)
.build();
앞의 코드 예제에서는 두 개의 개발 시간 자격 증명으로 구성된 맞춤형 자격 증명 체인을 만듭니다.
AzureCliCredential 먼저 시도되고, 필요한 경우 IntelliJCredential이어서 시도됩니다. 그래픽 형식으로 체인은 다음과 같이 표시됩니다:
팁
성능을 향상시키려면 가장 적게 사용되는 자격 증명에서 ChainedTokenCredential 자격 증명 순서를 최적화합니다.
DefaultAzureCredential에 대한 사용 지침
DefaultAzureCredential Azure ID 라이브러리를 시작하는 가장 쉬운 방법은 의심할 여지 없이 가장 쉬운 방법이지만 편의상 장단점이 있습니다. Azure 앱을 배포한 후에는 앱의 인증 요구 사항을 이해하고 DefaultAzureCredential 시나리오에 적합한지 여부를 고려해야 합니다.
DefaultAzureCredential 는 특정 인증 메커니즘에서 애플리케이션 코드를 분리하여 코드를 수정하지 않고도 인증 구성을 변경할 수 있도록 하는 주요 이점을 제공합니다. 프로덕션 인증을 의식적으로 구성하는 숙련된 개발자의 경우 이러한 유연성이 중요할 수 있습니다. 그러나 이러한 유연성에는 다음과 같은 잠재적인 단점이 있습니다.
- 디버깅 문제: 인증에 실패하면 잘못된 자격 증명을 디버깅하고 식별하는 것이 어려울 수 있습니다. 한 자격 증명에서 다음 자격 증명으로의 진행률과 각 자격 증명의 성공/실패 상태를 보려면 로깅을 사용하도록 설정해야 합니다. 자세한 내용은 연결된 자격증명 디버깅하기를 참조하세요.
-
성능 오버헤드: 여러 자격 증명을 순차적으로 시도하는 프로세스로 인해 성능 오버헤드가 발생할 수 있습니다. 예를 들어 로컬 개발 머신에서 실행하는 경우 관리 ID를 사용할 수 없습니다. 따라서
ManagedIdentityCredential로컬 개발 환경에서는 항상 실패합니다. -
예측할 수 없는 동작:
DefaultAzureCredential특정 환경 변수가 있는지 확인합니다. 누군가 호스트 컴퓨터의 시스템 수준에서 이러한 환경 변수를 추가하거나 수정할 수 있습니다. 이러한 변경 사항은 전역적으로 적용되므로 해당 컴퓨터에서 실행 중인 모든 앱에서 런타임 시DefaultAzureCredential의 동작이 변경됩니다. -
권한 불일치:
DefaultAzureCredential해당 자격 증명에 올바른 권한이 있는지 여부에 관계없이 토큰을 성공적으로 획득하는 첫 번째 자격 증명에서 중지됩니다. 예를 들어 로컬 개발 자격 증명은 프로덕션 관리 ID보다 더 광범위한 권한을 가질 수 있으므로 앱이 로컬로 작동하지만 배포 후 권한 부여 검사가 실패합니다.
연결된 자격 증명 디버그
예기치 않은 문제를 진단하거나 체인화된 자격 증명이 어떤 역할을 하는지 파악하려면 앱에서 로깅을 활성화하세요.
설명을 위해 매개 변수가 없는 형식의 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 IntelliJCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential VisualStudioCodeCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential AzureCliCredential returns a token
앞의 출력에서 이를 확인할 수 있습니다:
-
EnvironmentCredential,WorkloadIdentityCredential,ManagedIdentityCredential,IntelliJCredential및VisualStudioCodeCredential각각 해당 순서대로 Microsoft Entra 액세스 토큰을 획득하지 못했습니다. -
AzureCliCredential.getToken호출이 성공적으로 이루어진 경우, 이는returns a token-접미사가 있는 항목으로 표시됩니다.AzureCliCredential가 성공한 이후 다른 자격 증명은 시도되지 않았습니다.