Microsoft.Identity.Web에 대한 자격 증명 개요

애플리케이션이 Microsoft ID 플랫폼 인증하면 해당 ID를 증명하는 자격 증명이 표시됩니다. Microsoft. Identity.Web은 다양한 환경 및 보안 요구 사항에 적합한 여러 자격 증명 유형을 지원합니다.

이 문서는 사용 가능한 자격 증명 유형을 이해하고, 시나리오에 적합한 자격 증명을 선택하고, 애플리케이션에서 자격 증명을 구성하는 데 도움이 됩니다.

자격 증명 선택이 중요한 이유

애플리케이션에서 사용하는 자격 증명은 보안 상태, 운영 오버헤드 및 배포 유연성에 직접적인 영향을 줍니다. 잘못 선택된 자격 증명은 비밀을 노출하거나, 수동 회전을 요구하거나, 애플리케이션을 실행할 수 있는 위치를 제한할 수 있습니다.

Microsoft. Identity.Web은 다음을 수행할 수 있는 통합 구성 모델을 제공합니다.

  • 자동 대체를 사용하여 여러 자격 증명을 지정합니다.
  • 애플리케이션 코드를 수정하지 않고 자격 증명 형식을 변경합니다.
  • 환경별로 다른 자격 증명(개발, 스테이징, 프로덕션)을 사용합니다.

지원되는 자격 증명 형식

Microsoft. Identity.Web은 기밀 클라이언트 애플리케이션에 대한 세 가지 범주의 자격 증명을 지원합니다.

인증서 없는 자격 증명(페더레이션 ID 자격 증명 + 관리 ID)

인증서 없는 자격 증명은 FIC(페더레이션 ID 자격 증명)와 결합된 Azure 관리 ID를 사용하여 비밀 또는 인증서를 관리하지 않고 애플리케이션을 인증합니다. Azure 자격 증명 수명 주기를 완전히 처리합니다.

작동 방식: 애플리케이션은 해당 관리 ID를 사용하여 토큰을 가져오며, Microsoft ID 플랫폼 미리 구성된 페더레이션 트러스트를 통해 애플리케이션의 ID 증명으로 허용합니다.

가장 적합함: Azure에서 실행 중인 프로덕션 워크로드.

인증서 없는 인증에 대해 자세히 알아보기

인증서

인증서는 강력한 비대칭 키 기반 인증을 제공합니다. 애플리케이션은 인증서의 프라이빗 키를 사용하여 어설션에 서명하여 ID를 증명합니다. Microsoft. Identity.Web은 여러 원본에서 인증서를 로드할 수 있습니다.

  • Azure Key Vault - 액세스 정책이 있는 중앙 집중식 관리형 인증서 스토리지입니다.
  • Certificate Store - Windows 인증서 저장소 (CurrentUser 또는 LocalMachine).
  • 파일 경로 - 디스크의 인증서 파일(.pfx 형식).
  • Base64 인코딩 - 구성에 직접 포함된 인증서입니다.

최적 대상: 인증서 없는 자격 증명을 사용할 수 없는 프로덕션 워크로드 또는 하이브리드 환경.

인증서 자격 증명에 대해 자세히 알아보기

클라이언트 암호

클라이언트 비밀은 애플리케이션이 Microsoft ID 플랫폼 제공하는 공유 문자열입니다. 구성하기에 가장 간단한 자격 증명 형식이지만 가장 약한 보안을 제공합니다.

최적 대상: 로컬 개발 및 테스트만 가능합니다.

클라이언트 비밀에 대해 자세히 알아보기


올바른 자격 증명 유형 선택

다음 의사 결정 트리를 사용하여 시나리오에 적합한 자격 증명 유형을 결정합니다.

Is your application running on Azure?
├── Yes
│   ├── Can you use Managed Identity?
│   │   ├── Yes → Use certificateless credentials (recommended)
│   │   └── No → Use certificates from Azure Key Vault
└── No
    ├── Is this a production environment?
    │   ├── Yes → Use certificates (Key Vault, Certificate Store, or file path)
    │   └── No → Use client secrets for development/testing

