소유권 증명( DPoP ) 제시

DPoP 클라이언트가 공개-개인 키 쌍에 대한 소유권 증명을 제시함으로써 발신자 제한형 인증 토큰( OAuth )을 획득할 수 있는 메커니즘을 제공합니다.

이 사양은 현재 초안 단계입니다: https://datatracker.ietf.org/doc/html/draft-ietf-oauth-dpop-11.

DPoP HTTP 헤더

DPoP 헤더는 소유권 증명을 위한 핵심 정보를 포함하는 서명된 JWT입니다.

DPoP JWT의 JOSE 헤더에는 최소한 다음 매개변수가 포함되어야 합니다:

매개변수 설명
유형 JWT의 유형. 이 값은 "dpop+jwt"여야 합니다.
alg 서명 알고리즘. 유효한 값은 다음과 같습니다: RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512
JWK 공개 키를 나타내는 JSON 웹 키(JWK). 개인 키를 포함해서는 안 됩니다.

JOSE 헤더 예시:

{
  "typ": "dpop+jwt",
  "alg": "RS256",
  "jwk": {
    "kty": "RSA",
    "n": "...",
    "e": "AQAB"
  }
}

DPoP JWT의 페이로드에는 최소한 다음 클레임이 포함되어야 합니다:

청구 이름 설명
jti 이 JWT의 고유 식별자.
htm JWT가 첨부된 요청의 ` HTTP ` 메서드.
htu 쿼리 및 프래그먼트 부분이 제외된 HTTP 대상 URI. 이것은 Pushed Authorization Request(PAR) 엔드포인트 또는 토큰 엔드포인트일 것입니다.
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분을 초과해서는 안 됩니다. iat클레임이 없는 exp 경우, 이 JWT의 만료 시간은 에 명시된 생성 타임스탬프로부터 30분 후로 간주됩니다.

DPoPJWT는 라는 이름의 헤더에 포함되어 전송됩니다.

요청 예시:


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>&...

이 요청에 대해 생성된 인증 코드는 해당 썸프린트에 바인딩되며, 토큰 요청 시 유효성 검사에 사용됩니다. 이를 통해 토큰 요청 시 코드를 토큰으로 교환할 때, 동일한 개인 키를 보유하지 않은 제3자가 인증 코드를 탈취하여 사용하는 것을 방지할 수 있습니다.

지문(thumbprint)을 dpop_jkt 안전하게 전송하려면 Pushed Authorization Requests(PAR) 또는 요청 객체를 DPoP, 와 함께 사용하는 것이 좋습니다. dpop_jkt또는 PAR을 사용할 경우,. 대신 ` DPoP ` 헤더를 사용할 수 있습니다. 자세한 내용은 위 항목을 참조하십시오 DPoP HTTP header . 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 액세스 토큰을 검사하면 추가 클레임이 반환됩니다.
  • DPoPtoken_type: 대신 이 값은 가 bearer 될 것입니다.
  • cnf: JWK 엄지손가락 지문 확인 요청은 공개 키의 해시를 반환합니다.
토큰을 검사하는 클라이언트는 공개 키의 해시와 검사 응답에 포함된 jkt 클레임을 cnf 비교하여 액세스 토큰의 DPoP 바인딩을 검증해야 합니다.

내성 응답 예시:


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