자격 증명을 처리하지 않고 애플리케이션에서 리소스에 연결

관리 ID를 지원하는 Azure 리소스는 항상 Microsoft Entra 인증을 지원하는 Azure 리소스에 연결하기 위해 관리 ID를 지정하는 옵션을 제공합니다. 관리 ID 지원을 사용하면 개발자가 코드에서 자격 증명을 관리할 필요가 없습니다. 관리 ID는 이를 지원하는 Azure 리소스를 사용할 때 권장되는 인증 옵션입니다. 관리 ID 개요를 참조하세요.

이 페이지에서는 Azure Key Vault, Azure Storage 및 Microsoft SQL Server에 연결할 수 있도록 App Service를 구성하는 방법을 보여 줍니다. 관리 ID를 지원하고 Microsoft Entra 인증을 지원하는 리소스에 연결되는 모든 Azure 리소스에 동일한 원칙을 사용할 수 있습니다.

코드 샘플에서는 연결에 사용되는 액세스 토큰 획득을 포함하여 많은 단계를 자동으로 처리하므로 권장되는 방법인 Azure ID 클라이언트 라이브러리를 사용합니다.

관리 ID에서 연결할 수 있는 리소스는 무엇인가요?

관리 ID는 Microsoft Entra 인증을 지원하는 모든 리소스에 연결할 수 있습니다. 일반적으로 리소스에는 관리 ID에서 연결할 수 있도록 하는 데 필요한 특별한 지원이 없습니다.

일부 리소스는 Microsoft Entra 인증을 지원하지 않거나 해당 클라이언트 라이브러리가 토큰을 사용한 인증을 지원하지 않습니다. 코드 또는 애플리케이션 구성에 저장할 필요 없이 관리 ID를 사용하여 자격 증명에 안전하게 액세스하는 방법에 대한 지침을 보려면 계속 읽어보세요.

관리 ID 만들기

관리 ID에는 시스템 할당 및 사용자 할당의 두 가지 유형이 있습니다. 시스템이 할당한 ID는 단일 Azure 리소스에 직접 연결됩니다. Azure 리소스가 삭제되면 ID도 삭제됩니다. 사용자가 할당한 관리 ID는 여러 Azure 리소스와 연결할 수 있으며 해당 수명 주기는 이러한 리소스와 관련이 없습니다.

이 문서에서는 대부분의 시나리오에 권장되는 사용자가 할당한 관리 ID를 만들고 구성하는 방법에 대해 설명합니다. 사용하는 원본 리소스에서 사용자가 할당한 관리 ID를 지원하지 않는 경우 해당 리소스 공급자의 설명서를 참조하여 시스템이 할당한 관리 ID를 갖도록 구성하는 방법을 알아보세요.

사용자 할당 관리 ID 만들기

참고 항목

새 사용자가 할당한 관리 ID를 만들려면 "관리 ID 기여자"와 같은 역할이 필요합니다.

  1. 포털 위쪽의 검색 창에서 "관리 ID"를 검색하여 일치하는 결과를 선택합니다.

Screenshot of searching for managed identities in the portal.

  1. "만들기" 단추를 선택합니다.

Screenshot showing a managed identity create button in the portal.

  1. 구독 및 리소스 그룹을 선택하고, 관리 ID의 이름을 입력합니다.

Screenshot showing a managed identity create screen in the portal.

  1. "검토 + 만들기"를 선택하여 유효성 검사 테스트를 실행한 다음, "만들기" 단추를 선택합니다.

  2. ID가 만들어지면 확인 화면이 표시됩니다.

Screenshot showing a managed identity confirmation screen after creation in the portal.

이제 Azure 원본 리소스와 연결할 수 있는 ID가 있습니다. 사용자가 할당한 관리 ID를 관리하는 방법에 대해 자세히 알아보세요..

사용자가 할당한 관리 ID를 사용하도록 원본 리소스 구성

다음 단계에 따라 포털을 통해 관리 ID를 갖도록 Azure 리소스를 구성합니다. 명령줄 인터페이스, PowerShell 또는 ARM 템플릿을 사용하여 리소스의 ID를 구성하는 방법을 알아보려면 특정 리소스 종류에 대한 설명서를 참조하세요.

참고 항목

시스템이 할당한 ID를 갖도록 Azure 리소스를 구성하려면 "쓰기" 권한이 필요합니다. 사용자가 할당한 ID를 Azure 리소스와 연결하려면 "관리 ID 운영자"와 같은 역할이 필요합니다.

  1. 포털 위쪽의 검색 창을 사용하여 리소스를 찾습니다.

Screenshot showing a resource being searched for in the portal.

  1. 탐색 영역에서 [ID] 링크를 선택합니다.