일반 지침

자격 증명 유형을 선택할 때 다음 원칙을 따릅니다.

  • 애플리케이션이 Azure 실행되면 인증서 없는 자격 증명을 선호합니다. 자격 증명 관리를 완전히 제거합니다.
  • 인증서 없는 자격 증명을 사용할 수 없는 경우 인증서를 사용합니다. 가능하면 Azure Key Vault 저장합니다.
  • 클라이언트 비밀을 개발 환경으로 제한합니다. 프로덕션 배포에서 클라이언트 비밀을 사용하지 마세요.

자격 증명 유형 비교

다음 표에서는 자격 증명 형식 간의 주요 차이점을 요약합니다.

특성 인증서 없는(FIC + MI) 인증서 클라이언트 암호
보안 수준 가장 높음 높음 Low
비밀 노출 위험 없음 - 누출 비밀 없음 낮음 - 프라이빗 키 보호됨 높음 - 문자열은 복사할 수 있습니다.
회전 필요 아니요 - Azure 수명 주기를 관리합니다. 예 - 인증서 만료 전 예 - 비밀 만료 전
회전 복잡성 없음 중간 - 인증서 업데이트, 다시 배포 낮음 - 업데이트 문자열, 다시 배포
Azure 포털 설정 관리 ID + FIC 트러스트 앱 등록에 인증서 업로드 앱 등록에서 비밀 생성
적합한 환경 Azure 프로덕션 모든 프로덕션 환경 개발 및 테스트만
인프라 종속성 컴퓨팅 리소스 Azure 인증서 저장소 또는 Key Vault 없음
규정 준수 제로 트러스트 요구 사항 충족 대부분의 규정 준수 프레임워크를 충족합니다. 보안 정책을 충족하지 못할 수 있음

appsettings.json 자격 증명 구성

Microsoft. Identity.Web은 구성에서 ClientCredentials 배열을 사용하여 하나 이상의 자격 증명을 지정합니다. 배열의 각 항목에는 자격 증명의 원본 위치를 나타내는 속성이 포함 SourceType 됩니다.

구성 구조

다음 예제에서는 단일 인증서 없는 자격 증명을 사용하여 최소 구성을 보여 냅니다.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCredentials": [
      {
        "SourceType": "SignedAssertionFromManagedIdentity",
        "ManagedIdentityClientId": "user-assigned-managed-identity-client-id"
      }
    ]
  }
}

SourceType 값

SourceType 속성은 CredentialSource 열거형에 해당하며 Microsoft.Identity.Web이 자격 증명을 로드하는 방법을 결정합니다.

SourceType 값 자격 증명 형식 설명
SignedAssertionFromManagedIdentity 인증서 없는 관리 ID를 사용하여 서명된 어설션을 가져옵니다. Azure 프로덕션에 권장합니다.
KeyVault 인증서 URI를 통해 Azure Key Vault 인증서를 로드합니다.
StoreWithThumbprint 인증서 지문으로 Windows 인증서 저장소에서 인증서를 로드합니다.
StoreWithDistinguishedName 인증서 주체 고유 이름으로 Windows 인증서 저장소에서 인증서를 로드합니다.
Path 인증서 디스크의 .pfx 파일에서 인증서를 로드합니다.
Base64Encoded 인증서 구성에서 Base64로 인코딩된 문자열에서 인증서를 로드합니다.
ClientSecret 클라이언트 암호 클라이언트 비밀 문자열을 사용합니다.
AutoDecryptKeys 토큰 암호 해독 암호화된 토큰의 암호를 해독하기 위한 키를 자동으로 검색합니다.
SignedAssertionFilePath Federated 파일 경로(Kubernetes 워크로드 ID의 경우)에서 서명된 어설션을 읽습니다.

형식별 자격 증명 예제

다음 예제에서는 appsettings.json 및 C# 코드 (사용 가능한 경우) 각각의 자격 증명 유형을 설정하는 방법을 보여 줍니다.

인증서 없는(관리 ID)

