<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 3.1.3) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-tulshibagwale-oauth-transaction-tokens-01" category="info" submissionType="IETF" xml:lang="en">
  <front>
    <title abbrev="Txn-Tokens">Transaction Tokens</title>

    <author initials="A." surname="Tulshibagwale" fullname="Atul Tulshibagwale">
      <organization>SGNL</organization>
      <address>
        <email>atul@sgnl.ai</email>
      </address>
    </author>
    <author initials="G." surname="Fletcher" fullname="George Fletcher">
      <organization>Capital One</organization>
      <address>
        <email>george.fletcher@capitalone.com</email>
      </address>
    </author>
    <author initials="P." surname="Kasselman" fullname="Pieter Kasselman">
      <organization>Microsoft</organization>
      <address>
        <email>pieter.kasselman@microsoft.com</email>
      </address>
    </author>

    <date year="2023" month="July" day="10"/>

    <area>sec</area>
    <workgroup>oauth</workgroup>
    <keyword>Microservices</keyword> <keyword>OAuth</keyword> <keyword>JWT</keyword> <keyword>token exchange</keyword>

    <abstract>


<t>Transaction Tokens (Txn-Tokens) enable workloads in a trusted domain to ensure that user identity and authorization context of an external programmatic request, such as an API invocation, is preserved and available to all workloads that are invoked as part of processing such a request. Txn-Tokens also enable workloads within the trusted domain to optionally immutably assert to downstream workloads that they were invoked in the call chain of the request.</t>



    </abstract>



  </front>

  <middle>


<section anchor="introduction"><name>Introduction</name>

<t>Modern computing architectures often use multiple independently running components called workloads. In many cases, external invocations through externally visible interfaces such as APIs result in a number of internal workloads being invoked in order to process the external invocation. These workloads often run in virtually or physically isolated networks. These networks and the workloads running within their perimeter may be compromised by attackers through software supply chain, privileged user compromise or other attacks. Workloads compromised through external attacks, malicious insiders or software errors can cause any or all of the following unauthorized actions:</t>

<t><list style="symbols">
  <t>Invocations of workloads in the network without any external invocation being present</t>
  <t>Arbitrary user impersonation</t>
  <t>Parameter modification or augmentation</t>
</list></t>

<t>The results of these actions are unauthorised access to resources.</t>

</section>
<section anchor="overview"><name>Overview</name>
<t>Transaction Tokens (Txn-Token) are a means to mitigate damage from such attacks or spurious invocations. A valid Txn-Token indicates a valid external invocation.
They ensure that the identity of the user or a workload that made the external request is preserved throughout subsequent workload invocations.
They preserve any context such as:</t>

<t><list style="symbols">
  <t>Parameters of the original call</t>
  <t>Environmental factors, such as IP address of the original caller</t>
  <t>Any computed context that needs to be preserved in the call chain. This includes information that was not in the original request to the external endpoint.</t>
</list></t>

<t>Cryptographically protected Txn-Token ensure that downstream workloads cannot make unauthorized modifications to such information, and cannot make spurious calls without the presence of an external trigger.</t>

<section anchor="what-are-transaction-tokens"><name>What are Transaction Tokens?</name>
<t>Txn-Tokens are short-lived, signed JWTs <xref target="RFC7519"/> that assert the identity of a user or a workload and assert an authorization context. The authorization context provides information expected to remain constant during the execution of a call as it passes through multiple workloads.</t>

<t>When necessary, a Txn-Token may include embedded tokens, as described in <xref target="JWTEmbeddedTokens"/>. This is called Nested Txn-Token. This nesting enables workloads in a call chain to assert their invocation during the call chain to downstream workloads.</t>

</section>
<section anchor="creating-txn-tokens"><name>Creating Txn-Tokens</name>

<section anchor="leaf-txn-tokens"><name>Leaf Txn-Tokens</name>
<t>Txn-Tokens are typically created when a workload is invoked using an endpoint that is externally visible, and is authorized using a separate mechanism, such as an OAuth <xref target="RFC6749"/> token or an OpenID Connect <xref target="OpenIdConnect"/> token. We call this token "Leaf Txn-Token". This workload then performs an OAuth 2.0 Token Exchange <xref target="RFC8693"/> to obtain a Txn-Token. To do this, it invokes a special Token Service (the Txn-Token Service) and provides context that is sufficient for it to generate a Txn-Token. This context MAY include:</t>

<t><list style="symbols">
  <t>The external authorization token (e.g. the OAuth access token)</t>
  <t>A previously created Txn-Token (leaf or nested)</t>
  <t>Parameters that are required to be bound for the duration of this call</t>
  <t>Additional context, such as the incoming IP address, User Agent information, or other context that can help the Txn-Token Service to issue the Txn-Token</t>
