<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-levy-wimse-headless-jwt-authentication-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="WIMSE Headless JWT Authentication and Authorization">WIMSE Headless JWT Authentication and Authorization</title>
    <seriesInfo name="Internet-Draft" value="draft-levy-wimse-headless-jwt-authentication-01"/>
    <author fullname="Marcel Levy">
      <organization>SPIRL</organization>
      <address>
        <email>heymarcel@gmail.com</email>
      </address>
    </author>
    <author fullname="Hirsch Singhal">
      <organization>GitHub</organization>
      <address>
        <email>hpsin@github.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="03"/>
    <area/>
    <workgroup>Workload Identity in Multi System Environments</workgroup>
    <keyword>workload</keyword>
    <keyword>identity</keyword>
    <keyword>credential</keyword>
    <keyword>exchange</keyword>
    <abstract>
      <?line 84?>

<t>In workload-to-service communication, a common pattern is for a
workload to present a JSON Web Token (JWT) to a remote endpoint in
order to obtain a temporary credential for the service it ultimately
needs to access. It is a partial adaptation for workloads of existing
flows designed for users. Implementing this pattern combines multiple
existing standards from different working groups and standards
bodies. Since this pattern is not described in a specification, it
leads to variability in interoperability. The purpose of this document
is to capture this common workload identity practice as an RFC in
order to obtain consistency and promote interoperability in industry.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://heymarcel.github.io/draft-ietf-wimse-headless-jwt-authentication/draft-levy-wimse-headless-jwt-authentication-practices.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-levy-wimse-headless-jwt-authentication/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Workload Identity in Multi System Environments  mailing list (<eref target="mailto:wimse@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/wimse/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/wimse/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/heymarcel/draft-ietf-wimse-headless-jwt-authentication"/>.</t>
    </note>
  </front>
  <middle>
    <?line 97?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>In workload-to-service communication, a common pattern is for a workload to use
a JSON Web Token (JWT) to identify and authenticate itself as part of a process
to obtain a temporary credential for the service it ultimately needs to access.
This is done by having the workload present an asynchronously-provisioned bearer
token in the form of a signed JWT to a remote endpoint that is associated with
the target service. The remote endpoint verifies the JWT and then provides a
temporary credential that the target service understands. The "bootstrap"
problem of discovering the original JWT issuer is solved by requesting a JSON
configuration document using the process described in OpenID Connect Discovery
<xref target="OIDC.Discovery"/> or OAuth 2.0 Authorization Server Metadata <xref target="RFC8414"/>.</t>
      <t>Since this pattern is not described in a specification, it leads to variability
in interoperability. The purpose of this document is to capture this common
workload identity practice as an RFC in order to obtain consistency and promote
interoperability in industry.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>All terminology in this document follows <xref target="I-D.ietf-wimse-arch"/>.</t>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

<section anchor="terminology">
        <name>Terminology</name>
        <t>This document uses the following terms:</t>
        <ul spacing="normal">
          <li>
            <t>Workload Platform</t>
          </li>
        </ul>
        <t>The underlying system which manages the deployment and scheduling of a Workload.
This includes but is not limited to operating systems, orchestration services,
and cloud providers.</t>
        <ul spacing="normal">
          <li>
            <t>Tenant</t>
          </li>
        </ul>
        <t>A logically isolated entity within a Workload Platform that represents a
distinct organizational or administrative boundary <xref target="OIPD"/>. A Workload Platform
may have a single Tenant, or multiple Tenants.</t>
        <ul spacing="normal">
          <li>
            <t>Exchange Service</t>
          </li>
        </ul>
        <t>A remote endpoint responsible for authenticating the identity of its
callers, and subsequently issuing a temporary credential that is compatible with
other services within the exchange service's domain. Examples of an
exchange service include an OAuth Authorization Server and AWS Security
Token Service.</t>
        <ul spacing="normal">
          <li>
            <t>Target Service</t>
          </li>
        </ul>
        <t>The service that the workload ultimately wants to access. The target service
