다음을 통해 공유


서비스 주체를 사용하여 로컬 개발 중에 Azure 서비스에 Go 앱 인증

로컬 개발 중에 애플리케이션은 다양한 Azure 서비스에 액세스하기 위해 Azure에 인증해야 합니다. 로컬 인증에 대한 두 가지 일반적인 방법은 개발자 계정 또는 서비스 주체를 사용하는 것입니다. 이 문서에서는 애플리케이션 서비스 주체를 사용하는 방법을 설명합니다. 다음 섹션에서는 다음을 알아봅니다.

  • Microsoft Entra에 애플리케이션을 등록하여 서비스 주체를 만드는 방법
  • Microsoft Entra 그룹을 사용하여 사용 권한을 효율적으로 관리하는 방법
  • 범위 권한에 역할을 할당하는 방법
  • 앱 코드에서 서비스 주체를 사용하여 인증하는 방법

전용 애플리케이션 서비스 주체를 사용하면 Azure 리소스에 액세스할 때 최소 권한 원칙을 준수할 수 있습니다. 개발 중에 앱의 특정 요구 사항에 대한 권한을 제한하여 다른 앱 또는 서비스를 위한 Azure 리소스에 실수로 액세스하지 못하도록 합니다. 또한 이 접근 방식은 앱이 개발 환경에서 과도하게 권한이 부여되지 않도록 하여 앱을 프로덕션으로 이동할 때 발생하는 문제를 방지하는 데 도움이 됩니다.

로컬 Go 앱에서 서비스 주체를 사용하여 Azure 리소스에 연결하는 방법을 보여 주는 다이어그램

Azure에서 앱을 등록할 때 애플리케이션 서비스 주체를 만듭니다. 로컬 개발의 경우:

  • 각 개발자가 고유한 애플리케이션 서비스 주체를 가지고 자격 증명을 공유할 필요가 없도록 앱에서 작업하는 각 개발자에 대해 별도의 앱 등록을 만듭니다.
  • 각 앱에 대해 별도의 앱 등록을 만들어 앱의 사용 권한을 필요한 권한으로만 제한합니다.

로컬 개발 중에 애플리케이션 서비스 주체의 ID를 사용하여 환경 변수를 설정합니다. Azure ID 라이브러리는 이러한 환경 변수를 읽고 필요한 Azure 리소스에 앱을 인증합니다.

Azure에서 앱 등록

애플리케이션 서비스 주체 개체는 Azure Portal 또는 Azure CLI를 사용하여 Azure에서 앱 등록을 통해 만들어집니다.

  1. Azure Portal에서 검색 창을 사용하여 앱 등록 페이지로 이동합니다.

  2. 앱 등록 페이지에서 + 새 등록을 선택합니다.

  3. 애플리케이션 등록 페이지에서 다음 작업을 수행하십시오.

    • 이름 필드에 앱 이름과 대상 환경을 포함하는 설명 값을 입력합니다.
    • 지원되는계정 유형에 대해 이 조직 디렉터리에서만 계정(Microsoft 고객 주도 전용 - 단일 테넌트)선택하거나 요구 사항에 가장 적합한 옵션을 선택합니다.
  4. 등록 선택하여 앱을 등록하고 서비스 주체를 만듭니다.

    Azure Portal에서 앱 등록을 만드는 방법을 보여 주는 스크린샷

  5. 앱의 앱 등록 페이지에서 애플리케이션(클라이언트) ID디렉터리(테넌트) ID 복사하여 앱 코드 구성에서 나중에 사용할 수 있도록 임시 위치에 붙여넣습니다.

  6. 인증서 또는 비밀 추가하여 앱에 대한 자격 증명을 설정합니다.

  7. 인증서 & 비밀 페이지에서 + 새 클라이언트 암호선택합니다.

  8. 열리는 플라이아웃 패널에서 클라이언트 암호를 추가하십시오:

    • 설명'Current'라는 값을 입력하십시오.
    • 만료 값의 경우 기본 권장값인 180일을 그대로 둡니다.
    • 추가하여 비밀을 추가합니다.
  9. 인증서 & 비밀 페이지에서 이후 단계에서 사용할 클라이언트 비밀의 Value 속성을 복사합니다.

    비고

    클라이언트 비밀 값은 앱 등록을 만든 후에 한 번만 표시됩니다. 이 클라이언트 비밀을 무효화하지 않고 더 많은 클라이언트 비밀을 추가할 수 있지만 이 값을 다시 표시할 수 있는 방법은 없습니다.