</list></t>

<t>The Txn-Token Service responds to a successful invocation by generating a Txn-Token. The calling workload then uses the Txn-Token to authorize its calls to subsequent workloads. Subsequent workloads may obtain Txn-Tokens of their own.</t>

</section>
<section anchor="nested-txn-tokens"><name>Nested Txn-Tokens</name>
<t>A workload within the call chain of such an external call MAY generate a new Nested Txn-Token. To generate the Nested Txn-Token, it creates a self-signed JWT Embedded Token <xref target="JWTEmbeddedTokens"/> that includes the received Txn-Token by value. Subsequent workloads can therefore know that the signing workload was in the path of the call chain.</t>

</section>
</section>
<section anchor="txn-token-lifetime"><name>Txn-Token Lifetime</name>
<t>Txn-Tokens are expected to be short-lived (order of minutes, e.g. 5 minutes), and as a result MAY be used only for the expected duration of an external invocation. If a long-running process such as an batch or offline task is involved, it can use a separate mechanism to perform the external invocation, but the resulting Txn-Token SHALL still be short-lived.</t>

</section>
<section anchor="benefits-of-txn-tokens"><name>Benefits of Txn-Tokens</name>
<t>Txn-Tokens help prevent spurious invocations by ensuring that a workload receiving an invocation can independently verify the user or workload on whose behalf an external call was made and any context relevant to the processing of the call. Through the presence of additional signatures on the Txn-Token, a workload receiving an invocation can also independently verify that specific workloads were within the path of the call before it was invoked.</t>

</section>
<section anchor="txn-token-issuance-and-usage-flows"><name>Txn-Token Issuance and Usage Flows</name>

<t><xref target="fig-arch"/> shows how Txn-Tokens are used in an a multi-workload environment.</t>

<figure title="Use of Txn-Tokens in Multi-Workload Environments" anchor="fig-arch"><artwork type="ascii-art"><![CDATA[
                    | (A) Access Token
                    | via external API
                    v
             +--------------+ (B) Txn-Token Request +---------------+
             |  Resource    |---------------------->|               |
             |   Server     | (C) Leaf Txn-Token    |  Transaction  |
             | (Workload 1) |<----------------------|     Token     |
             +--------------+                       |    Server     |
                    |                               |               |
                    | (D) Send Request              |               |
                    |     with Leaf Txn-Token       |               |
                    |     for Workload 1            |               |
                    v                               |               |
             +--------------+                       |               |
             |  Workload 2  |                       |               |
             |              |                       |               |
             |              |                       |               |
             +--------------+                       |               |
                    |  (E) Use unmodified           |               |
                    |      Leaf Txn-Token           |               |
                    |      for Workload 1           |               |
                    v                               |               |
             +--------------+                       |               |
             |  Workload 3  |---+ (F) Create        |               |
             |              |   |     Nested        |               |
             |              |<--+     Txn-Token     |               |
             +--------------+                       |               |
                    |  (G) Send request with        |               |
                    |      Nested Txn-Token for     |               |
                    |      Workload 3               |               |
                    v                               |               |
             +--------------+ (H) Txn-Token Request |               |
             |  Workload 4  |---------------------->|               |
             |              | (I) Txn-Token Response|  Transaction  |
             |              |<----------------------|     Token     |
             +--------------+                       |    Server     |
                    |  (J) Send request with        |               |
                    |      Leaf Txn-Token for       |               |
                    |      Workload 5               |               |
                    :                               |               |
                    :                               |               |
                    |                               |               |
                    |                               |               |
                    |                               |               |
                    v                               |               |
             +--------------+                       |               |
             |  Workload n  | (K) Txn-Token verified|               |
             |              |     by any workload   |               |
             |              |     in call chain     |               |
             +--------------+                       +---------------+
]]></artwork></figure>