accepts temporary credentials issued to the workload by the exchange service.
Examples include an OAuth resource server or AWS S3.</t>
      </section>
    </section>
    <section anchor="architecture-and-message-flow">
      <name>Architecture and Message Flow</name>
      <t><xref target="fig-message-flow"/> illustrates the OIDC-based message flow described in <xref target="jwt-authentication"/>:</t>
      <figure anchor="fig-message-flow">
        <name>OIDC message flow when used in a headless environment</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="528" width="424" viewBox="0 0 424 528" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 48,80 L 48,160" fill="none" stroke="black"/>
              <path d="M 56,288 L 56,352" fill="none" stroke="black"/>
              <path d="M 80,432 L 80,512" fill="none" stroke="black"/>
              <path d="M 88,168 L 88,288" fill="none" stroke="black"/>
              <path d="M 128,352 L 128,424" fill="none" stroke="black"/>
              <path d="M 152,160 L 152,280" fill="none" stroke="black"/>
              <path d="M 184,80 L 184,160" fill="none" stroke="black"/>
              <path d="M 184,432 L 184,512" fill="none" stroke="black"/>
              <path d="M 200,288 L 200,352" fill="none" stroke="black"/>
              <path d="M 296,224 L 296,288" fill="none" stroke="black"/>
              <path d="M 360,112 L 360,216" fill="none" stroke="black"/>
              <path d="M 360,288 L 360,320" fill="none" stroke="black"/>
              <path d="M 416,224 L 416,288" fill="none" stroke="black"/>
              <path d="M 48,80 L 184,80" fill="none" stroke="black"/>
              <path d="M 192,112 L 360,112" fill="none" stroke="black"/>
              <path d="M 48,160 L 184,160" fill="none" stroke="black"/>
              <path d="M 296,224 L 416,224" fill="none" stroke="black"/>
              <path d="M 56,288 L 200,288" fill="none" stroke="black"/>
              <path d="M 296,288 L 416,288" fill="none" stroke="black"/>
              <path d="M 208,320 L 360,320" fill="none" stroke="black"/>
              <path d="M 56,352 L 200,352" fill="none" stroke="black"/>
              <path d="M 80,432 L 184,432" fill="none" stroke="black"/>
              <path d="M 80,512 L 184,512" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="368,216 356,210.4 356,221.6" fill="black" transform="rotate(90,360,216)"/>
              <polygon class="arrowhead" points="216,320 204,314.4 204,325.6" fill="black" transform="rotate(180,208,320)"/>
              <polygon class="arrowhead" points="200,112 188,106.4 188,117.6" fill="black" transform="rotate(180,192,112)"/>
              <polygon class="arrowhead" points="160,280 148,274.4 148,285.6" fill="black" transform="rotate(90,152,280)"/>
              <polygon class="arrowhead" points="136,424 124,418.4 124,429.6" fill="black" transform="rotate(90,128,424)"/>
              <polygon class="arrowhead" points="96,168 84,162.4 84,173.6" fill="black" transform="rotate(270,88,168)"/>
              <g class="text">
                <text x="60" y="36">4)</text>
                <text x="100" y="36">Verify</text>
                <text x="168" y="36">signature</text>
                <text x="96" y="52">using</text>
                <text x="136" y="52">JWK</text>
                <text x="204" y="84">3)</text>
                <text x="252" y="84">Retrieve</text>
                <text x="308" y="84">JWKs</text>
                <text x="236" y="100">from</text>
                <text x="300" y="100">"jwks_uri"</text>
                <text x="116" y="116">Exchange</text>
                <text x="112" y="132">Service</text>
                <text x="12" y="196">2)</text>
                <text x="40" y="196">JWT</text>
                <text x="172" y="196">5)</text>
                <text x="216" y="196">Provide</text>
                <text x="52" y="212">Bearer</text>
                <text x="224" y="212">Temporary</text>
                <text x="48" y="228">Token</text>
                <text x="232" y="228">Credentials</text>
                <text x="328" y="260">JWT</text>
                <text x="372" y="260">Issuer</text>
                <text x="124" y="324">Workload</text>
                <text x="228" y="340">1)</text>
                <text x="272" y="340">Initial</text>
                <text x="356" y="340">provisioning</text>
                <text x="156" y="388">6)</text>
                <text x="220" y="388">Authenticate</text>
                <text x="292" y="388">with</text>
                <text x="208" y="404">temporary</text>
                <text x="292" y="404">credential</text>
                <text x="132" y="468">Target</text>
                <text x="136" y="484">Service</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
      4) Verify signature
         using JWK

     +----------------+ 3) Retrieve JWKs
     |                |    from "jwks_uri"
     |    Exchange    +<--------------------.
     |    Service     |                     |
     |                |                     |
     +----+-------+---+                     |
          ^       |                         |
