<?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.38 (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-03" 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="August" day="31"/>

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

    <abstract>


<?line 107?>

<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, are 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>


<?line 111?>

<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-Tokens 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 a 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"/> access token or an OpenID Connect <xref target="OpenIdConnect"/> ID token. We call this token a "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 Nested Txn-Token is a means for a workloads to record their processing of a Txn-Token and for downstream workloads to verify that a certain upstream workload has been invoked in the call chain.</t>

<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 anchor="replacement-txn-tokens"><name>Replacement Txn-Tokens</name>
<t>A service within a call chain may choose to replace the Txn-Token. This can typically happen due to the following reasons:</t>

<t><list style="symbols">
  <t>The current Txn-Token has become bloated (due to lots of nesting)</t>
  <t>The service wants to add to the context of the current Txn-Token</t>
  <t>The service wants to remove some intermediate signers' information to avoid leaking information about internal systems</t>
</list></t>

<t>To get a replacement Txn-Token, a service will request a new Txn-Token from the Txn-Token Service and provide the current Txn-Token and other parameters in the request. The Txn-Token service must exercise caution in what kinds of replacement requests it supports so as to not negate the entire value of Txn-Tokens.</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 is still 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>

<section anchor="basic-flow"><name>Basic Flow</name>
<t><xref target="fig-arch-basic"/> shows the basic flow of how Txn-Tokens are used in an a multi-workload environment.</t>

<figure title="Basic Transaction Tokens Architecture" anchor="fig-arch-basic"><artwork type="ascii-art"><![CDATA[
                                                     
     1    ┌──────────────┐    2      ┌──────────────┐
─────────▶│              ├───────────▶              │
          │   External   │           │  Txn-Token   │
     7    │   Endpoint   │    3      │   Service    │
◀─────────┤              ◀───────────│              │
          └────┬───▲─────┘           └──────────────┘
               │   │                                 
             4 │   │ 6                               
          ┌────▼───┴─────┐                           
          │              │                           
          │   Internal   │                           
          │  µ-service   │                           
          │              │                           
          └────┬───▲─────┘                           
               │   │                                 
               ▼   │                                 
                 o                                   
             5   o    6                              
                 o                                   
               │   ▲                                 
               │   │                                 
          ┌────▼───┴─────┐                           
          │              │                           
          │   Internal   │                           
          │  µ-service   │                           
          │              │                           
          └──────────────┘                                        
]]></artwork></figure>

<t><list style="numbers">
  <t>External endpoint is invoked using conventional authorization mechanism such as an OAuth 2.0 Access token</t>
  <t>External endpoint provides context and incoming authorization (e.g., access token) to the Txn-Token Service</t>
  <t>Txn-Token Service mints a Txn-Token that provides immutable context for the transaction and returns it to the requester</t>
  <t>The external endpoint initiates a call to an internal microservice and provides the Txn-Token as authorization</t>
  <t>Subsequent calls to other internal microservices use the same Txn-Token to authorize calls</t>
  <t>Responses are provided to callers based on successful authorization by the invoked microservices</t>
  <t>External client is provided a response to the external invocation</t>
</list></t>

</section>
<section anchor="nested-txn-token-flow"><name>Nested Txn-Token Flow</name>

<t><xref target="fig-arch-nested"/> shows an internal microservice generating a Nested Txn-Token in the flow</t>

<figure title="Flow with Nested Txn-Token generating service" anchor="fig-arch-nested"><artwork type="ascii-art"><![CDATA[
                                                     
     1    ┌──────────────┐    2      ┌──────────────┐
─────────▶│              ├───────────▶              │
          │   External   │           │  Txn-Token   │
     9    │   Endpoint   │    3      │   Service    │
◀─────────┤              ◀───────────│              │
          └────┬───▲─────┘           └──────────────┘
               │   │                                 
             4 │   │ 8                               
          ┌────▼───┴─────┐                           
          │              │                           
          │   Internal   │                           
          │  µ-service   │                           
          │              │                           
          └────┬───▲─────┘                           
               │   │                                 
               ▼   │                                 
                 o                                   
             5   o    8                              
               │ o ▲                                 
               │   │                                 
               │   │                                 
          ╔════▼═══╩═════╗                           
          ║              ╠──────┐                    
          ║   Internal   ║      │ 6                  
          ║  µ-service   ║      │                    
          ║              ◀──────┘                    
          ╚════╦═══▲═════╝                           
               │   │                                 
               ▼   │                                 
                 o                                   
             7   o    8                              
                 o                                   
               │   ▲                                 
               │   │                                 
          ┌────▼───┴─────┐                           
          │              │                           
          │   Internal   │                           
          │  µ-service   │                           
          │              │                           
          └──────────────┘                                          
]]></artwork></figure>

<t>In the diagram above, steps 1-5 are the same as in <xref target="basic-flow"/>.</t>

<t><list style="numbers" start="6">
  <t>An internal microservice determines it needs to generate a Nested Txn-Token. It uses its own private key to generate a Nested Txn-Token</t>
  <t>The internal microservice uses the Nested Txn-Token to authorize calls to downstream services</t>
  <t>Responses are provided to callers based on successful authorization by the invoked microservices</t>
  <t>External client is provided a response to the external invocation</t>
</list></t>

</section>
<section anchor="replacement-txn-token-flow"><name>Replacement Txn-Token Flow</name>

<t>An intermediate service may decide to obtain a replacement Txn-Token from the Txn-Token service. That flow is described below in <xref target="fig-arch-replacement"/></t>

<figure title="Replacement Txn-Token Flow" anchor="fig-arch-replacement"><artwork type="ascii-art"><![CDATA[
                                                     
     1    ┌──────────────┐    2      ┌──────────────┐
─────────▶│              ├───────────▶              │
          │   External   │           │              │
     10   │   Endpoint   │    3      │              │
◀─────────┤              ◀───────────│              │
          └────┬───▲─────┘           │              │
               │   │                 │              │
             4 │   │ 9               │              │
          ┌────▼───┴─────┐           │              │
          │              │           │              │
          │   Internal   │           │              │
          │  µ-service   │           │              │
          │              │           │              │
          └────┬───▲─────┘           │  Txn-Token   │
               │   │                 │   Service    │
               ▼   │                 │              │
                 o                   │              │
             5   o    9              │              │
               │ o ▲                 │              │
               │   │                 │              │
               │   │                 │              │
          ┌────▼───┴─────┐    6      │              │
          │              ├───────────▶              │
          │   Internal   │           │              │
          │  µ-service   │    7      │              │
          │              ◀───────────│              │
          └────┬───▲─────┘           │              │
               │   │                 │              │
               ▼   │                 └──────────────┘
                 o                                   
             8   o    9                              
                 o                                   
               │   ▲                                 
               │   │                                 
          ┌────▼───┴─────┐                           
          │              │                           
          │   Internal   │                           
          │  µ-service   │                           
          │              │                           
          └──────────────┘                           
]]></artwork></figure>

<t>In the diagram above, steps 1-5 are the same as in <xref target="basic-flow"/></t>

<t><list style="numbers" start="6">
  <t>An intermediate service determines that it needs to obtain a Replacement Txn-Token. It requests a Replacement Txn-Token from the Txn-Token Service. It passes the incoming Txn-Token in the request, along with any additional context it needs to send the Txn-Token Service.</t>
  <t>The Txn-Token Service responds with a replacement Txn-Token</t>
  <t>The service that requested the Replacement Txn-Token uses that Txn-Token for downstream call authorization</t>
  <t>Responses are provided to callers based on successful authorization by the invoked microservices</t>
  <t>External client is provided a response to the external invocation</t>
</list></t>

</section>
</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 an identifier that is used as the <spanx style="verb">aud</spanx> (audience) value in Txn-Tokens. The format of this identifier is a universal resource identifier. Each Trust Domain has exactly one Txn-Token Service.</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. Each Trust Domain has exactly one Txn-Token Service.</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 describes the required values 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="txn-token-service"><name>Txn-Token Service</name>
<t>A Txn-Token Service provides a OAuth 2.0 Token Exchange <xref target="RFC8693"/> endpoint that can respond to Txn-Token issuance requests. The token exchange requests it supports require extra parameters than those defined in the OAuth 2.0 Token Exchange <xref target="RFC8693"/> specification. The unique properties of the Txn-Token requests and responses are described below. The Txn-Token Service MAY optionally support other OAuth 2.0 endpoints and features, but that is not a requirement for it to be a Txn-Token Service.</t>

<t>Each Trust Domain MUST have exactly one Txn-Token Service.</t>

</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 successful 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>

<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 parameters are required in the Txn-Token Request by the OAuth 2.0 Token Exchange specification <xref target="RFC8693"/>:</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">rctx</spanx> , whose value is a JSON object. This object contains the request context, i.e. 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
&rctx=%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 describes required values 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: no-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="txn-token-service-responsibilities"><name>Txn-Token Service Responsibilities</name>
<t>A Txn-Token Service 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 as described in <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 as described in <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 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 anchor="mutual-authentication-of-the-txn-token-request"><name>Mutual Authentication of the Txn-Token Request</name>
<t>A Txn-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 named requesters</t>
  <t>It SHOULD rely on mechanisms, such as <xref target="Spiffe"/> or some other means of performing MTLS <xref target="RFC8446"/>, 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>
<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="txn-token-lifetime-1"><name>Txn-Token Lifetime</name>
<t>A Txn-Token is not resistant to replay attacks. A long-lived Txn-Token therefore represents a risk if it is stored in a file, discovered by an attacker, and then replayed. For this reason, a Txn-Token lifetime must be kept short, not exceeding the lifetime of a call-chain. Even for long-running "batch" jobs, a longer lived access token should be used to initiate the request to the batch endpoint. It then obtains short-lived Txn-Tokens that may be used to authorize the call to downstream services in the call-chain.</t>

<t>Because Txn-Tokens are short-lived, the Txn-Token response from the Txn-Token service does not contain the <spanx style="verb">refresh_token</spanx> field. A Txn-Token is also cannot be issued by presenting a <spanx style="verb">refresh_token</spanx>.</t>

<t>The <spanx style="verb">expires_in</spanx> and <spanx style="verb">scope</spanx> fields of the OAuth 2.0 Token Exchange specification <xref target="RFC8693"/> are also not used in Txn-Token responses. The <spanx style="verb">expires_in</spanx> is not required since the issued token has an <spanx style="verb">exp</spanx> field, which indicates the token lifetime. The <spanx style="verb">scope</spanx> field is omitted from the request and therefore omitted in the response.</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 external endpoint. If an Access Token is included in a Txn-Token, an attacker may extract the Access Token from the Txn-Token, and replay it to any Resource Server that can accept that Access Token. 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">
  <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="RFC8446">
  <front>
    <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <date month="August" year="2018"/>
    <abstract>
      <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
      <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8446"/>
  <seriesInfo name="DOI" value="10.17487/RFC8446"/>
</reference>

<reference anchor="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">
  <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">
  <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">
  <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">
  <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">
  <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>


<?line 569?>

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

</section>

    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
        <name>Contributors</name>
    <contact initials="K." surname="Burgin" fullname="Dr. Kelley W. Burgin, PhD.">
      <organization>MITRE Corporation</organization>
      <address>
        <email>kburgin@mitre.org</email>
      </address>
    </contact>
    <contact initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
      <organization>Arm Ltd.</organization>
      <address>
        <email>Hannes.Tschofenig@arm.com</email>
      </address>
    </contact>
    <contact initials="E." surname="Gilman" fullname="Evan Gilman">
      <organization>SPIRL</organization>
      <address>
        <email>evan@spirl.com</email>
      </address>
    </contact>
    </section>

  </back>

<!-- ##markdown-source:
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

-->

</rfc>