<t><list style="symbols">
  <t>(A) The user accesses a resource server and present an Access Token obtained from an Authorization Server using an OAuth 2.0 or an OpenID Connect flow.</t>
  <t>(B) The resource server is implemented as a workload (Workload 1) and requests a Leaf Txn-Token from the Transaction Token Server using the Token Exchange protocol <xref target="RFC8693"/>.</t>
  <t>(C) The Transaction Token Service returns a Leaf Txn-Token containing the requested claims that establish the identity of the original caller as well as additional claims that can be used to make authorization decisions and establish the call chain.</t>
  <t>(D) The Resource Server (Workload 1) calls Workload 2 and passes the Leaf Txn-Token for Workload 1. Workload 2 validates the Txn-Token and makes an authorization decision by combining contextual information at its disposal with information in the Txn-Token to make an authorization decision to accept or reject the call.</t>
  <t>(E) Workload 2 is not required to add aditional information to the Txn-Token and passes the unmodified Txn-Token for Workload 1 to Workload 3. Workload 3 validates the Txn-Token and makes an authorization decision by combining contextual information at its disposal with information in the Txn-Token to make an authorization decision to accept or reject the call.</t>
  <t>(F) Workload 3 generates a Nested Txn-Token that includes additional call chain information.</t>
  <t>(G) Workload 3 sends the Nested Txn-Token to Workload 4. Workload 4 validates the Nested Txn-Token and makes an authorization decision by combining contextual information at its disposal with information in the Nested Txn-Token to make an authorization decision to accept or reject the call.</t>
  <t>(H) Workload 4 needs a Txn-Token containing information from the Authroization Server and requests a new Leaf Transaction Token (Leaf Txn-Token) from the Transaction Token Server using the Token Exchange protocol <xref target="RFC8693"/>.</t>
  <t>(I) The Transaction Token Service returns a Leaf Transaction Token (Leaf Txn-Token) containing the requested claims that include the call chain information included in the Txn-Token as well as additional claims needed.</t>
  <t>(J) Workload 4 sends the Txn-Token to the Workload 5, who verifies it and extracts claims and combine it with contextual information for use in authroization decisions. Other workloads continue to pass Txn-Tokens, generate Nested Txn-Tokens or request new Txn-Tokens.</t>
  <t>(K) Workload n is the final workload in the call chain. It verifies the received Txn-Token, extracts claims and combine it with contextual information for use in authroization decisions.</t>
</list></t>

</section>
</section>
<section anchor="notational-conventions"><name>Notational Conventions</name>

<t>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 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when,
they appear in all capitals, as shown here.</t>

</section>
<section anchor="terminology"><name>Terminology</name>

<dl>
  <dt>Workload:</dt>
  <dd>
    <t>An independent computational unit that can autonomously receive and process invocations, and can generate invocations of other workloads. Examples of workloads include containerized microservices, monolithic services and infrastructure services such as managed databases.</t>
  </dd>
  <dt>Trust Domain:</dt>
  <dd>
    <t>A virtually or physically separated network, which contains two or more workloads. The workloads within an Trust Domain may be invoked only through published interfaces. A Trust Domain must have a name that is used as the <spanx style="verb">aud</spanx> (audience) value in Txn-Tokens.</t>
  </dd>
  <dt>External Endpoint:</dt>
  <dd>
    <t>A published interface to an Trust Domain that results in the invocation of a workload within the Trust Domain.</t>
  </dd>
  <dt>Call Chain:</dt>
  <dd>
    <t>A sequence of invocations that results from the invocation of an external endpoint.</t>
  </dd>
  <dt>Transaction Token (Txn-Token):</dt>
  <dd>
    <t>A signed JWT that has a short lifetime, which provides immutable information about the user or workload, certain parameters of the call and certain contextual attributes of the call. A Txn-Token may contain a nested Txn-Token.</t>
  </dd>
  <dt>Leaf Txn-Token:</dt>
  <dd>
    <t>A Txn-Token that does not contain a <spanx style="verb">txn_token</spanx> claim in its JWT body.</t>
  </dd>
  <dt>Nested Txn-Token:</dt>
  <dd>
    <t>A JWT Embedded Token <xref target="JWTEmbeddedTokens"/> that embeds a Txn-Token by value.</t>
  </dd>
  <dt>Authorization Context:</dt>
  <dd>
    <t>A JSON object containing a set of claims that represent the immutable context of a call chain.</t>
  </dd>
  <dt>Transaction Token Service (Txn-Token Service):</dt>
  <dd>
    <t>A special service within the Trust Domain, which issues Txn-Tokens to requesting workloads.</t>
  </dd>
</dl>

</section>
<section anchor="txn-token-format"><name>Txn-Token Format</name>
<t>A Txn-Token is a JSON Web Token <xref target="RFC7519"/> protected by a JSON Web Signature <xref target="RFC7515"/>. The following is true in a Txn-Token:</t>

<section anchor="txn-token-header"><name>JWT Header</name>
<t>In the JWT Header:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">typ</spanx> claim MUST be present and MUST have the value <spanx style="verb">txn_token</spanx>.</t>
  <t>Key rotation of the signing key SHOULD be supported through the use of a <spanx style="verb">kid</spanx> claim.</t>
</list></t>

<t><xref target="figtxtokenheader"/> is a non-normative example of the JWT Header of a Txn-Token</t>

<figure title="Example: Txn-Token Header" anchor="figtxtokenheader"><sourcecode type="json"><![CDATA[
{
    "typ": "txn_token",
    "alg": "RS256",
    "kid": "identifier-to-key"
}
]]></sourcecode></figure>

</section>
<section anchor="txn-token-body"><name>JWT Body</name>