Screenshot showing the link to the identity screen for a resource in the portal.

  1. "사용자 할당" 탭을 선택합니다.

  2. "추가" 단추를 선택합니다.

Screenshot showing a user-assigned identity screen in the portal.

  1. 이전에 만든 사용자가 할당한 ID를 선택하고, "추가"를 선택합니다.

Screenshot showing a user-assigned identity being selected in the portal.

  1. ID가 리소스와 연결되고 목록이 업데이트됩니다.

Screenshot showing a user-assigned identity has been associated with the Azure resource in the portal.

이제 대상 리소스에 연결하는 데 사용할 수 있는 사용자가 할당한 ID가 원본 리소스에 있습니다.

ID에 권한 추가

참고 항목

역할 할당을 추가하려면 대상 리소스에 대해 "사용자 액세스 관리자" 또는 "소유자"와 같은 역할이 필요합니다. 애플리케이션을 실행하는 데 필요한 최소 권한을 부여해야 합니다.

이제 App Service에 관리 ID가 있으므로 해당 ID에 올바른 권한을 부여해야 합니다. 이 ID를 사용하여 Azure Storage와 상호 작용하는 경우 Azure RBAC(역할 기반 액세스 제어) 시스템을 사용하게 됩니다.

  1. 포털 위쪽의 검색 창을 사용하여 연결하려는 리소스를 찾습니다.
  2. 왼쪽 탐색 메뉴에서 "액세스 제어(IAM)" 링크를 선택합니다.

Screenshot showing a resource summary screen in the portal.

  1. 화면 위쪽에 있는 "추가" 단추를 선택하고, "역할 할당 추가"를 선택합니다.

Screenshot showing the add role assignment navigation in the portal.

  1. 역할 목록이 표시됩니다. "보기" 링크를 선택하여 역할에 있는 특정 권한을 확인할 수 있습니다. ID에 부여하려는 역할을 선택하고, "다음" 단추를 선택합니다.

Screenshot showing a role being selected in the portal.

  1. 역할을 부여해야 하는 사용자를 선택하라는 메시지가 표시됩니다. "관리 ID" 옵션을 선택한 다음, "멤버 추가" 링크를 선택합니다.

Screenshot showing the identity type being selected in the portal.

  1. 관리 ID 유형별로 검색할 수 있는 컨텍스트 창이 오른쪽에 표시됩니다. "관리 ID" 옵션에서 "사용자가 할당한 관리 ID"를 선택합니다.

Screenshot showing managed identity being selected in the portal.

  1. 이전에 만든 ID 및 "선택" 단추를 차례로 선택합니다. 컨텍스트 창이 닫히고 ID가 목록에 추가됩니다.

Screenshot showing an identity being added to a resource in the portal.

  1. "검토 + 할당" 단추를 선택하여 역할 할당 요약을 확인한 다음, 다시 한 번 확인합니다.
  2. "역할 할당" 옵션을 선택합니다. 그러면 리소스에 대한 역할 할당 목록이 표시됩니다.

Screenshot showing the role assignment has been added in the portal.

이제 관리 ID에 Azure 대상 리소스에 액세스할 수 있는 올바른 권한이 있습니다. Azure 역할 기반 액세스 제어에 대해 자세히 알아보세요.

코드에서 관리 ID 사용

이제 App Service에 권한이 있는 관리 ID가 있습니다. 코드에서 자격 증명을 저장하는 대신 코드에서 관리 ID를 사용하여 대상 리소스와 상호 작용할 수 있습니다.

권장되는 방법은 기본 설정 프로그래밍 언어에 적합한 Azure ID 라이브러리를 사용하는 것입니다. 지원되는 언어로 .NET, Java, JavaScript, Python, GoC++가 있습니다. 라이브러리는 액세스 토큰을 획득하므로 대상 리소스에 쉽게 연결할 수 있습니다.

개발 환경에서 Azure ID 라이브러리 사용

Azure ID 라이브러리는 C++ 라이브러리를 제외하고 DefaultAzureCredential 형식을 지원합니다. DefaultAzureCredential은 환경 변수 또는 대화형 로그인을 포함한 여러 메커니즘을 통해 자동으로 인증을 시도합니다. 자격 증명 유형은 사용자 고유의 자격 증명을 사용하여 개발 환경에서 사용할 수 있습니다. 관리 ID를 사용하여 프로덕션 Azure 환경에서도 사용할 수 있습니다. 애플리케이션을 배포할 때 코드를 변경할 필요가 없습니다.

사용자가 할당한 관리 ID를 사용하는 경우 ID의 클라이언트 ID를 매개 변수로 전달하여 인증하려는 사용자가 할당한 관리 ID도 명시적으로 지정해야 합니다. 클라이언트 ID는 포털에서 ID로 이동하여 검색할 수 있습니다.