클라이언트 ID를 지정하여 사용자 지정 관리 ID를 사용합니다.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",
    "ClientCredentials": [
      {
        "SourceType": "SignedAssertionFromManagedIdentity",
        "ManagedIdentityClientId": "user-assigned-managed-identity-client-id"
      }
    ]
  }
}

시스템 할당 관리 ID의 경우 속성을 생략합니다 ManagedIdentityClientId .

{
  "AzureAd": {
    "ClientCredentials": [
      {
        "SourceType": "SignedAssertionFromManagedIdentity"
      }
    ]
  }
}

Azure Key Vault 인증서

자격 증명 모음 URL 및 인증서 이름을 지정하여 Azure Key Vault 저장된 인증서를 로드합니다.

{
  "AzureAd": {
    "ClientCredentials": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault.vault.azure.net",
        "KeyVaultCertificateName": "your-certificate-name"
      }
    ]
  }
}

C#에서 도우미 메서드를 CredentialDescription 사용할 수도 있습니다.

var credential = CredentialDescription.FromKeyVault(
    "https://your-keyvault.vault.azure.net",
    "your-certificate-name");

인증서 저장소의 인증서

지문으로 Windows 인증서 저장소에서 인증서를 로드합니다.

{
  "AzureAd": {
    "ClientCredentials": [
      {
        "SourceType": "StoreWithThumbprint",
        "CertificateThumbprint": "ABC123DEF456...",
        "CertificateStorePath": "CurrentUser/My"
      }
    ]
  }
}

새 인증서가 자동으로 선택되므로 인증서 회전을 간소화하는 고유 이름을 사용할 수도 있습니다.

{
  "AzureAd": {
    "ClientCredentials": [
      {
        "SourceType": "StoreWithDistinguishedName",
        "CertificateDistinguishedName": "CN=YourAppCertificate",
        "CertificateStorePath": "CurrentUser/My"
      }
    ]
  }
}

C#에서 도우미 메서드를 사용합니다.

// By thumbprint
var credential = CredentialDescription.FromCertificateStore(
    "CurrentUser/My",
    thumbprint: "ABC123DEF456...");

// By distinguished name (recommended for rotation)
var credential = CredentialDescription.FromCertificateStore(
    "CurrentUser/My",
    distinguishedName: "CN=YourAppCertificate");

파일 경로의 인증서

디스크의 파일에서 인증서를 .pfx 로드합니다.

{
  "AzureAd": {
    "ClientCredentials": [
      {
        "SourceType": "Path",
        "CertificateDiskPath": "/var/certs/app-cert.pfx",
        "CertificatePassword": "certificate-password"
      }
    ]
  }
}

경고

에 직접 appsettings.json인증서 암호를 저장하지 마세요. 중요한 값에는 ASP.NET Core 비밀 관리자, 환경 변수 또는 Azure Key Vault 사용합니다.

Base64로 인코딩된 인증서

인증서를 Base64로 인코딩된 문자열로 구성에 직접 포함:

{
  "AzureAd": {
    "ClientCredentials": [
      {
        "SourceType": "Base64Encoded",
        "Base64EncodedValue": "MIIKcQIBAzCCCi0..."
      }
    ]
  }
}

클라이언트 암호

개발 및 테스트를 위한 클라이언트 비밀 문자열을 지정합니다.

{
  "AzureAd": {
    "ClientCredentials": [
      {
        "SourceType": "ClientSecret",
        "ClientSecret": "your-client-secret"
      }
    ]
  }
}

주의

클라이언트 비밀은 개발 중에만 사용해야 합니다. 비밀을 소스 제어에 커밋하거나 프로덕션 환경에 배포하지 마세요.


대체와 함께 여러 자격 증명 사용