<section anchor="common-claims"><name>Common Claims</name>
<t>The JWT body MUST have the following claims regardless of whether the Txn-Token is a Leaf Txn-Token or a Nested Txn-Token:</t>

<t><list style="symbols">
  <t>An <spanx style="verb">iss</spanx> claim, whose value is a URN <xref target="RFC8141"/> that uniquely identifies the workload or the Txn-Token Service that created the Txn-Token.</t>
  <t>An <spanx style="verb">iat</spanx> claim, whose value is the time at which the Txn-Token was created.</t>
  <t>An <spanx style="verb">exp</spanx> claim, whose value is the time at which the Txn-Token expires. Note that if this claim is in a Nested Txn-Token, then this <spanx style="verb">exp</spanx> value MUST NOT exceed the <spanx style="verb">exp</spanx> value of the Txn-Token included in the JWT Body.</t>
</list></t>

</section>
<section anchor="leaf-txn-token-claims"><name>Leaf Txn-Token Claims</name>
<t>The following claims MUST be present in the JWT body of a Leaf Txn-Token:</t>

<t><list style="symbols">
  <t>A <spanx style="verb">tid</spanx> claim, whose value is the unique identifier of entire call chain.</t>
  <t>A <spanx style="verb">sub_id</spanx> claim, whose value is the unique identifier of the user or workload on whose behalf the call chain is being executed. The format of this claim MAY be a Subject Identifier as specified in <xref target="SubjectIdentifiers"/>.</t>
  <t>An <spanx style="verb">azc</spanx> claim, whose value is a JSON object that contains values that remain constant in the call chain.</t>
</list></t>

<t><xref target="figleaftxtokenbody"/> shows a non-normative example of the JWT body of a Leaf Txn-Token:</t>

<figure title="Example: Leaf Txn-Token Body" anchor="figleaftxtokenbody"><sourcecode type="json"><![CDATA[
{
    "iss": "https://trust-domain.example/txn-token-service",
    "iat": "1686536226000",
    "exp": "1686536526000",
    "tid": "97053963-771d-49cc-a4e3-20aad399c312",
    "sub_id": {
        "format": "email",
        "email": "user@trust-domain.example"
    },
    "azc": {
        "action": "BUY", // parameter of external call
        "ticker": "MSFT", // parameter of external call
        "quantity": "100", // parameter of external call
        "user_ip": "69.151.72.123", // env context of external call
        "user_level": "vip" // computed value not present in external call
    }
}
]]></sourcecode></figure>

</section>
<section anchor="nested-txn-token-claim"><name>Nested Txn-Token Claim</name>
<t>A Nested Txn-Token is a JWT Embedded Token <xref target="JWTEmbeddedTokens"/>, which embeds a Txn-Token by value. The following claims MUST be present in a Nested Txn-Token:</t>

<t><list style="symbols">
  <t>A <spanx style="verb">type</spanx> claim, whose value is <spanx style="verb">urn:ietf:params:oauth:token-type:txn_token</spanx>.</t>
  <t>A <spanx style="verb">token</spanx> claim, whose value is an encoded JWT representation of a Txn-Token.</t>
</list></t>

<t><xref target="fignestedtxtokenbody"/> shows a non-normative example the JWT body of a nested Txn-Token</t>

<figure title="Example: Nested Txn-Token Body" anchor="fignestedtxtokenbody"><sourcecode type="json"><![CDATA[
{
    "iss": "https://trust-domain.example/fraud-detection",
    "iat": "1686536236000",
    "exp": "1686536526000",
    "type": "urn:ietf:params:oauth:token-type:txn_token",
    "token": "eyJ0eXAiOiJ0cmF0Iiwi...thwd8"
}
]]></sourcecode></figure>

</section>
</section>
</section>
<section anchor="requesting-leaf-txn-tokens"><name>Requesting Leaf Txn-Tokens</name>
<t>A workload requests a Txn-Token from a Transaction Token Service using OAuth 2.0 Token Exchange <xref target="RFC8693"/>. The request to obtain a Txn-Token using this method is called a Txn-Token Request, and a success response is called a Txn-Token Response. A Txn-Token Request is a Token Exchange Request, as described in Section 2.1 of <xref target="RFC8693"/> with additional parameters. A Txn-Token Response is a OAuth 2.0 token endpoint response, as described in Section 5 of <xref target="RFC6749"/>, where the <spanx style="verb">token_type</spanx> in the response has the value <spanx style="verb">txn_token</spanx>.</t>

<t>The Transaction Token Service acts as an OAuth 2.0 <xref target="RFC6749"/> Authorization Server. The requesting workload acts as the OAuth 2.0 Client, which authenticates itself to the Transaction Token Service through mechanisms defined in OAuth 2.0.</t>