Screenshot showing the client ID for the managed identity in the portal.

아래에서 Azure ID 라이브러리에 대해 자세히 알아보세요.

Azure Storage에서 Blob에 액세스

using Azure.Identity;
using Azure.Storage.Blobs;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);                        

var blobServiceClient1 = new BlobServiceClient(new Uri("<URI of Storage account>"), credential);
BlobContainerClient containerClient1 = blobServiceClient1.GetBlobContainerClient("<name of blob>");
BlobClient blobClient1 = containerClient1.GetBlobClient("<name of file>");

if (blobClient1.Exists())
{
    var downloadedBlob = blobClient1.Download();
    string blobContents = downloadedBlob.Value.Content.ToString();                
}

Azure Key Vault에 저장된 비밀에 액세스

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);        

var client = new SecretClient(
    new Uri("https://<your-unique-key-vault-name>.vault.azure.net/"),
    credential);
    
KeyVaultSecret secret = client.GetSecret("<my secret>");
string secretValue = secret.Value;

Azure SQL Database에 액세스

using Azure.Identity;
using Microsoft.Data.SqlClient;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};

AccessToken accessToken = await new DefaultAzureCredential(credentialOptions).GetTokenAsync(
    new TokenRequestContext(new string[] { "https://database.windows.net//.default" }));                        

using var connection = new SqlConnection("Server=<DB Server>; Database=<DB Name>;")
{
    AccessToken = accessToken.Token
};
var cmd = new SqlCommand("select top 1 ColumnName from TableName", connection);
await connection.OpenAsync();
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
    Console.WriteLine(dr.GetValue(0).ToString());
}
dr.Close();	

라이브러리에서 Microsoft Entra ID 또는 토큰 기반 인증을 지원하지 않는 리소스에 연결

일부 Azure 리소스는 아직 Microsoft Entra 인증을 지원하지 않거나 해당 클라이언트 라이브러리가 토큰을 사용한 인증을 지원하지 않습니다. 일반적으로 이러한 리소스는 연결 문자열에서 사용자 이름 및 암호 또는 액세스 키가 필요한 오픈 소스 기술입니다.

자격 증명을 코드 또는 애플리케이션 구성에 저장하지 않으려면 자격 증명을 비밀로 Azure Key Vault에 저장할 수 있습니다. 위에 표시된 예제를 사용하면 관리 ID를 사용하여 Azure KeyVault에서 비밀을 검색하고 자격 증명을 연결 문자열에 전달할 수 있습니다. 이 방법은 코드 또는 환경에서 자격 증명을 직접 처리할 필요가 없음을 의미합니다.

토큰을 직접 처리하는 경우의 지침

일부 시나리오에서는 기본 제공 방법을 사용하여 대상 리소스에 연결하는 대신 관리 ID에 대한 토큰을 수동으로 획득할 수 있습니다. 이러한 시나리오에는 사용하는 프로그래밍 언어에 적합한 클라이언트 라이브러리, 연결하는 대상 리소스 또는 Azure에서 실행되지 않는 리소스에 연결하는 클라이언트 라이브러리가 포함되지 않습니다. 토큰을 수동으로 획득하는 경우 제공되는 지침은 다음과 같습니다.

획득한 토큰 캐시

성능과 안정성을 위해 애플리케이션에서 토큰을 로컬 메모리에 캐시하거나, 디스크에 저장하려는 경우 암호화하는 것이 좋습니다. 관리 ID 토큰은 24시간 동안 유효하므로 새 토큰을 정기적으로 요청하는 것은 이점이 없습니다.이는 캐시된 토큰이 토큰 발급 엔드포인트에서 반환되기 때문입니다. 요청 제한을 초과하면 속도가 제한되고 HTTP 429 오류가 발생합니다.

토큰을 획득하면 토큰이 생성될 때 반환되는 expires_on(또는 이에 상응하는 속성)보다 5분 전에 만료되도록 토큰 캐시를 설정할 수 있습니다.

토큰 검사

애플리케이션에서 토큰의 콘텐츠를 사용하면 안 됩니다. 토큰의 콘텐츠는 토큰을 요청하는 클라이언트가 아니라 액세스하는 대상(대상 리소스)만을 위한 것입니다. 토큰 콘텐츠는 나중에 변경되거나 암호화될 수 있습니다.

토큰을 공개하거나 이동하지 않음

토큰은 자격 증명처럼 처리해야 합니다. 사용자 또는 다른 서비스(예: 로깅/모니터링 솔루션)에 공개하지 마세요. 대상 리소스에 대해 인증하는 것 외에는 이를 사용하는 원본 리소스에서 이동하면 안 됩니다.

다음 단계