Microsoft ID 플랫폼 애플리케이션 인증 인증서 자격 증명

Microsoft ID 플랫폼을 사용하면 애플리케이션이 클라이언트 암호를 사용할 수 있는 모든 위치(예: OAuth 2.0 클라이언트 자격 증명 부여 흐름, OBO(On-Behalf-Of) 흐름)에서 자체 자격 증명을 인증에 사용할 수 있습니다.

애플리케이션이 인증에 사용할 수 있는 자격 증명의 한 가지 형태는 애플리케이션에서 소유한 인증서로 서명된 JWT(JSON Web Token) 어설션입니다. private_key_jwt 클라이언트 인증 옵션에 대한 OpenID Connect 사양에 설명되어 있습니다.

다른 ID 공급자가 발급한 JWT를 애플리케이션에 대한 자격 증명으로 사용하는 데 관심이 있는 경우 페더레이션 정책을 설정 하는 방법에 대 한 워크로드 ID 페더레이션을 참조하세요.

어설션 형식

어설션을 계산하려면 선택한 언어로 많은 JWT 라이브러리 중 하나를 사용할 수 있으며, MSAL에서 .WithCertificate()를 사용하여 이를 지원할 수 있습니다. 이 정보는 헤더, 클레임, 서명으로 구성된 토큰으로 전달됩니다.

매개 변수 설명
alg RS256이어야 함
typ JWT여야 함
x5t X.509 인증서의 DER 인코딩의 Base64url로 인코딩된 SHA-1 지문입니다. 예를 들어 X.509 인증서 해시가 84E05C1D98BCE3A5421D225B140B36E86A3D5534(16진수)인 경우 x5t 클레임은 hOBcHZi846VCHSJbFAs26Go9VTQ(Base64url)입니다.

클레임(페이로드)

클레임 유형 설명
aud https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token "aud"(대상) 클레임은 JWT가 대상으로 하는 수신자(여기서는 Microsoft Entra ID)를 식별합니다. RFC 7519, 섹션 4.1.3을 참조하세요. 이 경우 해당 수신자는 로그인 서버(login.microsoftonline.com)입니다.
exp 1601519414 "exp"(만료 시간) 클레임은 JWT가 그 이후에는 처리를 허용하지 않아야 하는 만료 시간을 식별합니다. RFC 7519, 섹션 4.1.4를 참조하세요. 이렇게 하면 그 때까지 어설션을 사용할 수 있으므로 nbf 이후 최대한 짧게 5~10분간 유지합니다. Microsoft Entra ID는 현재 시간에 제한을 exp 두지 않습니다.
iss {ClientID} "Iss"(발급자) 클레임은 JWT를 발급한 보안 주체(이 경우 클라이언트 애플리케이션)를 식별합니다. GUID 애플리케이션 ID를 사용합니다.
jti (GUID) "jti"(JWT ID) 클레임은 JWT에 대한 고유 식별자를 제공합니다. 식별자 값은 동일한 값 이 실수로 다른 데이터 개체에 할당될 가능성이 무시할 수 있는 방식으로 할당되어야 합니다 . 애플리케이션에서 여러 발급자를 사용하는 경우 다른 발급자가 생성한 값 간에도 충돌을 방지해야 합니다. "jti" 값은 대/소문자를 구분하는 문자열입니다. RFC 7519, 섹션 4.1.7
nbf 1601519114 "nbf"(not before) 클레임은 JWT가 그 이전에는 처리를 허용하지 않아야 하는 시간을 식별합니다. RFC 7519, 섹션 4.1.5 현재 시간을 사용하는 것이 적절합니다.
sub {ClientID} "Sub"(주체) 클레임은 JWT의 주체(이 경우에는 애플리케이션)도 식별합니다. iss와 동일한 값을 사용합니다.
iat 1601519114 "iat"(발급 시간) 클레임은 JWT를 발급한 시간을 식별합니다. 이 클레임은 JWT의 기간을 결정하는 데 사용할 수 있습니다. RFC 7519, 섹션 4.1.5

서명

서명은 JSON Web Token RFC7519 사양에 설명된 대로 인증서를 적용하여 계산됩니다.

디코딩된 JWT 어설션 예제