<section anchor="txn-token-request"><name>Txn-Token Request</name>
<t>A Txn-Token Request is an OAuth 2.0 Token Exchange Request, as described in Section 2.1 of <xref target="RFC8693"/>, with an additional parameter in the request. The following is true of the Txn-Token Request:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">audience</spanx> value MUST be set to the Trust Domain name.</t>
  <t>The <spanx style="verb">requested_token_type</spanx> value MUST be <spanx style="verb">urn:ietf:params:oauth:token-type:txn_token</spanx>.</t>
  <t>The <spanx style="verb">subject_token</spanx> value MUST be the external token received by the workload that authorized the call.</t>
  <t>The <spanx style="verb">subject_token_type</spanx> value MUST be present and indicate the type of the authorization token present in the <spanx style="verb">subject_token</spanx> parameter.</t>
</list></t>

<t>The following additional parameter MUST be present in a Txn-Token Request:</t>

<t><list style="symbols">
  <t>A parameter named <spanx style="verb">azc</spanx> , whose value is a JSON object. This object contains any information the Transaction Token Service needs to understand the context of the incoming request.</t>
</list></t>

<t><xref target="figtxtokenrequest"/> shows a non-normative example of a Txn-Token Request.</t>

<figure title="Example: Txn-Token Request" anchor="figtxtokenrequest"><sourcecode type="http"><![CDATA[
POST /txn-token-service/token_endpoint HTTP 1.1
Host: txn-token-service.trust-domain.example
Content-Type: application/x-www-form-urlencoded

requested_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Atxn_token
&audience=http%3A%2F%2Ftrust-domain.example
&subject_token=eyJhbGciOiJFUzI1NiIsImtpZC...kdXjwhw
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token
&azc=%7B%22param1%22%3A%22value1%22%2C%22param2%22%3A%22value2%22%2C%22ip_address%22%3A%2269.151.72.123%22%7D
]]></sourcecode></figure>

</section>
<section anchor="txn-token-response"><name>Txn-Token Response</name>
<t>A successful response to a Txn-Token Request by a Transaction Token Service is called a Txn-Token Response. If the Transaction Token Service responds with an error, the error response is as described in Section 5.2 of <xref target="RFC6749"/>. The following is true of a Txn-Token Response:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">token_type</spanx> value MUST be set to <spanx style="verb">txn_token</spanx>.</t>
  <t>The <spanx style="verb">access_token</spanx> value MUST be the Txn-Token.</t>
  <t>The response MUST NOT include the values <spanx style="verb">expires_in</spanx>, <spanx style="verb">refresh_token</spanx> and <spanx style="verb">scope</spanx>.</t>
</list></t>

<t><xref target="figtxtokenresponse"/> shows a non-normative example of a Txn-Token Response.</t>

<figure title="Example: Txn-Token Response" anchor="figtxtokenresponse"><sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: non-cache, no-store

{
  "issued_token_type": "urn:ietf:params:oauth:token-type:txn_token",
  "access_token": "eyJCI6IjllciJ9...Qedw6rx"
}
]]></sourcecode></figure>

</section>
<section anchor="creating-replacement-txn-tokens"><name>Creating Replacement Txn-Tokens</name>
<t>A workload within a call chain may request the Transaction Token Server to replace a Txn-Token. Replacement Txn-Tokens are Leaf Txn-Tokens.</t>

<t>Workloads MAY request replacement Txn-Tokens in order to change (add to, remove or modify) the asserted values within a Txn-Token, to remove nesting and / or reduce token bloat.</t>

<section anchor="transaction-token-server-responsibilities"><name>Transaction Token Server Responsibilities</name>
<t>A Transaction Token Server replacing a Txn-Token must consider that modifying previously asserted values from existing Txn-Tokens can completely negate the benefits of Txn-Tokens. When issuing replacement Txn-Tokens, a Transaction Token Server therefore:</t>

<t><list style="symbols">
  <t>MAY enable modifications to asserted values that reduce the scope of permitted actions</t>
  <t>MAY enable reduction of token bloat by removing nesting, and placing workload identifiers as asserted values instead</t>
  <t>MAY enable additional asserted values</t>
  <t>SHOULD NOT enable modification to asserted values that expand the scope of permitted actions</t>
</list></t>

</section>
<section anchor="replacement-txn-token-request"><name>Replacement Txn-Token Request</name>
<t>To request a replacement Txn-Token, the requester makes a Txn-Token Request <xref target="txn-token-request"/> but includes the Txn-Token to be replaced as the value of the <spanx style="verb">subject_token</spanx> parameter.</t>

