다음을 통해 공유


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 인증서 해시가 AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00(16진수)인 경우 x5t 클레임은 A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u(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": "A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u"
}
.
{
  "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을 사용하여 자체 서명된 인증서를 만드는 방법을 보여 줍니다. 샘플 리포지토리에서 앱 만들기 스크립트를 사용하여 인증서를 만들고, 지문 등을 계산할 수도 있습니다.