2) JWT    |       | 5) Provide              |
   Bearer |       |    Temporary            v
   Token  |       |    Credentials  +-------+------+
          |       |                 |              |
          |       |                 |  JWT Issuer  |
          |       v                 |              |
      +---+-------+-----+           +-------+------+
      |                 |                   |
      |    Workload     |<------------------'
      |                 |  1) Initial provisioning
      +--------+--------+
               |
               |  6) Authenticate with
               |     temporary credential
               v
         +------------+
         |            |
         |   Target   |
         |   Service  |
         |            |
         +------------+
]]></artwork>
        </artset>
      </figure>
    </section>
    <section anchor="jwt-authentication">
      <name>JWT used for Authentication</name>
      <t>The overall message flow is seen in <xref target="fig-message-flow"/>, and this
section explains it in more detail. It assumes the workload has
previously acquired a JWT adhering to the profile specified in
<xref target="RFC7523"/>. JWT provisioning assumptions are described in more detail
in <xref target="jwt-provisioning"/>.</t>
      <ol spacing="normal" type="1"><li>
          <t>The workload calls a remote Exchange Service that is associated with
the target service and presents a JWT Bearer Token as specified in Section 4
of <xref target="RFC7523"/>.</t>
        </li>
        <li>
          <t>The Exchange Service takes the value from the <tt>iss</tt> claim and appends
<tt>/.well-known/openid-configuration</tt> to retrieve the JWT Issuer's
configuration via HTTP, as specified in <xref target="OIDC.Discovery"/>. Alternatively, the
OAuth 2.0 Authorization Server Metadata endpoint <xref target="RFC8414"/> may be used.</t>
        </li>
        <li>
          <t>The Exchange Service then retrieves the JWKs via HTTP from the <tt>jwks_uri</tt>
declared in the JWT Issuer's configuration response.</t>
        </li>
        <li>
          <t>Using the appropiate issuer key, the Exchange Service verifies the
signature of the JWT Bearer Token, and validates that the workload is
authorized to receive a temporary credential in its domain.</t>
        </li>
        <li>
          <t>Assuming successful verification, the Exchange Service then
responds to the workload with a temporary credential suitable for
use with the target service.</t>
        </li>
        <li>
          <t>The Workload then authenticates with the target service using the
temporary credential.</t>
        </li>
      </ol>
      <t>This document limits discussion to HTTP, as this is the protocol predominantly
used. Although other protocols are out of scope, this should not be read as a
limit on their future use.</t>
    </section>
    <section anchor="key-discovery">
      <name>Key Discovery</name>
      <t>Issuer key discovery follows the steps outlined in Section 4 of
<xref target="OIDC.Discovery"/>. The Exchange Service makes a request to a location that is
well-known according to <xref target="RFC5785"/>:</t>
      <figure anchor="example-config-request">
        <name>Example request to issuer to obtain OIDC configuration</name>
        <sourcecode type="text"><![CDATA[
GET /.well-known/openid-configuration HTTP/1.1
Host: example.com
]]></sourcecode>
      </figure>
      <t>For OAuth 2.0, the equivalent location is
<tt>/.well-known/oauth-authorization-server</tt>. In both cases, the requester expects
a JSON document containing configuration information. An example is provided
here:</t>
      <figure anchor="example-config-response">
        <name>Example issuer configuration response</name>
        <sourcecode type="json"><![CDATA[
{
  "issuer": "https://example.com",
  "jwks_uri": "https://example.com/.well-known/jwks.json",
  "authorization_endpoint": "https://example.com/auth",
  "token_endpoint": "https://example.com/token"
}
]]></sourcecode>
      </figure>
      <t>For the sake of the pattern described in this document, only the <tt>issuer</tt> and
<tt>jwks_uri</tt> fields are relevant.</t>
      <t>Note that this key discovery mechanism does not address the question of whether
the key itself should be trusted. This is a registration problem, and is
discussed further in <xref target="interoperability-considerations"/>.</t>
    </section>
    <section anchor="jwt-format-and-processing">
      <name>JWT Format and Processing Requirements</name>
      <section anchor="jwt-format">
        <name>JWT Format</name>
        <t>An example JWT adhering to <xref target="RFC7523"/> is seen in <xref target="example-jwt"/>. Although the
