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 |
PS256이어야 합니다. |
typ |
JWT여야 함 |
x5t#s256 |
X.509 인증서의 DER 인코딩에 대한 Base64url로 인코딩된 SHA-256 지문입니다. |
클레임(페이로드)
클레임 유형 | 값 | 설명 |
---|---|---|
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 사양에 설명된 대로 인증서를 적용하여 계산됩니다. PSS 패딩을 사용합니다.
디코딩된 JWT 어설션 예제
{
"alg": "PS256",
"typ": "JWT",
"x5t#sha256": "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": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb"
}
.
"A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u..."
인코딩된 JWT 어설션 예제
다음 문자열은 인코딩된 어설션의 예입니다. 자세히 살펴보면 세 개의 섹션이 점(.
)으로 구분된 것을 알 수 있습니다.
- 첫 번째 섹션은 ‘헤더’를 인코딩합니다.
- 두 번째 섹션은 ‘클레임’(페이로드)을 인코딩합니다.
- 마지막 섹션은 처음 두 섹션 콘텐츠의 인증서로 계산된 ‘서명’입니다.
"eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJhdWQiOiJodHRwczpcL1wvbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbVwvam1wcmlldXJob3RtYWlsLm9ubWljcm9zb2Z0LmNvbVwvb2F1dGgyXC90b2tlbiIsImV4cCI6MTQ4NDU5MzM0MSwiaXNzIjoiOTdlMGE1YjctZDc0NS00MGI2LTk0ZmUtNWY3N2QzNWM2ZTA1IiwianRpIjoiMjJiM2JiMjYtZTA0Ni00MmRmLTljOTYtNjVkYmQ3MmMxYzgxIiwibmJmIjoxNDg0NTkyNzQxLCJzdWIiOiI5N2UwYTViNy1kNzQ1LTQwYjYtOTRmZS01Zjc3ZDM1YzZlMDUifQ.
Gh95kHCOEGq5E_ArMBbDXhwKR577scxYaoJ1P{a lot of characters here}KKJDEg"
Microsoft ID 플랫폼에 인증서 등록
다음 방법 중 하나를 사용하여 AMicrosoft Entra 관리 센터를 통해 Microsoft ID 플랫폼에서 클라이언트 애플리케이션과 인증서 자격 증명을 연결할 수 있습니다.
인증서 파일 업로드
클라이언트 애플리케이션의 앱 등록 탭에서 다음을 수행합니다.
- 인증서 및 비밀>인증서를 선택합니다.
- 인증서 업로드를 선택하고 업로드할 인증서 파일을 선택합니다.
- 추가를 선택합니다. 인증서가 업로드되고 지문, 시작 날짜 및 만료 값이 표시됩니다.
애플리케이션 매니페스트 업데이트
인증서를 획득한 후 다음 값을 계산합니다.
$base64Thumbprint
- Base64로 인코딩된 인증서 해시 값$base64Value
- Base64로 인코딩된 인증서 원시 데이터
애플리케이션 매니페스트에서 키를 식별하는 GUID를 제공합니다($keyId
).
클라이언트 애플리케이션에 대한 Azure 앱 등록에서:
매니페스트를 선택하여 애플리케이션 매니페스트를 엽니다.
다음 스키마를 사용해서 keyCredentials 속성을 새 인증서 정보로 바꿉니다.
"keyCredentials": [ { "customKeyIdentifier": "$base64Thumbprint", "keyId": "$keyid", "type": "AsymmetricX509Cert", "usage": "Verify", "value": "$base64Value" } ]
애플리케이션 매니페스트에 편집 내용을 저장한 다음, 매니페스트를 Microsoft ID 플랫폼에 업로드합니다.
keyCredentials
속성은 다중 값이므로 풍부한 키 관리를 위해 여러 인증서를 업로드할 수 있습니다.
클라이언트 어설션 사용
클라이언트 어설션은 클라이언트 암호를 사용하는 모든 위치에서 사용할 수 있습니다. 예를 들어 인증 코드 흐름에서 client_secret
을 전달하여 요청이 앱에서 제공됨을 증명할 수 있습니다. 이를 client_assertion
및 client_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을 사용하여 자체 서명된 인증서를 만드는 방법을 보여 줍니다. 샘플 리포지토리에서 앱 만들기 스크립트를 사용하여 인증서를 만들고, 지문 등을 계산할 수도 있습니다.