로컬 개발을 위한 Microsoft Entra 그룹 만들기

개별 서비스 주체 개체에 역할을 할당하는 대신 로컬 개발에서 앱에 필요한 역할(권한)을 캡슐화하는 Microsoft Entra 그룹을 만듭니다. 이 방법은 다음과 같은 이점을 제공합니다.

  • 모든 개발자는 그룹 수준에서 동일한 역할을 할당합니다.
  • 앱에 새 역할이 필요한 경우 앱의 그룹에만 추가하면 됩니다.
  • 새 개발자가 팀에 합류하면 개발자를 위해 새 애플리케이션 서비스 주체가 만들어지고 그룹에 추가되어 개발자가 앱에서 작업할 수 있는 올바른 권한이 있는지 확인합니다.
  1. Azure Portal에서 Microsoft Entra ID 개요 페이지로 이동합니다.

  2. 왼쪽 메뉴에서 모든 그룹을 선택합니다.

  3. 그룹 페이지에서 새 그룹을 선택합니다.

  4. 새 그룹 페이지에서 다음 양식 필드를 입력합니다.

    • 그룹 유형: 보안선택합니다.
    • 그룹 이름: 앱 또는 환경 이름에 대한 참조를 포함하는 그룹의 이름을 입력합니다.
    • 그룹 설명: 그룹의 용도를 설명하는 설명을 입력합니다.

    Azure Portal에서 그룹을 만드는 방법을 보여 주는 스크린샷

  5. 멤버 아래의 멤버가 선택되지 않음 링크를 선택하여 그룹에 구성원을 추가합니다.

  6. 열리는 플라이아웃 패널에서 이전에 만든 서비스 주체를 검색하고 필터링된 결과에서 선택합니다. 패널 아래쪽에 있는 선택 단추를 선택하여 선택 항목을 확인합니다.

  7. 새 그룹 페이지의 맨 아래에서 만들기를 선택하여 그룹을 만들고 모든 그룹 페이지로 돌아갑니다. 나열된 새 그룹이 표시되지 않으면 잠시 기다렸다가 페이지를 새로 고칩니다.

그룹에 역할 할당

다음으로, 앱이 어떤 리소스에 필요한 역할(사용 권한)을 결정하고 사용자가 만든 Microsoft Entra 그룹에 해당 역할을 할당합니다. 그룹은 리소스, 리소스 그룹 또는 구독 범위에서 역할을 할당할 수 있습니다. 이 예제에서는 대부분의 앱이 모든 Azure 리소스를 단일 리소스 그룹으로 그룹화하므로 리소스 그룹 범위에서 역할을 할당하는 방법을 보여 줍니다.

  1. Azure Portal에서 앱이 포함된 리소스 그룹의 개요 페이지로 이동합니다.

  2. 왼쪽 탐색 영역에서 액세스 제어(IAM) 선택합니다.

  3. 액세스 제어(IAM) 페이지에서 + 추가를 선택한 다음 드롭다운 메뉴에서 역할 할당 추가를 선택합니다. 역할 할당 추가 페이지에서는 역할을 구성하고 할당하는 여러 탭을 제공합니다.

  4. 역할 탭에서 검색 상자를 사용하여 할당할 역할을 찾습니다. 역할을 선택한 다음 다음을 선택합니다.

  5. 멤버 탭에서 다음을 수행 합니다 .

    • 값에 대한 액세스 할당에 대해 사용자, 그룹 또는 서비스 주체 를 선택합니다.
    • 멤버 값에 대해 + 멤버 선택을 선택하여 멤버선택 플라이아웃 패널을 엽니다.
    • 이전에 만든 Microsoft Entra 그룹을 검색하고 필터링된 결과에서 선택합니다. [선택]을 선택하여 그룹을 선택하고 플라이아웃 패널을 닫습니다.
    • 검토 + 할당구성원 탭 아래쪽에서 선택합니다.

    Microsoft Entra 그룹에 역할을 할당하는 방법을 보여 주는 스크린샷

  6. 검토 + 할당 탭의 페이지 맨 아래에서 검토 + 할당을 선택합니다.

앱 환경 변수 설정

