| Internet-Draft | oauth-cimd-sw-stmt-issuance | November 2026 |
| McGuinness | Expires 10 May 2027 | [Page] |
RFC 7591 defines how a client presents a software statement and how a registration endpoint consumes it, but not how the client obtains one. This specification defines OAuth 2.0 flows for issuing a software statement to a client identified by a Client ID Metadata Document (CIMD) and not registered with the authorization server.¶
A client holding an initial access token that authorizes issuance, or a statement it can renew, uses OAuth 2.0 Token Exchange (RFC 8693) without a redirect. A client can instead use a redirect flow: the authorization endpoint returns a short-lived software_statement_code, which the client redeems through a new token endpoint grant. In both flows, a completed decision returns a statement, and a pending decision uses Deferred Token Response and polling. The statement never appears in an authorization response URL.¶
The client presents the statement at registration or at runtime, or publishes it for servers to pull. A companion specification defines the statement, its validation, and its runtime consumption.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 10 May 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
[RFC7591] standardizes the consumption of a software statement, a signed JWT asserting client metadata (Section 2.3 of [RFC7591]), but not its issuance. Issuance today relies on manual provisioning or proprietary processes. The UK Open Banking Directory [UK-OPEN-BANKING] and the Australian Consumer Data Right Register [AU-CDR] each built a central issuer, yet a client needs a separate integration for each.¶
[STATEMENT] profiles that statement to carry no client metadata and instead vouch for the exact octets of a Client ID Metadata Document (CIMD), and defines its validation and consumption. This specification defines how a client obtains one, through OAuth token exchange (Section 5) or a redirect flow (Section 6). An issuer whose review cannot complete within a request can defer its response under [DTR].¶
A statement makes one issuer's decision portable to the authorization servers in its audience that trust the issuer ([STATEMENT]). If the trust decision is local to one authorization server, an [RFC7591] initial access token for registration, pre-registration [CIMD], or approval-based registration [APPROVAL-DCR] can register the client directly.¶
Approval workflow, approver identity, external approval integration, acceptance of any particular issuer, issuer discovery, and issuance that a publisher's backend authorizes on a client's behalf are out of scope. This specification does not authenticate such a backend. This specification extends [STATEMENT], which does not depend on it.¶
A client that holds an initial access token authorizing issuance, or a statement it can renew, uses token exchange at the token endpoint without a user agent (Section 5). A client can instead initiate the redirect flow at the authorization endpoint (Section 6) and redeem the resulting software statement code at the token endpoint.¶
The issuer fetches and snapshots the client's CIMD (Section 3.1), decides whether to issue, and signs the statement. The client carries the statement to trusting authorization servers in its audience, at registration ([REGISTRATION]) or at runtime ([STATEMENT]).¶
+--------------------------+
| Client ID Metadata |
| Document (client_id URL) |
+--------------------------+
^ ^
hosts | | fetches and
| | snapshots
+----------+ | | +---------------+
| +------+ +------+ Issuing |
| Client | | Authorization |
| |--(1) software statement request -->| Server |
| |<-(2) software statement -----------| (approval) |
+----------+ (signed JWT) +---------------+
|
| (3) presentation, publication, or registration
v
+---------------+ +---------------+ +---------------+
| Trusting | | Trusting | ... | Trusting |
| Authorization | | Authorization | | Authorization |
| Server 1 | | Server 2 | | Server M |
+---------------+ +---------------+ +---------------+
¶
+--------+ +----------------------+
| Client | | Authorization Server |
+--------+ +----------------------+
| |
| (A) Authorization request |
| response_type=software_statement_code |
| client_id=<metadata document URL> |
| code_challenge, [audience], [dpop_jkt] |
|------------------------------------------------>|
| |
| (B) Software statement code response |
| (software_statement_code, state, iss) |
|<------------------------------------------------|
| |
| (C) Redemption |
| (software_statement_code, code_verifier, |
| completion_mode=deferred) |
|------------------------------------------------>|
| |
| (D) Software statement response or |
| deferred response (deferral_code) |
|<------------------------------------------------|
| |
| (E) Poll(s) (deferral_code), if deferred |
|------------------------------------------------>|
| pending state or final response |
|<------------------------------------------------|
¶
At (A), the authorization server validates the request, performs any user-agent interaction or initiates an approval workflow, and returns a software statement code at (B).¶
At (C), the client redeems the code with its Proof Key for Code Exchange (PKCE) verifier. The response at (D) carries the statement or a [DTR] deferral_code, with which the client polls at (E). Errors follow [RFC6749] and [DTR].¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
This specification uses terminology defined in [RFC6749], [RFC7591], [CIMD], and [DTR], and the terms defined in Section 2 of [STATEMENT]. The issuer is an authorization server, and "authorization server" alone means the issuer.¶
This specification defines the following terms:¶
The short-lived, single-use artifact returned by the software statement code response (Section 7.1) and redeemed at the token endpoint (Section 8).¶
An issuer that advertises true for deferred_token_response_supported (Section 12) and so can defer a decision (Section 9).¶
The client_id parameter in every request defined by this specification MUST be a client identifier URL conforming to [CIMD]. The authorization server MUST obtain and validate the document at that URL according to [CIMD].¶
In the redirect flow, a client identifier whose CIMD cannot be retrieved or validated, including one whose CIMD is rejected for duplicate member names (Section 3.1), is invalid for the purposes of Section 4.1.2.1 of [RFC6749].¶
The client authenticates to the token endpoint with a method its CIMD permits (Section 2 of [STATEMENT]), using the related key metadata in that document. The authorization server determines whether the client is a public or a confidential client from the methods the document permits and from its own policy, as Section 5.6 of [STATEMENT] determines the model for a reviewed document:¶
A confidential client MUST authenticate with a permitted method other than none that the authorization server supports and its policy allows.¶
If the document permits no method that the authorization server supports and its policy allows, the authorization server rejects the request as Section 5 of [CIMD] requires.¶
A public client binds its requests with Demonstrating Proof of Possession (DPoP) [RFC9449]: in the redirect flow through the dpop_jkt parameter (Section 6), and in the token exchange profile (Section 5) by a DPoP proof, which a public client MUST include on the exchange request. A confidential client MAY use DPoP in addition to its client authentication method.¶
CIMDs can change while a request is pending. For each request, the authorization server retrieves and validates the document (Section 3) and computes the metadata digest of the exact octets it retrieved, as Section 3.1 of [STATEMENT] requires. These octets and their digest are the request's metadata snapshot. A deferral created at redemption is bound to the code's snapshot and audience. The authorization server MUST bind the snapshot and the requested audience to each software statement code and deferral it creates, and issues the statement over that snapshot.¶
The authorization server MAY retrieve the document again before issuing the software statement. If it does so and the digest differs, it MUST either re-evaluate the request under the new document, binding the new document as the snapshot, or reject the request. This applies even if the change touches no member its policy examines. A statement over a superseded snapshot fails the digest comparison (Section 5.2 of [STATEMENT]). Replacing the snapshot is the authorization server's own action and changes no parameter of the request, such as the requested audience.¶
The authorization server MUST NOT combine values from different document versions.¶
Replacing the snapshot does not alter the sender-constraint context fixed for a deferral at origination ([DTR]). If a replacement snapshot no longer authorizes the key material behind that context, for example because the client-authentication key is absent from the new document, the authorization server MUST invalidate the deferral. The client then makes a new request under its current keys.¶
The authorization server MUST reject a document containing duplicate object member names (Section 5.2 of [STATEMENT]).¶
An issuer can require jwks inline (Section 13.2 of [STATEMENT]).¶
[CIMD] permits a document to carry a software_statement member. An issuer evaluates the document as served and MUST NOT refuse a document because it carries the member. Trusting authorization servers ignore a statement embedded there (Section 3 of [STATEMENT]), and refusing would leave a client whose document embeds a statement unable to renew it.¶
The audience parameter of an authorization request (Section 6) or token exchange (Section 5) names a target service at which the client intends to use the statement, with the semantics of Section 2.1 of [RFC8693]. The parameter can be repeated to request several. Each value MUST be an authorization server issuer identifier as defined by [RFC8414]. Values MUST NOT be duplicated, and order is insignificant.¶
The authorization server selects the final audience according to policy. It MUST NOT place in the statement's aud claim any value the request did not carry, except as Section 5.2 provides.¶
If no requested audience is acceptable, the authorization server MUST reject the request with the invalid_target error code, as defined by [RFC8707] at the authorization endpoint and by Section 2.2.2 of [RFC8693] at the token endpoint. An authorization server whose policy requires a restricted audience rejects a request carrying none, other than a renewal whose subject statement names an audience, with the same error.¶
These audience semantics apply only to software statement requests and do not affect proprietary uses of the parameter for access-token targeting.¶
A software statement request does not grant access to a protected resource, and it asks for a statement rather than presenting one. An authorization request, software statement code redemption, or token exchange under this specification MUST NOT contain the scope parameter, the resource parameter ([RFC8707]), the authorization_details parameter ([RFC9396]), or the software_statement parameter (Section 5.4 of [STATEMENT]). The authorization server MUST reject a request containing any of them with the invalid_request error code. In an authorization request or token exchange, the audience parameter (Section 4.1) is not prohibited: it describes the requested artifact rather than requesting access. Code redemption prohibits it (Section 8).¶
A client that already holds a token carrying issuance authority MAY exchange that token for a statement using OAuth 2.0 Token Exchange [RFC8693] instead of the redirect flow (Section 6).¶
The client sends a token exchange request as defined in Section 2.1 of [RFC8693], with the following parameters:¶
requested_token_type:REQUIRED. The value MUST be urn:ietf:params:oauth:token-type:software-statement.¶
subject_token and subject_token_type:REQUIRED. One of the following:¶
First issuance. An initial access token, presented with a subject_token_type of urn:ietf:params:oauth:token-type:access_token: an authorization credential, issued out of band by this authorization server, that pre-authorizes software statement issuance, analogous to the initial access token of [RFC7591] (Section 5.1). The credential itself is deployment-defined.¶
Renewal. A software statement this authorization server previously issued with a sub claim equal to the request's client_id, presented with a subject_token_type of urn:ietf:params:oauth:token-type:software-statement (Section 5.2).¶
client_id:REQUIRED. The client identifier URL described in Section 3.¶
audience:OPTIONAL. The requested audience (Section 4.1), bounded on renewal as Section 5.2 requires.¶
completion_mode:As defined for software statement code redemption (Section 8).¶
The request MUST NOT contain the actor_token or actor_token_type parameters, and the prohibitions of Section 4.2 apply.¶
The client authenticates, and a public client constrains the request, as described in Section 3.¶
A DPoP proof on the exchange constrains any resulting deferral, and it protects the subject token only if that token is bound to the proof's key (Section 15.2).¶
The authorization server MUST validate the subject token before retrieving client-controlled metadata or enqueueing any processing. A subject token MUST result in the invalid_request error code (Section 2.2.2 of [RFC8693]) if any of the following holds:¶
It is invalid, revoked, or, for a statement, one that Section 5.2 forbids accepting.¶
It has expired, unless it is a prior software statement accepted under Section 5.2.¶
It does not authorize issuance for the presented client_id parameter.¶
An error response to a token exchange MUST NOT contain the subject token.¶
The exchange results in a software statement token response (Section 10), a deferral at a deferring issuer (Section 9), or the terminal denial of Section 10.1.¶
An initial access token presented under this profile:¶
MUST be time limited.¶
MUST be limited to the issuer.¶
MUST be bound to an exact client identifier URL or an explicitly authorized client identifier namespace.¶
MUST have at least 128 bits of entropy if it is opaque.¶
MUST be sender-constrained to a client key if it is reusable, for example through DPoP or mutual TLS, and the authorization server MUST verify that binding against the key the exchange request proves.¶
MUST be single-use if it is a bearer token.¶
The authorization server MUST enforce every restriction the token carries, such as on audiences or metadata, and MUST prevent replay beyond its permitted number of uses. A use is consumed when the authorization server commits to an outcome: issuing a statement, creating a deferral, or denying issuance. Concurrent presentations of a single-use token MUST NOT both be committed.¶
Issuance policy determines whether an initial access token authorizes the client only to request a statement or also authorizes its issuance.¶
A client renews by presenting its current or most recent software statement as the subject token. The authorization server MUST verify the following:¶
The authorization server issued the statement.¶
The statement's sub claim equals the request's client_id parameter.¶
The client authenticated with a key carried both by the document the statement's cimd_digest claim names and by the current document.¶
That authentication is the holder binding: without it, whoever held a copy of the statement could renew. To check the reviewed document's keys, an issuer offering renewal needs the octets of each document it issues a statement over (Section 13.4).¶
A client rotating keys inline renews while its document carries both the old and the new key. For a document naming jwks_uri, the binding is to whatever that location serves. A public client holds no such key and obtains a new statement through the redirect flow (Section 6).¶
A renewed statement MUST NOT be broader than the subject statement: its aud is within the requested audience narrowed to the subject statement's aud (or within that aud if the request names none), it carries any aud_tenant claim of the subject statement, and its statement_uses permits no use the subject statement does not. It is matched to the subject statement by iss and sub ([LIFECYCLE], [REGISTRATION]).¶
An issuer MUST NOT accept as the subject token a statement it has withdrawn, or one whose status it publishes as other than VALID ([LIFECYCLE]). Renewing such a statement would reissue the decision that withdrawal ended.¶
The authorization server MAY accept a statement that has expired, and SHOULD bound how long after expiry it will do so.¶
If the current document's digest equals the subject statement's cimd_digest, whether renewal requires fresh review is issuance policy. If the digests differ, the issuer MUST apply the decision it would apply to a first issuance for that document, and MUST NOT renew on the strength of the prior statement alone. Without this rule, whoever can change the document could obtain the issuer's signature over an unreviewed change.¶
The client redeems a software statement code by sending an HTTP POST request to the token endpoint using the application/x-www-form-urlencoded format with the following parameters:¶
grant_type:REQUIRED. The value MUST be urn:ietf:params:oauth:grant-type:software-statement.¶
software_statement_code:REQUIRED. The software statement code returned by the authorization endpoint.¶
redirect_uri:REQUIRED. The same redirection URI used in the authorization request.¶
client_id:REQUIRED. The same client identifier URL used in the authorization request.¶
code_verifier:REQUIRED. The PKCE verifier corresponding to the code_challenge in the authorization request.¶
completion_mode:REQUIRED at a deferring issuer, with a value that MUST include deferred. A deferring issuer rejects a request whose completion_mode is absent or omits deferred with invalid_request.¶
The prohibitions of Section 4.2 apply. The request MUST NOT contain the audience parameter, which was bound at the authorization endpoint. A request containing it is rejected with invalid_request.¶
The client authenticates according to Section 3. When the dpop_jkt parameter was included in the authorization request, the client MUST send a DPoP proof for the token endpoint using the same key.¶
The authorization server MUST validate the software statement code and all of its bindings before processing the request. An invalid, expired, previously used, or incorrectly bound code MUST result in an invalid_grant error. A PKCE or DPoP binding failure is handled according to [RFC7636] or [RFC9449], respectively.¶
A redemption attempt consumes the software statement code whenever the presented code value is one the authorization server issued that has neither expired nor been consumed, including when its PKCE, DPoP, or client-authentication bindings fail. A DPoP nonce challenge [RFC9449] is not a binding failure: an authorization server requiring a nonce issues the use_dpop_nonce challenge before evaluating the code, which remains unconsumed.¶
When a previously consumed code is presented again, the authorization server SHOULD revoke any deferral derived from it ([RFC9700]). To keep anyone who observed the code in a URL from triggering that revocation, an authorization server MAY limit revocation to replays that pass the PKCE check.¶
For a valid, unconsumed code, the authorization server returns the following, according to the issuance decision:¶
Approved. The software statement token response (Section 10).¶
Denied. The terminal denial of Section 10.1.¶
An issuer that does not defer completes the decision before responding.¶
The following is a non-normative example of a redemption request from a confidential client at a deferring issuer (line breaks for display purposes only):¶
POST /token HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3A software-statement &software_statement_code=V7e1gP8zT2mN4qR6sW9xY3aB5cD7fH0jK2pL4uQ6vX &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb &client_id=https%3A%2F%2Fclient.example.org%2Fmetadata.json &code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk &completion_mode=deferred &client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3A client-assertion-type%3Ajwt-bearer &client_assertion=eyJhbGciOiJFUzI1NiIsImtpZCI6ImNsaWVudC0xIn0...¶
A deferring issuer MAY answer a redemption (Section 8) or token exchange (Section 5) with a deferred token response, which follows [DTR] except that the final response MUST be delivered only by polling. The deferral's DPoP binding constrains every polling request (Section 11.1 of [DTR]). That section binds an issued access token, and the software statement is not one (Section 10), so the statement carries no key binding. A client MUST NOT send client_notification_token, which the authorization server rejects with invalid_request, and the server MUST NOT deliver a callback, even to a deferred_client_notification_endpoint in the document.¶
The pending states of Section 6.6 of [DTR] apply. To a client whose completion_mode includes deferred_interactive, a deferring issuer can respond with interaction_required and an interaction_uri, for example where the review needs input from the software's publisher.¶
The following is a non-normative example of a first polling request for a deferral created by a token exchange, from a confidential client authenticating with the same private_key_jwt method as the exchange (line breaks for display purposes only):¶
POST /token HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adeferred &deferral_code=AHqLTuZEcmNEj5X9F72rfwgfE1kcGf0lA8Abf4gFTTo &client_id=https%3A%2F%2Fclient.example.org%2Fmetadata.json &client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3A client-assertion-type%3Ajwt-bearer &client_assertion=eyJhbGciOiJFUzI1NiIsImtpZCI6ImNsaWVudC0xIn0...¶
A successful response has HTTP status code 200, a media type of application/json, and the following members:¶
access_token:REQUIRED. The software statement issued by the authorization server. It MUST conform to [STATEMENT], with the cimd_digest claim set to the digest of the bound metadata snapshot, the aud claim set to the selected audience if one is restricted, and the statement_uses claim set to the uses issuance policy permits.¶
issued_token_type:REQUIRED. The value MUST be urn:ietf:params:oauth:token-type:software-statement.¶
token_type:REQUIRED. The value MUST be N_A (Section 2.2.1 of [RFC8693]).¶
expires_in:RECOMMENDED. The remaining lifetime of the software statement in seconds. If present, it MUST be consistent with the statement's exp claim.¶
The response MUST NOT contain the refresh_token or scope members. The authorization server MUST include the Cache-Control HTTP header field with the value no-store.¶
The following is an example of a software statement token response:¶
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{
"access_token":
"eyJ0eXAiOiJzb2Z0d2FyZS1zdGF0ZW1lbnQrand0...",
"issued_token_type":
"urn:ietf:params:oauth:token-type:software-statement",
"token_type": "N_A",
"expires_in": 3600
}
¶
The access_token member is a security-token container ([RFC8693]), not an OAuth access token. The software statement it carries is consumed only as [STATEMENT] and [REGISTRATION] provide, and MUST NOT be attached to a request as an Authorization: Bearer credential. A protected resource cannot validate a statement (Section 4 of [STATEMENT]).¶
When the authorization server decides not to issue the requested software statement, it returns a token error response as defined in Section 5.2 of [RFC6749] with the access_denied error code (Section 3.5 of [RFC8628]), and MUST include the Cache-Control: no-store response header field. This applies to code redemption and token exchange alike, including when the denial answers a polling request (Section 9).¶
The denial is terminal for the request. A denied deferral behaves as [DTR] specifies for a request resolved with an error, and a client that receives the access_denied error code in response to a polling request MUST NOT send another polling request with that deferral_code. A denial does not preclude a later issuance request. Whether to accept one is issuance policy.¶
An authorization server that issued a statement already holds the decision that statement records. If it is also a trusting authorization server, it MAY rely on that record, at registration or at runtime, rather than require the statement to be presented back to it.¶
Because the record of a decision is not a fresh retrieval of the document, a server relying on the record of a statement it issued MUST apply every check Sections 3.2 and 5.1 of [STATEMENT] apply to a presented statement, except the checks of its JOSE header and signature, and at registration every check [REGISTRATION] applies, taking the statement's claims from its record of the decision.¶
At runtime, the record takes the place of the statement in step 1 of Section 5.1 of [STATEMENT], and the server performs steps 2 through 7 on the claims the record holds.¶
This section gives guidance to implementers. It adds no requirement.¶
An authorization server can rate-limit token exchanges, cache successful retrievals and back off after failures as Section 11.1 of [STATEMENT] describes, and bound pending deferrals per client identifier and requester. Because the redirect flow reaches the approval queue before any client-authenticated step, the same rate limits and pending-approval bounds per client identifier can apply there.¶
A client ought to key the statement on issued_token_type and keep it out of logs.¶
An approval interface ought to state that the decision vouches for the client's CIMD, ought not to imply that the approver is granting the client access to resources, and ought to present the following:¶
The client identifier URL, with its origin shown as the client's identity, and with display metadata such as the client_name and logo_uri members marked as asserted by the client (a look-alike document can carry another vendor's name).¶
The document content the statement will vouch for, identified by its metadata digest.¶
The audience the issuer intends to place in the statement.¶
The tenant the decision is confined to, if the statement will carry the aud_tenant claim ([STATEMENT]).¶
The intended lifetime.¶
If the client requested a different or broader audience, the interface ought to make narrowing visible.¶
An authorization server ought to keep an audit record that binds each decision, whether approval or denial, to the following:¶
The metadata digest (Section 3.1) of the document the deciding party evaluated.¶
The policy under which the decision was made.¶
The identity of the deciding party.¶
The time of decision.¶
An authorization server ought to retain the exact retrieved octets of the approved document for audit, because a re-serialized copy cannot reproduce the digest. A deployment that requires approver attribution can retain it in an audit record or define a statement claim and its privacy semantics.¶
This section gives guidance to operators and issuers. It adds no requirement.¶
Because the client authors its CIMD, an issuer ought to corroborate security-relevant metadata through evidence beyond the document itself. Issuance policy can relate the redirection URI's origin to the client identifier URL or the CIMD's client_uri member.¶
The policy governing who can approve issuance ought to be at least as restrictive as the policy under which the issuer registers a client manually. A token exchange carries no in-band evidence of user participation, so an authorization server ought not to treat one as implying prior user consent. An initial access token that authorizes issuance (Section 5.1) records a decision made, when the token was issued, under the policy that governs approval in the redirect flow.¶
To keep a look-alike document from reaching approval, an issuer ought to limit what an approver can approve to client identifiers under publisher namespaces it has enrolled. A document naming attesters in client_attesters ([ATTESTERS]) endorses them for the software under review and deserves particular scrutiny.¶
Issuers ought to set deferral code lifetimes that reflect their actual approval latency, which for a review involving human judgment can be hours or days (Section 9).¶
An issuer ought to protect its signing keys according to the scope of its trust relationships and support controlled key rotation.¶
The security considerations of Section 13 of [STATEMENT], [CIMD], and Section 5 of [RFC8693] apply.¶
Validating the subject token before metadata retrieval or enqueueing (Section 5) limits resource consumption by unauthorized requesters. Other bounds are local policy (Section 13.1).¶
A subject token appears in a form body, so any component recording request bodies can expose it. Clients and authorization servers MUST protect a subject token as a bearer credential unless its format provides proof of possession. An authorization server ought to keep subject tokens out of logs, traces, and audit records, and an initial access token ought to be integrity protected and kept confidential in transit and at rest.¶
If the reviewed and current documents name a jwks_uri, whoever controls that location can supply a key that satisfies the holder binding of Section 5.2. Binding renewal to the client's key spares automated renewal a long-lived reusable initial access token, a standing credential to mint statements.¶
A compromised software statement signing key lets an attacker mint statements for every audience that trusts it (Section 14.3).¶
Issuers SHOULD prefer signature algorithms with modern security properties, such as PS256, ES256, or Ed25519 [RFC9864], over RSASSA-PKCS1-v1_5 (RS256).¶
The privacy considerations of Section 14 of [STATEMENT] apply.¶
The authorization server learns the client identifier URL, the client's CIMD, and information about the party interacting with the authorization endpoint. It ought to collect and retain only the information required for issuance, security monitoring, and audit obligations.¶
An aud claim reveals which authorization servers the client intends to use. Section 14 of [STATEMENT] weighs that disclosure against omitting the claim, and Section 12.2 of [STATEMENT] advises naming an audience, which an issuer does by requiring one in the request (Section 4.1).¶
If the client's relationship with the authorization servers its audience parameter names is sensitive, a redirect-flow client SHOULD use pushed authorization requests [RFC9126].¶
Approval records can link a person to a client and deployment. Such records ought to be access-controlled and retained only as long as required.¶
A central issuer also learns from renewals which of its statements are in active use, so issuance and renewal logs deserve the same care as the statements.¶
This specification requests registration of the following values in the IANA "OAuth URI" registry:¶
urn:ietf:params:oauth:grant-type:software-statement¶
OAuth Software Statement Grant Type¶
IETF¶
urn:ietf:params:oauth:token-type:software-statement¶
OAuth Software Statement Token Type¶
IETF¶
This specification, Section 10 and Section 5¶
This specification requests that IANA add this specification, Section 4.1, as an additional reference for the existing audience parameter registered by [RFC8693] and extend its usage location to include authorization requests. The parameter name and change controller are unchanged.¶
This specification also requests registration of the following value in the IANA "OAuth Parameters" registry established by [RFC6749]:¶
This specification requests that IANA update the existing invalid_target entry, adding authorization error responses to its usage locations and this specification as a reference:¶
Why the software statement code is not an authorization code. Redeeming an authorization code issues an access token under [RFC6749]. This flow issues an artifact that grants nothing. A distinct code keeps implementations that treat any code as redeemable from confusing the two.¶
Why not the device authorization grant. [RFC8628] fits a human decision that outlives a request, and an issuer whose approval is always out of band can use it. It assumes a user co-present with a constrained device who enters a user code elsewhere. Issuance approval is made by an administrator or reviewer who does not operate the client and is often not present, and the client already has a browser. The redirect flow covers an approver reachable through that browser. The token exchange profile covers the case with no browser.¶
Why not client attestation or OpenID Federation. Section 10 of [STATEMENT] relates statements to client attestation and OpenID Federation. Federation standardizes trust resolution, not enrollment, approval, or deferred completion.¶
This specification builds on [DTR], [CIMD], and [APPROVAL-DCR]. The author thanks the authors and contributors to those specifications and the OAuth working group participants whose discussions informed this work.¶