.NET Azure SDK를 사용하여 .NET 앱을 Azure 서비스에 인증하는 방법

애플리케이션이 스토리지, 키 자격 증명 모음 또는 인지 서비스와 같은 Azure 리소스에 액세스해야 하는 경우 해당 애플리케이션은 Azure에 인증되어야 합니다. 이는 Azure에 배포되거나, 온-프레미스에 배포되거나, 로컬 개발자 워크스테이션에서 개발 중인 모든 애플리케이션에 해당됩니다. 이 문서에서는 .NET용 Azure SDK를 사용할 때 Azure에 앱을 인증하는 데 권장되는 방식을 설명합니다.

Azure 리소스에 인증할 때 앱에서 연결 문자열 대신 토큰 기반 인증을 사용하는 것이 좋습니다. .NET용 Azure SDK는 토큰 기반 인증을 지원하고 앱이 로컬 개발 중인지, Azure에 배포되었는지 또는 온-프레미스 서버에 배포되었는지 여부에 관계없이 앱이 Azure 리소스에 원활하게 인증할 수 있도록 하는 클래스를 제공합니다.

앱이 Azure 리소스를 인증하는 데 사용해야 하는 특정 형식의 토큰 기반 인증은 앱이 실행되는 위치에 따라 다르며 다음 다이어그램에 표시됩니다.

앱이 실행되는 위치에 따라 앱에 권장되는 토큰 기반 인증 전략을 보여 주는 다이어그램

  • 개발자가 로컬 개발 중에 앱을 실행하는 경우 - 앱은 로컬 개발용 애플리케이션 서비스 주체를 사용하거나 개발자의 Azure 자격 증명을 사용하여 Azure에 인증할 수 있습니다. 각 옵션은 로컬 개발 중 인증 섹션에서 자세히 설명합니다.
  • 앱이 Azure에서 호스트되는 경우 - 앱은 관리 ID를 사용하여 Azure 리소스에 인증해야 합니다. 이 옵션은 아래의 서버 환경에서 인증 섹션에서 자세히 설명합니다.
  • 앱이 온-프레미스에서 호스트되고 배포되는 경우 - 앱은 애플리케이션 서비스 주체를 사용하여 Azure 리소스에 인증해야 합니다. 이 옵션은 아래의 서버 환경에서 인증 섹션에서 자세히 설명합니다.

DefaultAzureCredential

Azure SDK에서 제공하는 DefaultAzureCredential 클래스를 사용하면 앱이 실행되는 환경에 따라 다양한 인증 방법을 사용할 수 있습니다. 이를 통해 코드 변경 없이 앱을 로컬 개발에서 테스트 환경, 프로덕션으로 승격할 수 있습니다. 각 환경에 적절한 인증 방법을 구성하면 DefaultAzureCredential이 자동으로 해당 인증 방법을 검색하고 사용합니다. 다양한 환경에서 다양한 인증 방법을 사용하려면 조건부 논리나 기능 플래그를 수동으로 코딩하는 것보다 DefaultAzureCredential을 사용하는 것이 좋습니다.

DefaultAzureCredential 클래스 사용에 대한 자세한 내용은 이 문서 뒷부분의 애플리케이션에서 DefaultAzureCredential 사용 섹션에서 다룹니다.

토큰 기반 인증의 이점

Azure용 앱을 빌드할 때 연결 문자열을 사용하는 것보다 토큰 기반 인증을 사용하는 것이 좋습니다. 토큰 기반 인증은 연결 문자열을 사용한 인증에 비해 다음과 같은 이점을 제공합니다.

  • 아래에 설명된 토큰 기반 인증 방법을 사용하면 Azure 리소스에서 앱에 필요한 특정 권한을 설정할 수 있습니다. 이는 최소 권한 원칙을 따릅니다. 반면에 연결 문자열은 Azure 리소스에 대한 모든 권한을 부여합니다.
  • 연결 문자열이 있다면 모든 사람 또는 모든 앱이 Azure 리소스에 연결할 수 있는 반면, 토큰 기반 인증 방법은 실제로 리소스에 액세스하려는 앱으로만 리소스에 대한 액세스 범위를 한정합니다.
  • 관리 ID의 경우 저장할 애플리케이션 비밀이 없습니다. 따라서 손상될 수 있는 연결 문자열이나 애플리케이션 비밀이 없기 때문에 앱이 더욱 안전해집니다.
  • Azure SDK의 Azure.Identity 패키지는 백그라운드에서 토큰을 관리합니다. 이 덕분에 토큰 기반 인증을 연결 문자열만큼 쉽게 사용할 수 있습니다.

연결 문자열의 사용은 프로덕션 또는 중요한 데이터에 액세스하지 않는 초기 개념 증명 앱 또는 개발 프로토타입으로 제한되어야 합니다. 그렇지 않으면 Azure 리소스에 인증할 때 Azure SDK에서 사용할 수 있는 토큰 기반 인증 클래스를 항상 기본으로 설정해야 합니다.

서버 환경에서의 인증