런타임 시 Azure Identity 라이브러리의 특정 자격 증명(예: DefaultAzureCredential, EnvironmentCredential, 및 ClientSecretCredential)은 환경 변수에 의해 서비스 주체 정보를 검색합니다. 도구 및 환경에 따라 여러 가지 방법으로 환경 변수를 구성할 수 있습니다. 파일을 만들 .env 거나 시스템 환경 변수를 사용하여 개발 중에 이러한 자격 증명을 로컬로 저장할 수 있습니다. 대부분의 개발자는 여러 애플리케이션에서 작업하므로 개발 중에 애플리케이션의 디렉터리에 저장된 파일에서 godotenv 환경 변수에 액세스하는 것과 같은 .env 패키지를 사용합니다. 이 방법은 이 애플리케이션만 사용할 수 있도록 Azure에 애플리케이션을 인증하는 데 사용되는 환경 변수의 범위를 지정합니다. Azure에 .env 대한 애플리케이션 비밀 키가 포함되어 있으므로 원본 제어에 파일을 확인하지 마세요. Go용 표준 .gitignore 파일은 .env 파일을 체크인에서 자동으로 제외합니다.

패키지를 사용 godotenv 하려면 먼저 애플리케이션에 패키지를 설치합니다.

go get github.com/joho/godotenv

그런 다음 애플리케이션 루트 디렉터리에 .env 파일을 만듭니다. 서비스 주체에 대한 앱 등록 프로세스에서 가져온 값으로 환경 변수 값을 설정합니다.

  • AZURE_CLIENT_ID: Azure에서 등록된 앱을 식별하는 데 사용됩니다.
  • AZURE_TENANT_ID: Microsoft Entra 테넌트 ID입니다.
  • AZURE_CLIENT_SECRET: 앱에 대해 생성된 비밀 자격 증명입니다.
AZURE_CLIENT_ID=<your-client-id>
AZURE_TENANT_ID=<your-tenant-id>
AZURE_CLIENT_SECRET=<your-client-secret>

마지막으로 애플리케이션 시작 코드에서 godotenv 라이브러리를 사용하여 시작 시 .env 파일로부터 환경 변수를 읽습니다.

// Imports of fmt, log, and os omitted for brevity 
import "github.com/joho/godotenv"

environment := os.Getenv("ENVIRONMENT")

if environment == "development" {
	fmt.Println("Loading environment variables from .env file")

	// Load the .env file
	err := godotenv.Load(".env")
	if err != nil {
	    log.Fatalf("Error loading .env file: %v", err)
	}
}

파일을 사용하는 대신 시스템 환경에서 환경 변수를 .env 설정하려는 경우 운영 체제 및 셸에 따라 여러 가지 방법으로 설정할 수 있습니다. 다음 예제에서는 다른 셸에서 환경 변수를 설정하는 방법을 보여 줍니다.

export AZURE_CLIENT_ID=<your-client-id>
export AZURE_TENANT_ID=<your-tenant-id>
export AZURE_CLIENT_SECRET=<your-client-secret>

앱에서 Azure 서비스에 인증

Azure ID 라이브러리는 다양한 시나리오 및 Microsoft Entra 인증 흐름에 대해 다양한 TokenCredential 구현을 제공합니다. 로컬 환경 및 프로덕션 환경에서 서비스 주체 사용 시 EnvironmentCredential를 사용하십시오. 이 시나리오 EnvironmentCredential 에서는 환경 변수를 AZURE_CLIENT_IDAZURE_TENANT_ID읽고 AZURE_CLIENT_SECRET Azure에 연결할 애플리케이션 서비스 주체 정보를 가져옵니다.

  1. 애플리케이션에 azidentity 패키지를 추가합니다.

    go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
    
  2. 앱에서 Azure SDK 클라이언트 개체를 만드는 Go 코드의 경우 다음을 수행하려고 합니다.

    1. azidentity 패키지를 가져옵니다.
    2. 인스턴스를 만듭니다 EnvironmentCredential .
    3. Azure SDK 클라이언트 생성자에 인스턴스를 전달합니다.

    다음 코드 세그먼트는 예제를 보여줍니다.

    import (
    	"context"
    	"os"
    
    	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
    )
    
    const (
    	account       = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
    	containerName = "sample-container"
    	blobName      = "sample-blob"
    	sampleFile    = "path/to/sample/file"
    )
    
    func main() {
    	// create a credential
    	cred, err := azidentity.NewEnvironmentCredential(nil)
    	if err != nil {
    	  // TODO: handle error
    	}
    
    	// create a client for the specified storage account
    	client, err := azblob.NewClient(account, cred, nil)
    	if err != nil {
    	  // TODO: handle error
    	}
    
    	// TODO: perform some action with the azblob Client
    	// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
    }