</section>
<section anchor="replacement-txn-token-response"><name>Replacement Txn-Token Response</name>
<t>A successful response by the Transaction Token Server to a Replacement Txn-Token Request is a Txn-Token Response <xref target="txn-token-response"/></t>

</section>
<section anchor="removing-nesting"><name>Removing Nesting</name>
<t>A Replacement Txn-Token Request MAY include a Nested Txn-Token in its request. If the request is successful, the Transaction Token Server SHALL always respond with a Leaf Txn-Token.</t>

<t>If the Replacement Txn-Token Request has a Nested Txn-Token in the request's <spanx style="verb">subject_token</spanx> parameter, then the Transaction Token Server MAY include information about services that had signed the Nested Txn-Token that is requested to be replaced.</t>

<t>If the Transaction Token Server wishes to include information about any nested Txn-Token signers, then it SHALL include a field named <spanx style="verb">previous_signers</spanx> in the <spanx style="verb">azc</spanx> value of the Txn-Token that it issues. The value of this field MUST be an array of strings. Each string is the the value of the <spanx style="verb">iss</spanx> field of a Nested Txn-Tokens received in the Replacement Txn-Token Request. Note that</t>

<t><list style="symbols">
  <t>A Nested Txn-Token is a recursive structure, and the <spanx style="verb">iss</spanx> value is present at each level of nesting</t>
  <t>The Transaction Token Server MAY choose to include or exclude any <spanx style="verb">iss</spanx> value in the <spanx style="verb">previous_signers</spanx> field of the Txn-Token it generates.</t>
</list></t>

</section>
</section>
</section>
<section anchor="creating-nested-txn-tokens"><name>Creating Nested Txn-Tokens</name>
<t>A workload within a call chain MAY create a Nested Txn-Token. It does so by embedding the Txn-Token it receives by value in a JWT Embedded Token <xref target="JWTEmbeddedTokens"/>. Nested Txn-Tokens are self-signed and not requested from a separate service.</t>

<t>The expiration time of a enclosing Txn-Token MUST NOT exceed the expiration time of an embedded Txn-Token.</t>

</section>
<section anchor="IANA"><name>IANA Considerations</name>

<t>This memo includes no request to IANA.</t>

</section>
<section anchor="Security"><name>Security Considerations</name>

<section anchor="mutual-authentication-of-the-txn-token-request"><name>Mutual Authentication of the Txn-Token Request</name>
<t>A Transaction Token Service MUST ensure that it authenticates any workloads requesting Txn-Tokens. In order to do so:</t>

<t><list style="symbols">
  <t>It MUST name a limited, pre-configured set of workloads that MAY request Txn-Tokens.</t>
  <t>It MUST individually authenticate the requester as being one of the name requesters.</t>
  <t>It SHOULD rely on mechanisms, such as <xref target="Spiffe"/>, to securely authenticate the requester.</t>
  <t>It SHOULD NOT rely on insecure mechanisms, such as long-lived shared secrets to authenticate the requesters.</t>
</list></t>

<t>The requesting workload MUST have a pre-configured location for the Transaction Token Service. It SHOULD rely on mechanisms, such as <xref target="Spiffe"/>, to securely authenticate the Transaction Token Service before making a Txn-Token Request.</t>

</section>
<section anchor="sender-constrained-tokens"><name>Sender Constrained Tokens</name>
<t>Although Txn-Tokens are short-lived, they may be sender constrained as an additional layer of defence to prevent them from being re-used by a compromised or malicious workload under the control of a hostile actor.</t>

</section>
<section anchor="access-tokens"><name>Access Tokens</name>
<t>When creating Txn-Tokens, the Txn-Token MUST NOT contain the Access Token presented to the resource server. If an Access Token is included in a Txn-Token, an attacker may obtain a Txn-Token, extract the Access Token, and replay it to the Resource Server. Txn-Token expiry does not protect against this attack since the Access Token may remain valid even after the Txn-Token has expired.</t>

</section>
</section>


  </middle>

  <back>


    <references title='Normative References'>



<reference anchor='RFC2119' target='https://www.rfc-editor.org/info/rfc2119'>
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname='S. Bradner' initials='S.' surname='Bradner'/>
    <date month='March' year='1997'/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name='BCP' value='14'/>
  <seriesInfo name='RFC' value='2119'/>
  <seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>

<reference anchor='RFC6749' target='https://www.rfc-editor.org/info/rfc6749'>
  <front>
    <title>The OAuth 2.0 Authorization Framework</title>
    <author fullname='D. Hardt' initials='D.' role='editor' surname='Hardt'/>
    <date month='October' year='2012'/>
    <abstract>
      <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='6749'/>
  <seriesInfo name='DOI' value='10.17487/RFC6749'/>
</reference>