서버 환경에서 호스팅하는 경우 각 애플리케이션에는 해당 애플리케이션이 실행되는 환경별로 고유한 애플리케이션 ID가 할당되어야 합니다. Azure에서 앱 ID는 Azure에서 앱을 식별하고 인증하기 위한 특별한 형식의 보안 주체서비스 주체로 표시됩니다. 앱에 사용할 서비스 주체 형식은 앱이 실행되는 위치에 따라 다릅니다.

인증 방법 설명
Azure에서 호스트되는 앱 Azure에서 호스트되는 앱은 관리 ID 서비스 주체를 사용해야 합니다. 관리 ID는 Azure에서 호스트되는 앱의 ID를 나타내도록 설계되었으며 Azure에서 호스트되는 앱에서만 사용할 수 있습니다.

예를 들어, Azure App Service에서 호스트되는 .NET 웹앱에는 관리 ID가 할당됩니다. 그런 다음 앱에 할당된 관리 ID를 사용하여 다른 Azure 서비스에 앱을 인증합니다.

Azure 외부에서 호스트되는 앱
(예: 온-프레미스 앱)
Azure 서비스에 연결해야 하는 Azure 외부에서 호스트되는 앱(예: 온-프레미스 앱)은 애플리케이션 서비스 주체를 사용해야 합니다. 애플리케이션 서비스 주체는 Azure에서 앱의 ID를 나타내며 애플리케이션 등록 프로세스를 통해 만들어집니다.

예를 들어, Azure Blob Storage를 사용하는 온-프레미스에서 호스트되는 .NET 웹앱을 생각해 보세요. 앱 등록 프로세스를 사용하여 앱에 대한 애플리케이션 서비스 주체를 만듭니다. AZURE_CLIENT_ID, AZURE_TENANT_IDAZURE_CLIENT_SECRET은 모두 런타임 시 애플리케이션에서 읽을 수 있는 환경 변수로 저장되며 앱이 애플리케이션 서비스 주체를 사용하여 Azure에 인증할 수 있도록 합니다.

로컬 개발 중 인증

로컬 개발 중에 개발자의 워크스테이션에서 애플리케이션을 실행하는 경우에도 앱에서 사용하는 모든 Azure 서비스에 인증해야 합니다. 로컬 개발 중에 Azure에 앱을 인증하는 두 가지 주요 전략은 다음과 같습니다.

인증 방법 설명
로컬 개발 중에 사용할 전용 애플리케이션 서비스 주체 개체 만들기 이 방법에서는 로컬 개발 중에 사용할 앱 등록 프로세스를 사용하여 전용 애플리케이션 서비스 주체 개체를 설정합니다. 그런 다음 서비스 주체의 ID는 로컬 개발에서 앱이 실행될 때 앱에서 액세스할 수 있는 환경 변수로 저장됩니다.

이 방법을 사용하면 로컬 개발 중에 개발자가 사용하는 서비스 주체 개체에 앱에 필요한 특정 리소스 권한을 할당할 수 있습니다. 이렇게 하면 애플리케이션이 필요한 특정 리소스에만 액세스할 수 있고 앱이 프로덕션에서 갖게 될 권한을 복제할 수 있습니다.

이 방식의 단점은 애플리케이션에서 작업하는 각 개발자에 대해 별도의 서비스 주체 개체를 만들어야 한다는 점입니다.

로컬 개발 중에 개발자의 자격 증명을 사용하여 Azure에 앱 인증 이 방법에서는 개발자가 로컬 워크스테이션의 Visual Studio, VS Code용 Azure 도구 확장, Azure CLI 또는 Azure PowerShell에서 Azure에 로그인해야 합니다. 그러면 애플리케이션은 자격 증명 저장소에서 개발자의 자격 증명에 액세스하고 해당 자격 증명을 사용하여 앱에서 Azure 리소스에 액세스할 수 있습니다.

이 방법은 개발자가 Visual Studio, VS Code 또는 Azure CLI에서 Azure 계정에 로그인하기만 하면 되므로 설정이 쉽다는 장점이 있습니다. 이 방식의 단점은 개발자의 계정에 애플리케이션에 필요한 것보다 더 많은 권한이 있을 가능성이 높다는 점입니다. 따라서 이 방식은 프로덕션 환경에서 앱 실행에 사용되는 권한을 정확하게 복제하지 않습니다.

애플리케이션에서 DefaultAzureCredential 사용

DefaultAzureCredential은 여러 인증 방법을 지원하며 런타임에 사용되는 인증 방법을 결정합니다. 이러한 방식으로 앱은 환경별 코드를 구현하지 않고도 다양한 환경에서 다양한 인증 방법을 사용할 수 있습니다.

DefaultAzureCredential이 자격 증명을 찾는 순서와 위치는 DefaultAzureCredential에서 확인할 수 있습니다.

DefaultAzureCredential을 구현하려면 먼저 Azure.Identity를 추가하고 필요할 때 Microsoft.Extensions.Azure 패키지를 애플리케이션에 추가합니다. 명령줄 또는 NuGet 패키지 관리자를 사용하여 이 작업을 수행할 수 있습니다.

애플리케이션 프로젝트 디렉터리에서 원하는 터미널 환경을 열고 아래 명령을 입력합니다.

dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure

Azure 서비스는 일반적으로 SDK의 해당 클라이언트 클래스를 사용하여 액세스됩니다. 이러한 클래스와 자체 사용자 지정 서비스는 Program.cs 파일에 등록되어야 앱 전체에서 종속성 주입을 통해 액세스할 수 있습니다. Program.cs 내에서 아래 단계에 따라 서비스와 DefaultAzureCredential을 올바르게 설정하세요.

  1. using 문을 사용하여 Azure.IdentityMicrosoft.Extensions.Azure 네임스페이스를 포함합니다.
  2. 관련 도우미 메서드를 사용하여 Azure 서비스를 등록합니다.
  3. DefaultAzureCredential 개체의 인스턴스를 UseCredential 메서드에 전달합니다.

이 예제는 다음 코드 세그먼트에 나와 있습니다.

using Microsoft.Extensions.Azure;
using Azure.Identity;

// Inside of Program.cs
builder.Services.AddAzureClients(x =>
{
    x.AddBlobServiceClient(new Uri("https://<account-name>.blob.core.windows.net"));
    x.UseCredential(new DefaultAzureCredential());
});

또는 아래와 같이 추가 Azure 등록 방법의 도움 없이 서비스에서 DefaultAzureCredential을 더 직접적으로 활용할 수도 있습니다.

using Azure.Identity;

// Inside of Program.cs
builder.Services.AddSingleton<BlobServiceClient>(x => 
    new BlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"),
        new DefaultAzureCredential()));

위 코드가 로컬 개발 중에 로컬 워크스테이션에서 실행되면 환경 변수에서 애플리케이션 서비스 주체를 찾거나 Visual Studio, VS Code, Azure CLI 또는 Azure PowerShell에서 개발자 자격 증명 집합을 찾습니다. 둘 중 하나를 로컬 개발 중에 Azure 리소스에 대해 앱을 인증하는 데 사용할 수 있습니다.

Azure에 배포할 때 이 동일한 코드는 다른 Azure 리소스에 대해 앱을 인증할 수도 있습니다. DefaultAzureCredential은 환경 설정 및 관리 ID 구성을 검색하여 다른 서비스에 자동으로 인증할 수 있습니다.

DefaultAzureCredential 인증 방법 시퀀스 탐색

내부적으로 DefaultAzureCredential은 Azure 리소스에 대해 애플리케이션을 인증하기 위한 자격 증명 공급자 체인을 구현합니다. 각 자격 증명 공급자는 해당 형식의 자격 증명이 앱에 구성되어 있는지 검색할 수 있습니다. DefaultAzureCredential은 각 공급자를 순서대로 순차적으로 확인하고 자격 증명이 구성된 첫 번째 공급자의 자격 증명을 사용합니다.

DefaultAzureCredential이 자격 증명을 찾는 순서와 위치는 DefaultAzureCredential에서 확인할 수 있습니다.

자격 증명 유형 설명
애플리케이션 서비스 주체 DefaultAzureCredential은 환경 변수 집합을 읽어 애플리케이션 서비스 주체(애플리케이션 사용자)가 앱에 설정되었는지 확인합니다. 그렇다면 DefaultAzureCredential은 이러한 값을 사용하여 Azure에 앱을 인증합니다.

이 방법은 서버 환경에서 가장 많이 사용되지만, 로컬로 개발할 때도 사용할 수 있습니다.
관리 ID 애플리케이션이 관리 ID가 사용하도록 설정된 Azure 호스트에 배포되면 DefaultAzureCredential은 해당 관리 ID를 사용하여 Azure에 앱을 인증합니다. 관리 ID를 사용한 인증은 이 문서의 서버 환경에서 인증 섹션에서 설명합니다.

이 방법은 Azure App Service, Azure Functions 또는 Azure Virtual Machines와 같은 서비스를 사용하여 Azure에서 애플리케이션을 호스트된 경우에만 사용할 수 있습니다.
Visual Studio 개발자가 Visual Studio에 로그인하여 Azure에 인증한 경우 DefaultAzureCredential은 동일한 계정을 사용하여 Azure에 앱을 인증합니다.
Visual Studio Code 개발자가 Visual Studio Code Azure 계정 플러그 인을 사용하여 Azure에 인증한 경우 DefaultAzureCredential은 동일한 계정을 사용하여 Azure에 앱을 인증합니다.
Azure CLI 개발자가 Azure CLI에서 az login 명령을 사용하여 Azure에 인증한 경우 DefaultAzureCredential은 동일한 계정을 사용하여 Azure에 앱을 인증합니다.
Azure PowerShell 개발자가 Azure PowerShell의 Connect-AzAccount cmdlet을 사용하여 Azure에 인증한 경우 DefaultAzureCredential은 동일한 계정을 사용하여 Azure에 앱을 인증합니다.
대화형 이 옵션이 사용하도록 설정되면 DefaultAzureCredential은 현재 시스템의 기본 브라우저를 통해 개발자를 대화형으로 인증합니다. 기본적으로 이 옵션은 사용하지 않도록 설정되어 있습니다.