{
  "alg": "RS256",
  "typ": "JWT",
  "x5t": "gx8tGysyjcRqKjFPnd7RFwvwZI0"
}
.
{
  "aud": "https: //login.microsoftonline.com/contoso.onmicrosoft.com/oauth2/v2.0/token",
  "exp": 1484593341,
  "iss": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
  "jti": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
  "nbf": 1484592741,
  "sub": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
.
"A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u..."

인코딩된 JWT 어설션 예제

다음 문자열은 인코딩된 어설션의 예입니다. 자세히 살펴보면 세 개의 섹션이 점(.)으로 구분된 것을 알 수 있습니다.

  • 첫 번째 섹션은 ‘헤더’를 인코딩합니다.
  • 두 번째 섹션은 ‘클레임’(페이로드)을 인코딩합니다.
  • 마지막 섹션은 처음 두 섹션 콘텐츠의 인증서로 계산된 ‘서명’입니다.
"eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJhdWQiOiJodHRwczpcL1wvbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbVwvam1wcmlldXJob3RtYWlsLm9ubWljcm9zb2Z0LmNvbVwvb2F1dGgyXC90b2tlbiIsImV4cCI6MTQ4NDU5MzM0MSwiaXNzIjoiOTdlMGE1YjctZDc0NS00MGI2LTk0ZmUtNWY3N2QzNWM2ZTA1IiwianRpIjoiMjJiM2JiMjYtZTA0Ni00MmRmLTljOTYtNjVkYmQ3MmMxYzgxIiwibmJmIjoxNDg0NTkyNzQxLCJzdWIiOiI5N2UwYTViNy1kNzQ1LTQwYjYtOTRmZS01Zjc3ZDM1YzZlMDUifQ.
Gh95kHCOEGq5E_ArMBbDXhwKR577scxYaoJ1P{a lot of characters here}KKJDEg"

Microsoft ID 플랫폼에 인증서 등록

다음 방법 중 하나를 사용하여 AMicrosoft Entra 관리 센터를 통해 Microsoft ID 플랫폼에서 클라이언트 애플리케이션과 인증서 자격 증명을 연결할 수 있습니다.

인증서 파일 업로드

클라이언트 애플리케이션의 앱 등록 탭에서 다음을 수행합니다.

  1. 인증서 및 비밀>인증서를 선택합니다.
  2. 인증서 업로드를 선택하고 업로드할 인증서 파일을 선택합니다.
  3. 추가를 선택합니다. 인증서가 업로드되고 지문, 시작 날짜 및 만료 값이 표시됩니다.

애플리케이션 매니페스트 업데이트

인증서를 획득한 후 다음 값을 계산합니다.

  • $base64Thumbprint - Base64로 인코딩된 인증서 해시 값
  • $base64Value - Base64로 인코딩된 인증서 원시 데이터

애플리케이션 매니페스트에서 키를 식별하는 GUID를 제공합니다($keyId).

클라이언트 애플리케이션에 대한 Azure 앱 등록에서:

  1. 매니페스트를 선택하여 애플리케이션 매니페스트를 엽니다.

  2. 다음 스키마를 사용해서 keyCredentials 속성을 새 인증서 정보로 바꿉니다.

    "keyCredentials": [
        {
            "customKeyIdentifier": "$base64Thumbprint",
            "keyId": "$keyid",
            "type": "AsymmetricX509Cert",
            "usage": "Verify",
            "value":  "$base64Value"
        }
    ]
    
  3. 애플리케이션 매니페스트에 편집 내용을 저장한 다음, 매니페스트를 Microsoft ID 플랫폼에 업로드합니다.

    keyCredentials 속성은 다중 값이므로 풍부한 키 관리를 위해 여러 인증서를 업로드할 수 있습니다.

클라이언트 어설션 사용

클라이언트 어설션은 클라이언트 암호를 사용하는 모든 위치에서 사용할 수 있습니다. 예를 들어 인증 코드 흐름에서 client_secret을 전달하여 요청이 앱에서 제공됨을 증명할 수 있습니다. 이를 client_assertionclient_assertion_type 매개 변수로 바꿀 수 있습니다.

매개 변수 설명
client_assertion_type urn:ietf:params:oauth:client-assertion-type:jwt-bearer 인증서 자격 증명을 사용하고 있음을 나타내는 고정 값입니다.
client_assertion JWT 위에서 만든 JWT입니다.

다음 단계

MSAL.NET 라이브러리는 단일 코드 줄로 이 시나리오를 처리합니다.

GitHub의 Microsoft ID 플랫폼 코드 샘플을 사용하는 .NET 디먼 콘솔 애플리케이션은 애플리케이션이 인증에 자체 자격 증명을 사용하는 방법을 보여줍니다. 또한 New-SelfSignedCertificate PowerShell cmdlet을 사용하여 자체 서명된 인증서를 만드는 방법을 보여 줍니다. 샘플 리포지토리에서 앱 만들기 스크립트를 사용하여 인증서를 만들고, 지문 등을 계산할 수도 있습니다.