소유 증명( 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>"

이 플로우를 수행한 결과는 소유 증명에 바인드되는 토큰 세트입니다. 이는 토큰 자체 검사를 사용하여 유효성을 검증할 수 있습니다.

토큰 검사

DPoP 액세스 토큰이 자체 검사되면 추가 청구가 리턴됩니다.
  • token_type: bearer대신 이 값은 DPoP입니다.
  • cnf: JWK 지문 확인 청구는 공개 키의 해시를 리턴합니다.
토큰을 자체 검사하는 클라이언트는 자체 검사 응답에서 cnf jkt 청구에 대한 공개 키의 해시를 비교하여 액세스 토큰의 DPoP 바인딩을 유효성 검증할 것으로 예상됩니다.

샘플 자체 검사 응답:


{
    ...,
    "cnf": {
        "jkt": "yrFAH18WFPml9e9IIo6rB_fLdFX1pdbMgIcd_fW_4aM="
    },
    "token_type": "DPoP",
    ...
}