소유 증명( DPoP ) 시연
DPoP 클라이언트가 공개-개인 키 쌍의 소유 증명(PoP)을 제공함으로써 발신자 제약형 지불 요청( OAuth ) 토큰을 획득할 수 있는 메커니즘을 제공합니다.
사양은 초안 상태입니다: https://datatracker.ietf.org/doc/html/draft-ietf-oauth-dpop-11.
DPoP HTTP
DPoP 헤더는 소유 증명을 위한 키 정보를 포함하는 서명된 JWT입니다.
DPoP JWT의 JOSE 헤더는 최소한 다음 매개변수를 포함해야 합니다.
| 매개변수 | 설명 |
|---|---|
| 타이프 | JWT의 유형입니다. 이 값은 "dpop+jwt" 여야 합니다. |
| 알크 | 서명 알고리즘입니다. 올바른 값은 RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512 입니다. |
| JWK | 공개 키를 나타내는 JWK (JSON Web Key) 입니다. 개인 키를 포함하지 않아야 합니다. |
JOSE 헤더 예:
{
"typ": "dpop+jwt",
"alg": "RS256",
"jwk": {
"kty": "RSA",
"n": "...",
"e": "AQAB"
}
}
DPoP JWT의 페이로드에는 최소한 다음 청구가 포함되어야 합니다.
| 청구 이름 | 설명 |
|---|---|
| jti | 이 JWT의 고유 ID입니다. |
| Htm | JWT가 첨부된 요청의 HTTP. |
| Htu | HTTP 대상 URI, 쿼리 및 조각 부분 제외. 이는 PAR (Pflush Authorization Request) 엔드포인트 또는 토큰 엔드포인트입니다. |
| iat | JWT의 작성 시간소인입니다. |
JWT 페이로드 예제:
{
"jti": "3765f59c-43cd-4cf8-8180-73bc9ae4ff3c",
"htm": "POST",
"htu": "https://<tenant-hostname>/oauth2/token",
"iat": 1661847227
}
DPoP JWT는 개인 키로 서명되어야 하며 서명은 JWT의 JOSE 헤더에서 제공되는 공개 키로 확인 가능해야 합니다. JWT는 30분 이상 유효하지 않아야 합니다. exp 청구가 없는 경우 이 JWT의 만기는 iat에 지정된 작성 시간소인의 30분 후로 가정됩니다.
JWT는 DPoP라는 헤더에서 전송됩니다.
요청 예제:
curl -ki https://<tenantId>/oauth2/token
-H "DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6Il..."
-d "grant_type=client_credentials&client_secret=<secret>&client_id=<clientId>"
요청 권한 부여
권한 부여 요청은 조회 매개변수 또는 POST 본문에 JSON웹 키의 지문을 포함합니다.
| 매개변수 | 설명 |
|---|---|
| dpop_jkt | 이 권한 요청과 연관될 JSON웹 키의 지문입니다. |
https://<tenantId>/oauth2/authorize?grant_type=authorization_code&client_id=<clientId>&redirect_uri=<redirect_uri>&dpop_jkt=<dpop_jkt>&...
이 요청에 대해 생성된 권한 코드는 해당 지문에 바인드되고 토큰 요청에서 유효성 검증에 사용됩니다. 이렇게 하면 토큰에 대한 코드를 교환할 때 토큰 요청에 서명하기 위해 동일한 개인 키가 없는 다른 사용자가 권한 코드를 도용하여 사용하는 것을 방지할 수 있습니다.
보안 방식으로 지문( dpop_jkt thumbprint)을 전송하려면 푸시된 인증 요청(PARDPoP, ) 또는 요청 객체를 함께 사용하는 것이 권장됩니다. 또는 PAR을 사용하여 dpop_jkt대신 DPoP 헤더를 사용할 수 있습니다. 세부사항은 위의 DPoP HTTP header 절을 참조하십시오. 밀어넣은 (push) 권한 부여 요청은 OpenID Connect 애플리케이션을 구성할 때 Require pushed
authorization request (PAR) 를 선택하여 강제 실행할 수 있습니다.
토큰 요청
DPoP HTTP 헤더를 사용하려면 액세스 및 새로 고침 토큰 요청이 필요합니다. 세부사항은 위의 DPoP HTTP
header 절을 참조하십시오.
권한 코드 플로우의 경우 이 JWK의 지문은 권한 요청 중에 전송된 JWK 지문 (dpop_jkt) 과 일치해야 합니다.
요청 예제:
curl -ki https://<tenantId>/oauth2/token
-H "DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6Il..."
-d "grant_type=client_credentials&client_secret=<secret>&client_id=<clientId>"
이 플로우를 수행한 결과는 소유 증명에 바인드되는 토큰 세트입니다. 이는 토큰 자체 검사를 사용하여 유효성을 검증할 수 있습니다.
토큰 검사
- token_type: bearer대신 이 값은 DPoP입니다.
- cnf: JWK 지문 확인 청구는 공개 키의 해시를 리턴합니다.
샘플 자체 검사 응답:
{
...,
"cnf": {
"jkt": "yrFAH18WFPml9e9IIo6rB_fLdFX1pdbMgIcd_fW_4aM="
},
"token_type": "DPoP",
...
}