<reference anchor='RFC7519' target='https://www.rfc-editor.org/info/rfc7519'>
  <front>
    <title>JSON Web Token (JWT)</title>
    <author fullname='M. Jones' initials='M.' surname='Jones'/>
    <author fullname='J. Bradley' initials='J.' surname='Bradley'/>
    <author fullname='N. Sakimura' initials='N.' surname='Sakimura'/>
    <date month='May' year='2015'/>
    <abstract>
      <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='7519'/>
  <seriesInfo name='DOI' value='10.17487/RFC7519'/>
</reference>

<reference anchor='RFC7515' target='https://www.rfc-editor.org/info/rfc7515'>
  <front>
    <title>JSON Web Signature (JWS)</title>
    <author fullname='M. Jones' initials='M.' surname='Jones'/>
    <author fullname='J. Bradley' initials='J.' surname='Bradley'/>
    <author fullname='N. Sakimura' initials='N.' surname='Sakimura'/>
    <date month='May' year='2015'/>
    <abstract>
      <t>JSON Web Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='7515'/>
  <seriesInfo name='DOI' value='10.17487/RFC7515'/>
</reference>

<reference anchor='RFC8141' target='https://www.rfc-editor.org/info/rfc8141'>
  <front>
    <title>Uniform Resource Names (URNs)</title>
    <author fullname='P. Saint-Andre' initials='P.' surname='Saint-Andre'/>
    <author fullname='J. Klensin' initials='J.' surname='Klensin'/>
    <date month='April' year='2017'/>
    <abstract>
      <t>A Uniform Resource Name (URN) is a Uniform Resource Identifier (URI) that is assigned under the "urn" URI scheme and a particular URN namespace, with the intent that the URN will be a persistent, location-independent resource identifier. With regard to URN syntax, this document defines the canonical syntax for URNs (in a way that is consistent with URI syntax), specifies methods for determining URN-equivalence, and discusses URI conformance. With regard to URN namespaces, this document specifies a method for defining a URN namespace and associating it with a namespace identifier, and it describes procedures for registering namespace identifiers with the Internet Assigned Numbers Authority (IANA). This document obsoletes both RFCs 2141 and 3406.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='8141'/>
  <seriesInfo name='DOI' value='10.17487/RFC8141'/>
</reference>

<reference anchor='RFC8174' target='https://www.rfc-editor.org/info/rfc8174'>
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname='B. Leiba' initials='B.' surname='Leiba'/>
    <date month='May' year='2017'/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name='BCP' value='14'/>
  <seriesInfo name='RFC' value='8174'/>
  <seriesInfo name='DOI' value='10.17487/RFC8174'/>
</reference>

<reference anchor='RFC8693' target='https://www.rfc-editor.org/info/rfc8693'>
  <front>
    <title>OAuth 2.0 Token Exchange</title>
    <author fullname='M. Jones' initials='M.' surname='Jones'/>
    <author fullname='A. Nadalin' initials='A.' surname='Nadalin'/>
    <author fullname='B. Campbell' initials='B.' role='editor' surname='Campbell'/>
    <author fullname='J. Bradley' initials='J.' surname='Bradley'/>
    <author fullname='C. Mortimore' initials='C.' surname='Mortimore'/>
    <date month='January' year='2020'/>
    <abstract>
      <t>This specification defines a protocol for an HTTP- and JSON-based Security Token Service (STS) by defining how to request and obtain security tokens from OAuth 2.0 authorization servers, including security tokens employing impersonation and delegation.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='8693'/>
  <seriesInfo name='DOI' value='10.17487/RFC8693'/>
</reference>


<reference anchor="OpenIdConnect" target="https://openid.net/specs/openid-connect-core-1_0.html">
  <front>
    <title>OpenID Connect Core 1.0 incorporating errata set 1</title>
    <author initials="N." surname="Sakimura" fullname="Nat Sakimura">
      <organization>NRI</organization>
    </author>
    <author initials="J." surname="Bradley" fullname="John Bradley">
      <organization>Ping Identity</organization>
    </author>
    <author initials="M." surname="Jones" fullname="Mike Jones">
      <organization>Microsoft</organization>
    </author>
    <author initials="B. de" surname="Medeiros" fullname="B. de Medeiros">
      <organization>Google</organization>
    </author>
    <author initials="C." surname="Mortimore" fullname="Chuck Mortimore">
      <organization>Salesforce</organization>
    </author>
    <date year="2014" month="November"/>
  </front>
