Python용 Azure SDK를 사용하여 Azure 서비스에 Python 앱 인증

애플리케이션이 Azure Storage, Azure Key Vault 또는 Azure Cognitive Services와 같은 Azure 리소스에 액세스해야 하는 경우 애플리케이션을 Azure에 인증해야 합니다. 이 요구 사항은 Azure에 배포되거나 온-프레미스에 배포되거나 로컬 개발자 워크스테이션에서 개발 중인 모든 애플리케이션에 적용됩니다. 이 문서에서는 Python용 Azure SDK를 사용할 때 Azure에 앱을 인증하는 권장 방법을 설명합니다.

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

앱이 Azure 리소스에 인증하는 데 사용하는 특정 유형의 토큰 기반 인증은 앱이 실행되는 위치에 따라 달라집니다. 토큰 기반 인증 유형은 다음 다이어그램에 나와 있습니다.

A diagram that shows the recommended token-based authentication strategies for an app depending on where it's running.

  • 개발자가 로컬 개발 중에 앱을 실행하는 경우: 앱은 로컬 개발을 위한 애플리케이션 서비스 주체 또는 개발자의 Azure 자격 증명을 사용하여 Azure에 인증합니다. 이러한 옵션은 로컬 개발 중에 인증 섹션에서 설명합니다.
  • 앱이 Azure에서 호스트되는 경우: 앱은 관리 ID를 사용하여 Azure 리소스에 인증합니다. 이 옵션은 서버 환경의 인증 섹션에서 설명합니다.
  • 앱이 호스트되고 온-프레미스에 배포되는 경우: 앱은 애플리케이션 서비스 주체를 사용하여 Azure 리소스에 인증합니다. 이 옵션은 서버 환경의 인증 섹션에서 설명합니다.

DefaultAzureCredential

Azure SDK에서 제공하는 DefaultAzureCredential 클래스를 사용하면 앱이 실행되는 환경에 따라 다른 인증 방법을 사용할 수 있습니다. 이러한 방식으로 앱을 로컬 개발에서 테스트 환경으로 코드 변경 없이 프로덕션으로 승격할 수 있습니다.

각 환경에 대해 적절한 인증 방법을 구성하고 DefaultAzureCredential 해당 인증 방법을 자동으로 검색하고 사용합니다. DefaultAzureCredential 조건부 논리 또는 기능 플래그를 수동으로 코딩하여 다른 환경에서 다양한 인증 방법을 사용하는 것이 좋습니다.

클래스 사용에 DefaultAzureCredential 대한 자세한 내용은 애플리케이션에서 DefaultAzureCredential 사용 섹션에서 설명합니다.

토큰 기반 인증의 이점

Azure용 앱을 빌드할 때 연결 문자열을 사용하는 대신 토큰 기반 인증을 사용합니다. 토큰 기반 인증은 연결 문자열을 사용하여 인증하는 데 비해 다음과 같은 이점을 제공합니다.

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

프로덕션 또는 중요한 데이터에 액세스하지 않는 초기 개념 증명 앱 또는 개발 프로토타입으로 연결 문자열 사용을 제한합니다. 그렇지 않은 경우 Azure SDK에서 사용할 수 있는 토큰 기반 인증 클래스는 Azure 리소스에 인증할 때 항상 선호됩니다.

서버 환경에서 인증

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

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

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

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

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

로컬 개발 중 인증

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

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

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

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

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

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

애플리케이션에서 DefaultAzureCredential 사용

Python 앱에서 DefaultAzureCredential 을 사용하려면 애플리케이션에 azure.identity 패키지를 추가합니다.

pip install azure-identity

다음 코드 예제에서는 개체를 DefaultAzureCredential 인스턴스화하고 Azure SDK 클라이언트 클래스와 함께 사용하는 방법을 보여줍니다. 이 경우 BlobServiceClient Azure Blob Storage 액세스하는 데 사용되는 개체입니다.

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

# Acquire a credential object
credential = DefaultAzureCredential()

blob_service_client = BlobServiceClient(
        account_url="https://<my_account_name>.blob.core.windows.net",
        credential=credential)

개체는 DefaultAzureCredential 앱에 대해 구성된 인증 메커니즘을 자동으로 검색하고 Azure에 앱을 인증하는 데 필요한 토큰을 가져옵니다. 애플리케이션에서 둘 이상의 SDK 클라이언트를 사용하는 경우 각 SDK 클라이언트 개체와 동일한 자격 증명 개체를 사용할 수 있습니다.

DefaultAzureCredential을 사용하는 경우의 인증 방법 시퀀스

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

자격 증명을 DefaultAzureCredential 찾는 순서는 다음 다이어그램 및 테이블에 표시됩니다.

A diagram that shows the sequence in which DefaultAzureCredential checks to see what authentication source is configured for an application.

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

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

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