배열에서 여러 자격 증명을 ClientCredentials 지정할 수 있습니다. Microsoft. Identity.Web은 각 자격 증명을 순서대로 시도하고 현재 자격 증명이 실패하면 다음 자격 증명으로 돌아갑니다. 이 패턴은 여러 환경에서 실행되는 애플리케이션에 유용합니다.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",
    "ClientCredentials": [
      {
        "SourceType": "SignedAssertionFromManagedIdentity",
        "ManagedIdentityClientId": "your-managed-identity-client-id"
      },
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault.vault.azure.net",
        "KeyVaultCertificateName": "your-certificate-name"
      },
      {
        "SourceType": "ClientSecret",
        "ClientSecret": "development-only-secret"
      }
    ]
  }
}

이 예제에서:

  1. 애플리케이션은 먼저 관리 ID를 사용하여 인증서 없는 인증을 시도합니다(Azure 작업).
  2. 관리 ID를 사용할 수 없는 경우 Key Vault 인증서로 돌아갑니다.
  3. 최후의 수단으로 클라이언트 암호를 사용합니다(로컬 개발용).

이 방법을 사용하면 코드를 변경하지 않고도 환경에서 동일한 구성 파일을 사용할 수 있습니다.


코드에서 자격 증명 구성

프로그램에서 Program.cs 또는 Startup.cs에서 자격 증명을 구성할 수도 있습니다.

using Microsoft.Identity.Web;

builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("MyApi", builder.Configuration.GetSection("MyApi"))
    .AddDistributedTokenCaches();

// Or configure credentials programmatically
builder.Services.Configure<MicrosoftIdentityOptions>(options =>
{
    options.ClientCredentials = new[]
    {
        new CredentialDescription
        {
            SourceType = CredentialSource.SignedAssertionFromManagedIdentity,
            ManagedIdentityClientId = "your-managed-identity-client-id"
        }
    };
});

토큰 암호 해독 자격 증명

인증을 위한 클라이언트 자격 증명 외에 Microsoft. Identity.Web은 토큰 암호 해독에 대한 자격 증명도 지원합니다. 애플리케이션이 암호화된 토큰을 수신하고 암호를 해독해야 하는 경우 토큰 암호 해독 자격 증명을 사용합니다.

토큰 암호 해독 자격 증명은 클라이언트 자격 증명과 동일한 SourceType 값 및 구성 패턴을 사용하지만 배열에 TokenDecryptionCredentials 지정됩니다.

{
  "AzureAd": {
    "TokenDecryptionCredentials": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault.vault.azure.net",
        "KeyVaultCertificateName": "token-decryption-cert"
      }
    ]
  }
}

토큰 암호 해독에 대해 자세히 알아보기


모범 사례

애플리케이션에 대한 자격 증명을 구성할 때 다음 권장 사항을 염두에 두세요.

프로덕션 환경에서 인증서 없는 자격 증명을 선호합니다. 비밀 노출 위험을 제거하고 회전 오버헤드를 제거합니다. 애플리케이션이 관리 ID를 지원하는 Azure 컴퓨팅 리소스에서 실행 될 때마다 사용합니다.

이식성을 위해 자격 증명 대체를 사용합니다. 애플리케이션이 코드 변경 없이 개발, 스테이징 및 프로덕션에서 작동하도록 우선 순위에 따라 여러 자격 증명을 구성합니다.

프로덕션 환경에서는 클라이언트 비밀을 사용하지 마세요. 클라이언트 비밀은 로그, 구성 파일 또는 소스 제어를 통해 누출될 수 있습니다. 대신 인증서 또는 인증서 없는 자격 증명을 사용합니다.

중요한 값을 구성 파일 외부에 저장합니다. 인증서 암호 및 클라이언트 비밀에는 Azure Key Vault, 환경 변수 또는 ASP.NET Core Secret Manager를 사용합니다. 중요한 값을 소스 제어에 커밋하지 마세요.

만료되기 전에 인증서를 회전합니다. 인증서 만료 날짜를 모니터링하고 회전 프로세스를 설정합니다. Azure Key Vault 인증서 갱신을 자동화할 수 있습니다.

인증서 스토리지에 Azure Key Vault 사용합니다. Key Vault 인증서에 대한 중앙 집중식 관리, 액세스 정책, 감사 로깅 및 자동 회전을 제공합니다.