</reference>
<reference anchor="SubjectIdentifiers" target="https://datatracker.ietf.org/doc/html/draft-ietf-secevent-subject-identifiers">
  <front>
    <title>Subject Identifiers for Security Event Tokens</title>
    <author initials="A." surname="Backman" fullname="Annabelle Backman">
      <organization>Amazon</organization>
    </author>
    <author initials="M." surname="Scurtescu" fullname="Martin Scurtescu">
      <organization>Coinbase</organization>
    </author>
    <author initials="P." surname="Jain" fullname="Prachi Jain">
      <organization>Fastly</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="JWTEmbeddedTokens" target="https://www.ietf.org/archive/id/draft-yusef-oauth-nested-jwt-06.html">
  <front>
    <title>JSON Web Token (JWT) Embedded Tokens</title>
    <author initials="R." surname="Shekh-Yusef" fullname="Rifaat Shekh-Yusef">
      <organization>E&amp;Y</organization>
    </author>
    <author initials="D." surname="Hardt" fullname="Dick Hardt">
      <organization>Hellō</organization>
    </author>
    <author initials="G. D." surname="Marco" fullname="Giuseppe De Marco">
      <organization>Dipartimento per la trasformazione digitale della Presidenza del Consiglio dei Ministri Italy</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

    <references title='Informative References'>

<reference anchor="Spiffe" target="https://spiffe.io/docs/latest/spiffe-about/overview/">
  <front>
    <title>Secure Production Identity Framework for Everyone</title>
    <author >
      <organization>Cloud Native Computing Foundation</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>


<section numbered="false" anchor="Acknowledgements"><name>Acknowledgements</name>

</section>

    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
        <name>Contributors</name>
    <contact initials="E." surname="Gilman" fullname="Evan Gilman">
      <organization>SPIRL</organization>
      <address>
        <email>evan@spirl.com</email>
      </address>
    </contact>
    <contact initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
      <organization>Arm Ltd.</organization>
      <address>
        <email>Hannes.Tschofenig@arm.com</email>
      </address>
    </contact>
    </section>

  </back>

<!-- ##markdown-source:
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
iqzGIrn6uq87d9a8J5CCDhGzp4xZExOslMwXmcJFKFPFccyLsiLpLRwOatoq
RJYS9uZuVIwxDYkL5LgTVyRFFlbKCeUTRrkbItdH62WZd2CDpQkgop3QoI37
kpnUc1NGhidynOlq1rmJ29jgRMqsFO8yBQWLEB4WH2zVC7encZMvLpCnKtEV
740DMeP5w6LdgNI2XLtLkQ0RI45whTbIREis7P6X6nIn/vNh+CHteFPpMy4K
I0BcR9Xe4LNrQY1PivlYm44YqgktqXzmd/WwLgpSk2pw8xV2qaCHDAfoRrXH
E3DjvFiwBr1Z1Cj4paLuSVdsQhJCChIsUfPecbhvAHyE/1lWRtvNRQchAsoG
ac0m+iIMH/8Nw1jw/yW1n++FS7S1dtTNViwd18lDbfI2P0CXwL+IwIPhTKvO
On5E9gfDMHaNyd768B9N/S7M/14mvNwLF8x9F7LbLoYYOeONvqQsGq6mYfhx
f4UtS8su78YWZ+9/xCucfalX+G007+QubFNAY1sq5iwNSdsKttV7IJ+wnjyg
VCJgoBfzSErwgQ/y+1i3tzEbtUCQc/lMLa2VnYO6T0h0uY6NQrlBgNGO4WYJ
H4cJ5MG5r6F4SzufwbYVgNL5kjY40U4GgVPfb7y1dv1YjjlrQrnyb4gaP+yF
capmUkx02OfY1UZ0VntydO/C9f+n6YNtbecFt8lJaqrGvR18x3u9V4piZKDc
zpsPF5c7ff5XnL+l39+f/vnD2fvTZ/g7bS+5X3pmxMXLtx9eP/O/+S9P3r55
c3r+jD+GpyJ61Nt5M/pph7fsdt6+uzx7ez56vcNUBAKnRbKcU1RaKrMZSK2l
EKxyeNiL+l+enrwThw9YRfFczO2tUdfDxw/gd+wP4aloF5D+7FE3r1wslCyJ
hMg3PpjEDTa4QYJ76KWi5sBLVc51XmTFdN3rWWk47uGJhHCXx7SeWYIvcx1s
yOOprryYc8uBkQbbLUGRd7DV5hq1vNjquAuziGV/CDZLYgjdatFke2GMizKN
YuHZtb6YA14Z7jwlwj7kZph8UsqqLpfUkuzf2Z3Pucwl9rXioQ88SoGtPZfY
cS2eUb81EWhjq67dBHW9umhDdDKzuILarAr8Bg+5hCu9nHV0ewOpwqlt167t
BCLW23asxZIiXpIe29+M7ZgxAPx9Jq9pN1/OlethodDa9Gp8ksv0k9iF/9e4
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
brFQw3dtq/S7nYnMuAIDP/8Nxxb7emZnAAA=

-->

</rfc>