example uses a WIMSE workload identifier (<xref target="I-D.ietf-wimse-s2s-protocol"/>) in
the subject ("sub") claim, this is not a requirement.</t>
        <figure anchor="example-jwt">
          <name>Example RFC7523 JWT</name>
          <sourcecode type="json"><![CDATA[
{
  "iss": "https://issuer.example.org",
  "sub": "spiffe://example.org/ns/default/sa/customer-router-agent",
  "aud": "https://auth.example.com/token",
  "jti": "jwt-grant-id-x1y2z3a4",
  "exp": 1744845092,
  "iat": 1744841036
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="jwt-processing">
        <name>JWT Processsing</name>
        <section anchor="exchange-service-processing">
          <name>Exchange Service Processing</name>
          <t>The Exchange Service validates the JWT according to Section 3 in <xref target="RFC7523"/>,
with the following exceptions:</t>
          <ol spacing="normal" type="1"><li>
              <t>The "sub" (subject) claim does not identify either a resource owner or an
anonymous user.</t>
            </li>
            <li>
              <t>The "sub" claim need not correspond to the "client id" of an OAuth client.</t>
            </li>
          </ol>
          <t>The Exchange Service validates the signature using the key discovered by the
process described in <xref target="key-discovery"/>.</t>
        </section>
        <section anchor="workload-processing">
          <name>Workload Processing</name>
          <t>The workload is considered the client in this interaction. It can treat the JWT
acquired during provisioning as an opaque token. It must handle any error
reponse from the exchange service as per Section 3.2 in <xref target="RFC7523"/>.</t>
        </section>
      </section>
      <section anchor="jwt-provisioning">
        <name>JWT Provisioning</name>
        <t>The workload is provisioned with a JWT from a trusted source. This can be the
underlying Workload Platform, or a separate issuing system. Regardless of the
actual mechanism, JWT provisioning relies on a registration mechanism that
establishes mutually-trusted, secure connections between the workload and the
JWT provisioner.</t>
        <t>This provisioning mechanism illustrates a key difference from flows defined in
<xref target="RFC6749"/> and <xref target="OIDC.Core"/>, in that there are no client credentials or other
shared secrets required to bootstrap the flow.</t>
      </section>
    </section>
    <section anchor="trust-relationships">
      <name>Trust Relationships</name>
      <t>For functional headless JWT authentication, trust must be established
at multiple levels for the authentication flow to function. For an
authorization server to issue an access token to a workload, two
distinct trust relationships must exist:</t>
      <ol spacing="normal" type="1"><li>
          <t>The authorization server <bcp14>MUST</bcp14> trust the JWT issuer.</t>
        </li>
        <li>
          <t>The authorization server <bcp14>MUST</bcp14> trust the specific workload based on
claims within the JWT bearer token.</t>
        </li>
      </ol>
      <t>These two trust relationships serve different purposes and <bcp14>SHOULD</bcp14> be
managed independently as outlined below.</t>
      <t>An example of the differences between issuer and workload trust
relationships are three workload instances (A, B and C) that are all
presenting JWT Bearer Tokens issued from the same JWT Issuer. This
means that they build upon the trust relationship between the JWT
issuer and authorization server. One workload instance has a specific
workload trust relationship with the authorization server based on its
subject identifier (the <tt>sub</tt> claim). It requires a very specific
identifier which needs to match exactly. Another one makes use of a
hierarchy within the subject identifier and the last one uses a
combination of subject, audience and a custom claim as a basis for the
trust relationship.</t>
      <artwork><![CDATA[
           ┌──────────────────────┐
           │                      │
           │ Authorization Server │◄─────────────────┐
           │                      │                  │
           └──────────────────────┘        Issuer trust relationship
                ▲     ▲     ▲                        │
                │     │     │                        │
                │     │     │                        ▼
             Individual workload              ┌─────────────┐
             trust relationships              │             │
                │     │     │                 │ JWT Issuer  │
       ┌────────┘     │     └─────────┐       │             │
       │              │               │       └──────┬──────┘
       │              │               │              │
       │              │               │              │
       ▼              ▼               ▼              │
┌────────────┐  ┌────────────┐  ┌────────────┐   Issue JWT
│            │  │            │  │            │  Bearer Tokens
│ Workload A │  │ Workload B │  │ Workload C │       │
│            │  │            │  │            │       │
└────────────┘  └────────────┘  └────────────┘       │
       ▲              ▲                ▲             │
       └──────────────┴────────────────┴─────────────┘
]]></artwork>
      <section anchor="issuer-trust-relationship">
        <name>Issuer Trust Relationship</name>
        <t>This trust relationship is between the Authorization Server and the
JWT Issuer only. It represents the foundational level of trust and
determines if the JWT Bearer Token a workload presents is accepted.</t>
        <t>How this relationship is established is out of scope for this
document. A possible approach for this implementation is maintaining a
list of OAuth Authorization Server Metadata endpoints which instruct
the authorization server to trust a specific issuer including the
discovery of valid keys for that issuer via <tt>jwks</tt>.</t>
        <t>This trust is typically established at a global or tenant-wide level,
is subject to organizational policy and governance controls. Changes
to issuer trust affect all workloads associated with that issuer
simultaneously.</t>
      </section>
      <section anchor="workload-trust-relationship">
        <name>Workload Trust Relationship</name>
        <t>Workload trust establishment builds upon issuer trust and focuses
specifically on the relationship between the authorization server and
individual workloads. Once the Bearer JWT token is authenticated the
authorization server must determine if the specific workload
identified in the JWT claims should be authorized.</t>
        <t>The specifics of the claims are described in <xref target="jwt-format"/>.</t>
        <t>This trust is typically established individually and subject to
different policy and governance controls.</t>
      </section>
    </section>
    <section anchor="interoperability-considerations">
      <name>Interoperability Considerations</name>
      <t>In order for the workload to access the target service,</t>
      <ol spacing="normal" type="1"><li>
          <t>The JWT Issuer must be recognized by the Exchange Service,</t>
        </li>
        <li>
          <t>Claims in the JWT are inspected and used to determine the subject, or
principal, of the temporary credential issued to access the target service,</t>
        </li>
        <li>
          <t>And the resulting temporary credential must be authorized to access the
target service.</t>
        </li>
      </ol>
      <t>Step #1 requires the prior configuration of an explicit trust relationship
between the Exchange Service and the JWT Issuer, and depends on
vendor-specific configuration. Dynamic client registration standards (<xref target="RFC7591"/>
and <xref target="OIDC.Dynamic"/>) explicitly place it out of scope.</t>
      <t>Step #2 is a processing rule that is also previously-configured in an
implementation-dependent manner. As an example of current practice for
configuration of Steps #2 and #3, see <xref target="GitHub"/>.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document illustrates a common pattern in trust domain federation. However,
the "identity exchange" Step #2 in <xref target="interoperability-considerations"/> is not
standardized. In practice, the Workload Platform and the Resource Server
platform define principals differently, and the translation mechanism between
the two identities is implemented differently by each Resource Server platform.
This lack of standardization is not merely inconvenient; it is a rich source of
privilege escalation attacks. This is particularly true when both the Workload
Platform and the Resource Server platform are multi-tenanted.</t>
      <t>The following recommendations apply to configurations that control the
"identity exchange" step that controls the translation of the workload
JWT to a Resource Server identity:</t>
      <ol spacing="normal" type="1"><li>
          <t>When a Workload Platform contains multiple Tenants, the configuration <bcp14>SHOULD</bcp14>
rely on a JWT issuing key bound to a single Tenant of the workload platform,
rather than a single JWT issuing key for the Workload Platform.</t>
        </li>
        <li>
          <t>The configuration <bcp14>SHOULD</bcp14> use specific JWT claims to prevent any JWT signed by
the JWT Issuer from being used to impersonate any Resource Server principal.</t>
        </li>
        <li>
          <t>When a Workload Platform contains multiple Tenants, the configuration <bcp14>SHOULD
NOT</bcp14> solely rely on JWT claims that can be controlled by any Tenant. The
configuration <bcp14>MAY</bcp14> rely on a "tenant" claim, if the claim value is
issuer-controlled and corresponds to a single Tenant.</t>
        </li>
        <li>
          <t>The configuration <bcp14>SHOULD NOT</bcp14> permit the transcription of JWT claims to the
Resource Server principal without performing additional validation.</t>
        </li>
      </ol>
      <t>The security considerations in section 8 of <xref target="RFC7521"/> generally apply. As bearer
tokens, stolen JWTs are particularly valuable to attackers:</t>
      <ol spacing="normal" type="1"><li>
          <t>A secure channel (e.g. TLS) <bcp14>MUST</bcp14> be used when providing a JWT for
authentication.</t>
        </li>
        <li>
          <t>JWTs <bcp14>SHOULD</bcp14> be protected from unauthorized access using operating system or
platform access controls.</t>
        </li>
        <li>
          <t>JWT validity <bcp14>SHOULD</bcp14> be set to the shortest possible duration allowable by
overall system availability constraints.</t>
        </li>
      </ol>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <t>This section documents examples of the JWT headless authentication and
authorization pattern in use with various target service types.</t>
      <section anchor="oauth-resource-server">
        <name>OAuth Resource Server</name>
        <t>To use headless JWT authentication and authorization with a protected resource,
workloads use the following steps to obtain a suitable access token:</t>
        <ol spacing="normal" type="1"><li>
            <t>The workload calls an authorization server's token endpoint and presents a
JWT bearer token as specified in Section 4 of <xref target="RFC7523"/>.</t>
          </li>
          <li>
            <t>The authorization server verifies the signature of the JWT bearer token
following the procedure specified in this document, and validates that the
workload is authorized to receive an access token.</t>
          </li>
          <li>
            <t>Assuming successful verification, the authorization server then responds to
the workload with an access token suitable for use with the resource server.</t>
          </li>
        </ol>
      </section>
      <section anchor="aws-service-eg-s3">
        <name>AWS Service (e.g. S3)</name>
        <t>To use headless JWT authentication and authorization with an AWS service such
as S3, workloads use the following steps to obtain a suitable access token:</t>
        <ol spacing="normal" type="1"><li>
            <t>The workload makes an AssumeRoleWithWebIdentity call to the AWS STS
service and presents a JWT bearer token in addition to the ARN of the role
that the workload wishes to assume.</t>
          </li>
          <li>
            <t>AWS STS verifies the signature of the JWT bearer token following the
procedure specified in this document, and validates that the workload is
authorized to assume the requested role.</t>
          </li>
          <li>
            <t>Assuming successful verification, AWS STS then responds to the workload with
temporary credentials, including a secret access key, for use with any
further AWS service.</t>
          </li>
        </ol>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC5785">
          <front>
            <title>Defining Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Hammer-Lahav" initials="E." surname="Hammer-Lahav"/>
            <date month="April" year="2010"/>
            <abstract>
              <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5785"/>
          <seriesInfo name="DOI" value="10.17487/RFC5785"/>
        </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="RFC7521">
          <front>
            <title>Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="Y. Goland" initials="Y." surname="Goland"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification provides a framework for the use of assertions with OAuth 2.0 in the form of a new client authentication mechanism and a new authorization grant type. Mechanisms are specified for transporting assertions during interactions with a token endpoint; general processing rules are also specified.</t>
              <t>The intent of this specification is to provide a common framework for OAuth 2.0 to interwork with other identity systems using assertions and to provide alternative client authentication mechanisms.</t>
              <t>Note that this specification only defines abstract message flows and processing rules. In order to be implementable, companion specifications are necessary to provide the corresponding concrete instantiations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7521"/>
          <seriesInfo name="DOI" value="10.17487/RFC7521"/>
        </reference>
        <reference anchor="RFC7523">
          <front>
            <title>JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification defines the use of a JSON Web Token (JWT) Bearer Token as a means for requesting an OAuth 2.0 access token as well as for client authentication.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7523"/>
          <seriesInfo name="DOI" value="10.17487/RFC7523"/>
        </reference>
        <reference anchor="RFC7591">
          <front>
            <title>OAuth 2.0 Dynamic Client Registration Protocol</title>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="M. Machulak" initials="M." surname="Machulak"/>
            <author fullname="P. Hunt" initials="P." surname="Hunt"/>
            <date month="July" year="2015"/>
            <abstract>
              <t>This specification defines mechanisms for dynamically registering OAuth 2.0 clients with authorization servers. Registration requests send a set of desired client metadata values to the authorization server. The resulting registration responses return a client identifier to use at the authorization server and the client metadata values registered for the client. The client can then use this registration information to communicate with the authorization server using the OAuth 2.0 protocol. This specification also defines a set of common client metadata fields and values for clients to use during registration.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7591"/>
          <seriesInfo name="DOI" value="10.17487/RFC7591"/>
        </reference>
        <reference anchor="RFC8414">
          <front>
            <title>OAuth 2.0 Authorization Server Metadata</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client can use to obtain the information needed to interact with an OAuth 2.0 authorization server, including its endpoint locations and authorization server capabilities.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8414"/>
          <seriesInfo name="DOI" value="10.17487/RFC8414"/>
        </reference>
        <reference anchor="OIDC.Core" target="https://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>OpenID Connect Core 1.0 incorporating errata set 2</title>
            <author initials="N." surname="Sakimura">
              <organization/>
            </author>
            <author initials="J." surname="Bradley">
              <organization/>
            </author>
            <author initials="M." surname="Jones">
              <organization/>
            </author>
            <author initials="B." surname="de Medeiros">
              <organization/>
            </author>
            <author initials="C." surname="Mortimore">
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
        <reference anchor="OIDC.Discovery" target="https://openid.net/specs/openid-connect-discovery-1_0.html">
          <front>
            <title>OpenID Connect Discovery 1.0 incorporating errata set 2</title>
            <author initials="N." surname="Sakimura">
              <organization/>
            </author>
            <author initials="J." surname="Bradley">
              <organization/>
            </author>
            <author initials="M." surname="Jones">
              <organization/>
            </author>
            <author initials="E." surname="Jay">
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
        <reference anchor="OIDC.Dynamic" target="https://openid.net/specs/openid-connect-registration-1_0.html">
          <front>
            <title>OpenID Connect Dynamic Client Registration 1.0 incorporating errata set 2</title>
            <author initials="N." surname="Sakimura">
              <organization/>
            </author>
            <author initials="J." surname="Bradley">
              <organization/>
            </author>
            <author initials="M." surname="Jones">
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
        <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="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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-wimse-arch">
          <front>
            <title>Workload Identity in a Multi System Environment (WIMSE) Architecture</title>
            <author fullname="Joseph A. Salowey" initials="J. A." surname="Salowey">
              <organization>Venafi</organization>
            </author>
            <author fullname="Yaroslav Rosomakho" initials="Y." surname="Rosomakho">
              <organization>Zscaler</organization>
            </author>
            <author fullname="Hannes Tschofenig" initials="H." surname="Tschofenig">
              <organization>University of Applied Sciences Bonn-Rhein-Sieg</organization>
            </author>
            <date day="2" month="March" year="2025"/>
            <abstract>
              <t>   The increasing prevalence of cloud computing and micro service
   architectures has led to the rise of complex software functions being
   built and deployed as workloads, where a workload is defined as a
   running instance of software executing for a specific purpose.  This
   document discusses an architecture for designing and standardizing
   protocols and payloads for conveying workload identity and security
   context information.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-arch-04"/>
        </reference>
        <reference anchor="I-D.ietf-wimse-s2s-protocol">
          <front>
            <title>WIMSE Workload to Workload Authentication</title>
            <author fullname="Brian Campbell" initials="B." surname="Campbell">
              <organization>Ping Identity</organization>
            </author>
            <author fullname="Joe Salowey" initials="J." surname="Salowey">
              <organization>Venafi</organization>
            </author>
            <author fullname="Arndt Schwenkschuster" initials="A." surname="Schwenkschuster">
              <organization>SPIRL</organization>
            </author>
            <author fullname="Yaron Sheffer" initials="Y." surname="Sheffer">
              <organization>Intuit</organization>
            </author>
            <date day="19" month="June" year="2025"/>
            <abstract>
              <t>   The WIMSE architecture defines authentication and authorization for
   software workloads in a variety of runtime environments, from the
   most basic ones up to complex multi-service, multi-cloud, multi-
   tenant deployments.  This document defines the simplest, atomic unit
   of this architecture: the protocol between two workloads that need to
   verify each other's identity in order to communicate securely.  The
   scope of this protocol is a single HTTP request-and-response pair.
   To address the needs of different setups, we propose two protocols,
   one at the application level and one that makes use of trusted TLS
   transport.  These two protocols are compatible, in the sense that a
   single call chain can have some calls use one protocol and some use
   the other.  Workload A can call Workload B with mutual TLS
   authentication, while the next call from Workload B to Workload C
   would be authenticated at the application level.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-s2s-protocol-05"/>
        </reference>
        <reference anchor="GitHub" target="https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/about-security-hardening-with-openid-connect">
          <front>
            <title>About security hardening with OpenID Connect</title>
            <author>
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="OIPD" target="https://openid.net/specs/openid-provider-commands-1_0.html">
          <front>
            <title>OpenID Provider Commands 1.0</title>
            <author>
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 501?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank the following people for contributions
to this document: Evan Gilman, Pieter Kasselman, Darin McAdams, and
Arndt Schwenkschuster.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
N2Y6x/YrENv/B3QQJsVOVAAA

-->

</rfc>
