<?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.43 (Ruby 3.4.9) -->
<?rfc rfcedstyle="yes"?>
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc text-list-symbols="-o*+"?>
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-wimse-workload-identity-practices-08" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="Workload Identity">Workload Identity Practices</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-workload-identity-practices-08"/>
    <author initials="A." surname="Schwenkschuster" fullname="Arndt Schwenkschuster">
      <organization>Defakto Security</organization>
      <address>
        <email>arndts.ietf@gmail.com</email>
      </address>
    </author>
    <author initials="Y." surname="Rosomakho" fullname="Yaroslav Rosomakho">
      <organization>Zscaler</organization>
      <address>
        <email>yrosomakho@zscaler.com</email>
      </address>
    </author>
    <date year="2026" month="October" day="30"/>
    <area>Applications and Real-Time</area>
    <workgroup>Workload Identity in Multi System Environments</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 76?>

<t>This document describes industry practices for providing secure identities
to workloads in container orchestration, cloud platforms, and other workload
platforms. It explains how workloads obtain credentials for external
authentication purposes, without managing long-lived secrets directly. It does
not take into account the standards work in progress for the WIMSE architecture
and associated protocols.</t>
    </abstract>
  </front>
  <middle>
    <?line 85?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Just like people, workloads need identifiers and associated credentials to
authenticate with other systems, such as databases, web servers, or other
workloads. The challenge for workloads is to obtain a credential that can
be used to authenticate with these resources without managing secrets directly,
for instance, an OAuth 2.0 access token.</t>
      <t>The common use of the OAuth 2.0 framework <xref target="OAUTH-FRAMEWORK"/> in this context poses
challenges, particularly in managing credentials. To address this, the industry
has shifted to a federation-based approach where credentials of the underlying
workload platform are used to authenticate to identity providers, which in
turn, issue credentials that grant access to resources.</t>
      <t>Traditionally, workloads were provisioned with static client credentials (e.g.,
passwords, API keys) and used the corresponding flow as described in <xref section="1.3.4" sectionFormat="of" target="OAUTH-FRAMEWORK"/>
to retrieve an OAuth 2.0 access token. This model presents a number of security
and maintenance issues. Secrets need to be provisioned and rotated, which requires
either automation to be built, or periodic manual effort. Secrets may be stolen
and used by attackers to impersonate the workload. Flows outside of the
OAuth 2.0 framework (such as direct API keys or HTTP basic authentication)
suffer from the same issues.</t>
      <t>Instead of provisioning secret material to the workload, one solution to this
problem is to attest the workload by using its underlying platform. Many
platforms provision workloads with a credential, such as a JWT
<xref target="JWT"/>. Cryptographically signed by the platform's issuer,
this credential attests the workload and its attributes.</t>
      <t><xref target="fig-overview"/> illustrates a generic pattern that is seen across many workload
platforms, more concrete variations are found in <xref target="practices"/>.</t>
      <figure anchor="fig-overview">
        <name>Generic workload identity pattern</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="432" width="528" viewBox="0 0 528 432" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 48,32 L 48,256" fill="none" stroke="black"/>
              <path d="M 64,64 L 64,128" fill="none" stroke="black"/>
              <path d="M 64,352 L 64,416" fill="none" stroke="black"/>
              <path d="M 112,128 L 112,344" fill="none" stroke="black"/>
              <path d="M 128,128 L 128,320" fill="none" stroke="black"/>
              <path d="M 184,128 L 184,208" fill="none" stroke="black"/>
              <path d="M 208,64 L 208,128" fill="none" stroke="black"/>
              <path d="M 224,352 L 224,416" fill="none" stroke="black"/>
              <path d="M 352,64 L 352,128" fill="none" stroke="black"/>
              <path d="M 384,176 L 384,240" fill="none" stroke="black"/>
              <path d="M 384,288 L 384,352" fill="none" stroke="black"/>
              <path d="M 504,64 L 504,128" fill="none" stroke="black"/>
              <path d="M 504,176 L 504,240" fill="none" stroke="black"/>
              <path d="M 504,288 L 504,352" fill="none" stroke="black"/>
              <path d="M 520,32 L 520,256" fill="none" stroke="black"/>
              <path d="M 48,32 L 520,32" fill="none" stroke="black"/>
              <path d="M 64,64 L 208,64" fill="none" stroke="black"/>
              <path d="M 352,64 L 504,64" fill="none" stroke="black"/>
              <path d="M 216,96 L 344,96" fill="none" stroke="black"/>
              <path d="M 64,128 L 208,128" fill="none" stroke="black"/>
              <path d="M 352,128 L 504,128" fill="none" stroke="black"/>
              <path d="M 384,176 L 504,176" fill="none" stroke="black"/>
              <path d="M 184,208 L 376,208" fill="none" stroke="black"/>
              <path d="M 384,240 L 504,240" fill="none" stroke="black"/>
              <path d="M 48,256 L 520,256" fill="none" stroke="black"/>
              <path d="M 384,288 L 504,288" fill="none" stroke="black"/>
              <path d="M 128,320 L 376,320" fill="none" stroke="black"/>
              <path d="M 64,352 L 224,352" fill="none" stroke="black"/>
              <path d="M 384,352 L 504,352" fill="none" stroke="black"/>
              <path d="M 64,416 L 224,416" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="384,320 372,314.4 372,325.6" fill="black" transform="rotate(0,376,320)"/>
              <polygon class="arrowhead" points="384,208 372,202.4 372,213.6" fill="black" transform="rotate(0,376,208)"/>
              <polygon class="arrowhead" points="352,96 340,90.4 340,101.6" fill="black" transform="rotate(0,344,96)"/>
              <polygon class="arrowhead" points="224,96 212,90.4 212,101.6" fill="black" transform="rotate(180,216,96)"/>
              <polygon class="arrowhead" points="120,344 108,338.4 108,349.6" fill="black" transform="rotate(90,112,344)"/>
              <g class="text">
                <text x="404" y="52">Workload</text>
                <text x="476" y="52">Platform</text>
                <text x="132" y="100">Workload</text>
                <text x="404" y="100">Platform</text>
                <text x="468" y="100">Issuer</text>
                <text x="236" y="116">1)</text>
                <text x="288" y="116">push/pull</text>
                <text x="296" y="132">credentials</text>
                <text x="228" y="196">A)</text>
                <text x="268" y="196">access</text>
                <text x="444" y="212">Resource</text>
                <text x="16" y="308">B1)</text>
                <text x="68" y="308">federate</text>
                <text x="160" y="308">B2)</text>
                <text x="204" y="308">access</text>
                <text x="444" y="324">Resource</text>
                <text x="108" y="388">Identity</text>
                <text x="180" y="388">Provider</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
     +----------------------------------------------------------+
     |                                        Workload Platform |
     | +-----------------+                 +------------------+ |
     | |                 |                 |                  | |
     | |    Workload     |<--------------->|  Platform Issuer | |
     | |                 |  1) push/pull   |                  | |
     | +-----+-+------+--+     credentials +------------------+ |
     |       | |      |                                         |
     |       | |      |                                         |
     |       | |      |                        +--------------+ |
     |       | |      |    A) access           |              | |
     |       | |      +----------------------->|   Resource   | |
     |       | |                               |              | |
     |       | |                               +--------------+ |
     +-------+-+------------------------------------------------+
             | |
             | |                               +--------------+
B1) federate | |  B2) access                   |              |
             | +------------------------------>|   Resource   |
             v                                 |              |
       +-------------------+                   +--------------+
       |                   |
       | Identity Provider |
       |                   |
       +-------------------+
]]></artwork>
        </artset>
      </figure>
      <t>The figure outlines the following steps which are applicable in any pattern.</t>
      <ul spacing="normal">
        <li>
          <t>1) The platform issues a credential to represent the workload identity after
   verification of workload environment and attributes. The way this is
   achieved varies by platform, for instance, the credential can be pushed
   to the workload or pulled by the workload. A workload may obtain
   multiple credentials from the platform, each with its own audience and
   lifetime, tailored to the specific resource or Identity Provider it
   needs to interact with. See <xref target="general-requirements"/> and <xref target="audience"/>
   for more details and security implications.</t>
        </li>
        <li>
          <t>A) The credential can give the workload direct access to resources within the
   platform or the platform itself, for example to perform infrastructure
   operations.</t>
        </li>
        <li>
          <t>B1) The workload uses a credential to federate to an Identity Provider. This
    step is optional and only needed when accessing outside resources. The
    Identity Provider validates the platform-issued credential, and in return,
    issues a new credential, such as an OAuth 2.0 access token, that the
    workload can use to access resources in the Identity Provider's domain.</t>
        </li>
        <li>
          <t>B2) Using the credential obtained at step B1, the workload accesses resources
    outside of the platform.</t>
        </li>
      </ul>
      <t>Accessing different outside resources may require the workload to repeat steps
B1) and B2), federating to multiple Identity Providers. It is also possible that
step 1) needs to be repeated, for instance in situations where the
platform-issued credential is scoped to accessing a certain resource or
federating to a specific Identity Provider.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <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>
    <section anchor="delivery-patterns">
      <name>Delivery Patterns</name>
      <t>Credentials can be provisioned to the workload by different mechanisms, each of which has
its own advantages, challenges, and security risks. The following
section highlights the pros and cons of common solutions. Security
recommendations for these methods are covered in
<xref target="security-credential-delivery"/>.</t>
      <section anchor="filesystem">
        <name>Filesystem</name>
        <t>Filesystem delivery allows both container secret injection and access control.
Many solutions find the main benefit in the asynchronous provisioning of the
credentials to the workload. This allows the workload to run independently of
the credentials update, and to access them by reading the file.</t>
        <t>Credential rotation requires a solution to detect soon-to-expire secrets as a
rotation trigger. One practice is that the new secret is renewed <em>before</em> the
old secret is invalidated. For example, the solution can choose to update the
secret an hour before it is invalidated. This gives applications time to update
without downtime.</t>
        <t>Because credentials are written to a shared filesystem, the solution is responsible
for ensuring atomicity when updating them. Writes <bcp14>SHOULD</bcp14> be performed in a way
that prevents workloads from observing a partially written file, for example by
writing to a temporary file and renaming it atomically. Without atomicity a
workload can read a truncated or mixed-generation credential and fail to
authenticate, or fall back to a credential it should no longer use. Not every
filesystem or mount mechanism offers an atomic replace operation; where one is
unavailable, workloads reading the credential need to tolerate a failed read and
retry, and renewing the credential well before it expires leaves room for such a
retry. Solutions are expected to perform a flush operation immediately after the
update to minimize the chance of race conditions and ensure durability.</t>
      </section>
      <section anchor="local-apis">
        <name>Local APIs</name>
        <t>In this pattern, the workload obtains credentials by communicating with a
Local API exposed by the credential issuer. Implementations commonly use UNIX
domain sockets (e.g., SPIFFE), loopback interfaces, or link-local "magic addresses"
169.254.169.254 commonly used for cloud provider Instance Metadata Services as
the transport mechanism.</t>
        <t>Local APIs support re-provisioning of updated credentials, either on demand
or through persistent connections that enable the issuer to push new credentials.
This enables the use of short-lived, narrowly scoped credentials, improving
security posture compared to long-lived secrets.</t>
        <t>The security of this approach relies heavily on network isolation to prevent
unauthorized access to the Local API. In addition, the pattern requires client-side
code that is specific to the exposed API, which may introduce portability challenges
across platforms and providers. Further security considerations for Local APIs are
discussed in <xref target="local-api-security"/>.</t>
      </section>
      <section anchor="env-vars">
        <name>Environment Variables</name>
        <t>Injecting the credentials into the environment variables allows for simple and
fast deployments. Applications can directly access them through system-level
mechanisms, e.g., through the <tt>env</tt> command in Linux. Note that environment
variables are static in nature in that they cannot be changed after application
initialization.</t>
        <t>While environment variables are a common delivery pattern, they are highly
susceptible to leakage through logging, process inspection, error reporting, and
other means. Filesystem delivery (<xref target="filesystem"/>) or Local APIs
(<xref target="local-apis"/>) are therefore preferred, and environment variables <bcp14>MUST NOT</bcp14> be used for such credentials
where the platform offers one of these alternatives. Some platforms offer no
other delivery pattern; that case, along with the underlying security
considerations, is discussed in <xref target="security-credential-delivery-env"/>.</t>
      </section>
    </section>
    <section anchor="practices">
      <name>Practices</name>
      <t>The following practices outline more concrete examples of platforms, including
their delivery patterns.</t>
      <section anchor="kubernetes">
        <name>Kubernetes</name>
        <t>In Kubernetes, machine identity is implemented through "service accounts"
<xref target="KubernetesServiceAccount"/>. Service accounts can be explicitly created, or a
default one is automatically assigned. Service accounts use JSON Web Tokens
(<xref target="JWT"/>) as their credential format, with the Kubernetes Control Plane
acting as the signer.</t>
        <t>Service accounts serve multiple authentication purposes within the Kubernetes
ecosystem. They are used to authenticate to Kubernetes APIs, between different
workloads and to access external resources. This latter use case is particularly
relevant for the purposes of this document.</t>
        <t>To programmatically use service accounts, workloads can:</t>
        <ul spacing="normal">
          <li>
            <t>Have the token "projected" into the file system of the workload. This is
similar to volume mounting in non-Kubernetes environments, and is commonly
referred to as "projected service account token".</t>
          </li>
          <li>
            <t>Use the Token Request API <xref target="TokenRequestV1"/> of the control plane. This option,
however, requires an initial projected service account token as a means of
authentication.</t>
          </li>
        </ul>
        <t>Both options allow workloads to:</t>
        <ul spacing="normal">
          <li>
            <t>Specify a custom audience. Possible audiences can be restricted based on
policy.</t>
          </li>
          <li>
            <t>Specify a custom lifetime. Maximum lifetime can be restricted by policy.</t>
          </li>
          <li>
            <t>Bind the token lifetime to an object lifecycle. This allows the token to be
invalidated when the object is deleted. For example, this may happen when a
Kubernetes Deployment is removed from the server. Note that invalidation is
only detected when the Token Review API <xref target="TokenReviewV1"/> of Kubernetes is
used to validate the token.</t>
          </li>
          <li>
            <t>Obtain multiple tokens, each with its own customized audience and lifetime.
For example, a workload may obtain one token audienced for the Kubernetes API
server, another for an internal service, and yet another for federation with
an external Identity Provider. See <xref target="audience"/> for more details and security
implications.</t>
          </li>
        </ul>
        <t>To validate service account tokens, Kubernetes allows workloads to:</t>
        <ul spacing="normal">
          <li>
            <t>Make use of the Token Review API <xref target="TokenReviewV1"/>. This API introspects the
token, makes sure it hasn't been invalidated and returns the claims.</t>
          </li>
          <li>
            <t>Mount the public keys used to sign the tokens into the file system of the
workload. This allows workloads to validate a token's signature without
calling the Token Review API.</t>
          </li>
          <li>
            <t>Optionally, a JSON Web Key Set <xref target="JWK"/> is exposed via a web server. This
allows external systems to validate Service Account Tokens independently,
without requiring direct network access to, or credentials for, the Kubernetes
Control Plane API.</t>
          </li>
        </ul>
        <figure anchor="fig-kubernetes">
          <name>Kubernetes workload identity in practice</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="496" width="488" viewBox="0 0 488 496" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 80,32 L 80,320" fill="none" stroke="black"/>
                <path d="M 96,144 L 96,208" fill="none" stroke="black"/>
                <path d="M 96,416 L 96,480" fill="none" stroke="black"/>
                <path d="M 112,208 L 112,408" fill="none" stroke="black"/>
                <path d="M 128,208 L 128,384" fill="none" stroke="black"/>
                <path d="M 136,96 L 136,144" fill="none" stroke="black"/>
                <path d="M 160,208 L 160,256" fill="none" stroke="black"/>
                <path d="M 176,144 L 176,208" fill="none" stroke="black"/>
                <path d="M 264,64 L 264,128" fill="none" stroke="black"/>
                <path d="M 272,416 L 272,480" fill="none" stroke="black"/>
                <path d="M 288,160 L 288,192" fill="none" stroke="black"/>
                <path d="M 328,136 L 328,160" fill="none" stroke="black"/>
                <path d="M 344,224 L 344,288" fill="none" stroke="black"/>
                <path d="M 344,352 L 344,416" fill="none" stroke="black"/>
                <path d="M 368,160 L 368,192" fill="none" stroke="black"/>
                <path d="M 384,64 L 384,128" fill="none" stroke="black"/>
                <path d="M 464,224 L 464,288" fill="none" stroke="black"/>
                <path d="M 464,352 L 464,416" fill="none" stroke="black"/>
                <path d="M 480,32 L 480,320" fill="none" stroke="black"/>
                <path d="M 80,32 L 480,32" fill="none" stroke="black"/>
                <path d="M 264,64 L 384,64" fill="none" stroke="black"/>
                <path d="M 136,96 L 256,96" fill="none" stroke="black"/>
                <path d="M 264,128 L 384,128" fill="none" stroke="black"/>
                <path d="M 96,144 L 176,144" fill="none" stroke="black"/>
                <path d="M 288,160 L 368,160" fill="none" stroke="black"/>
                <path d="M 184,176 L 288,176" fill="none" stroke="black"/>
                <path d="M 288,192 L 368,192" fill="none" stroke="black"/>
                <path d="M 96,208 L 176,208" fill="none" stroke="black"/>
                <path d="M 344,224 L 464,224" fill="none" stroke="black"/>
                <path d="M 160,256 L 336,256" fill="none" stroke="black"/>
                <path d="M 344,288 L 464,288" fill="none" stroke="black"/>
                <path d="M 80,320 L 480,320" fill="none" stroke="black"/>
                <path d="M 344,352 L 464,352" fill="none" stroke="black"/>
                <path d="M 128,384 L 336,384" fill="none" stroke="black"/>
                <path d="M 96,416 L 272,416" fill="none" stroke="black"/>
                <path d="M 344,416 L 464,416" fill="none" stroke="black"/>
                <path d="M 96,480 L 272,480" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="344,384 332,378.4 332,389.6" fill="black" transform="rotate(0,336,384)"/>
                <polygon class="arrowhead" points="344,256 332,250.4 332,261.6" fill="black" transform="rotate(0,336,256)"/>
                <polygon class="arrowhead" points="336,136 324,130.4 324,141.6" fill="black" transform="rotate(270,328,136)"/>
                <polygon class="arrowhead" points="264,96 252,90.4 252,101.6" fill="black" transform="rotate(0,256,96)"/>
                <polygon class="arrowhead" points="192,176 180,170.4 180,181.6" fill="black" transform="rotate(180,184,176)"/>
                <polygon class="arrowhead" points="120,408 108,402.4 108,413.6" fill="black" transform="rotate(90,112,408)"/>
                <g class="text">
                  <text x="420" y="52">Kubernetes</text>
                  <text x="160" y="84">A1)</text>
                  <text x="204" y="84">access</text>
                  <text x="296" y="100">API</text>
                  <text x="340" y="100">Server</text>
                  <text x="348" y="148">1)</text>
                  <text x="392" y="148">request</text>
                  <text x="448" y="148">token</text>
                  <text x="196" y="164">2)</text>
                  <text x="244" y="164">schedule</text>
                  <text x="136" y="180">Pod</text>
                  <text x="328" y="180">Kubelet</text>
                  <text x="200" y="244">A2)</text>
                  <text x="244" y="244">access</text>
                  <text x="404" y="260">Resource</text>
                  <text x="16" y="372">B1)</text>
                  <text x="68" y="372">federate</text>
                  <text x="152" y="372">B2)</text>
                  <text x="196" y="372">access</text>
                  <text x="404" y="388">Resource</text>
                  <text x="148" y="452">Identity</text>
                  <text x="220" y="452">Provider</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
         +-------------------------------------------------+
         |                                     Kubernetes  |
         |                      +--------------+           |
         |        A1) access    |              |           |
         |      +-------------->|  API Server  |           |
         |      |               |              |           |
         |      |               +--------------+           |
         | +----+----+                  ^ 1) request token |
         | |         | 2) schedule +----+----+             |
         | |   Pod   |<------------+ Kubelet |             |
         | |         |             +---------+             |
         | +-+-+---+-+                                     |
         |   | |   |                      +--------------+ |
         |   | |   |   A2) access         |              | |
         |   | |   +--------------------->|   Resource   | |
         |   | |                          |              | |
         |   | |                          +--------------+ |
         |   | |                                           |
         +---+-+-------------------------------------------+
             | |
             | |                          +--------------+
B1) federate | | B2) access               |              |
             | +------------------------->|   Resource   |
             v                            |              |
           +---------------------+        +--------------+
           |                     |
           |  Identity Provider  |
           |                     |
           +---------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-kubernetes"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The kubelet is tasked to schedule a Pod. Based on configuration, it requests
   one or more Service Account Tokens from the Kubernetes API server, each
   scoped to its intended use, for example with a distinct audience.</t>
          </li>
          <li>
            <t>2) The kubelet starts the Pod and, based on the configuration of the Pod,
   delivers the token(s) to the containers within the Pod.</t>
          </li>
        </ul>
        <t>Now, the Pod can use the tokens to:</t>
        <ul spacing="normal">
          <li>
            <t>A1) Access the Kubernetes Control Plane, using a token audienced for the
   API server, considering it has access to it.</t>
          </li>
          <li>
            <t>A2) Access other resources within the cluster, for instance, other Pods, using
   a token audienced for the target resource.</t>
          </li>
          <li>
            <t>B) Access resources outside of the cluster:</t>
          </li>
          <li>
            <t>B1) The application within the Pod uses a Service Account Token audienced
    for the external Identity Provider to federate to that Identity Provider
    outside of the Kubernetes Cluster. The Identity Provider validates the token
    and issues a new credential to the workload, such as an OAuth 2.0 access
    token.</t>
          </li>
          <li>
            <t>B2) Using the credential issued in step C1, the application within the Pod
    accesses resources outside of the cluster.</t>
          </li>
        </ul>
        <t>The tokens presented at steps A1, A2 and B1 <bcp14>MUST</bcp14> be different tokens with different
audiences. The token issued by Kubernetes is a Bearer token which enables any holder
to use it, including any party to which it is presented. For example in <xref target="fig-kubernetes"/>:
if the token of step A1 carries the same audience at steps A1 and B1 the Identity
Provider is able to impersonate the workload at the Kubernetes API Server. See
<xref target="audience"/> for security considerations.</t>
        <t>As an example, the following JSON illustrates the claims contained in a Kubernetes Service
Account token.</t>
        <figure anchor="fig-kubernetes-token">
          <name>Example Kubernetes Service Account Token claims</name>
          <sourcecode type="json"><![CDATA[
{
  "aud": [
    # matches the requested audiences, or the API server's
    # default audiences when none are explicitly requested
    "https://kubernetes.default.svc"
  ],
  "exp": 1731613413,
  "iat": 1700077413,
  "iss":
    # matches the first value passed to the
    # --service-account-issuer flag
    "https://kubernetes.default.svc",
  "jti":
    # ServiceAccountTokenJTI feature must be enabled
    # for the claim to be present
    "ea28ed49-2e11-4280-9ec5-bc3d1d84661a",
  "kubernetes.io": {
    "namespace": "my-namespace",
    "node": {
      # ServiceAccountTokenPodNodeInfo feature must be enabled
      # for the API server to add this node reference claim
      "name": "127.0.0.1",
      "uid": "58456cb0-dd00-45ed-b797-5578fdceaced"
    },
    "pod": {
      "name": "my-workload-69cbfb9798-jv9gn",
      "uid": "778a530c-b3f4-47c0-9cd5-ab018fb64f33"
    },
    "serviceaccount": {
      "name": "my-workload",
      "uid": "a087d5a0-e1dd-43ec-93ac-f13d89cd13af"
    },
    "warnafter": 1700081020
  },
  "nbf": 1700077413,
  "sub": "system:serviceaccount:my-namespace:my-workload"
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="spiffe">
        <name>Secure Production Identity Framework For Everyone (SPIFFE)</name>
        <t>The Secure Production Identity Framework For Everyone, also known as SPIFFE <xref target="SPIFFE"/>, is
a Cloud Native Computing Foundation (CNCF) project that defines a "Workload API"
to deliver machine identity to workloads. Workloads can retrieve identity
credentials in one of two forms:</t>
        <ul spacing="normal">
          <li>
            <t>X509-SVID, an X.509 certificate containing the workload's SPIFFE ID in the Subject
Alternative Name (SAN) URI field, along with the corresponding key pair.</t>
          </li>
          <li>
            <t>JWT-SVID, a signed JWT containing the workload's SPIFFE ID in the <tt>"sub"</tt>
claim.</t>
          </li>
        </ul>
        <t>The Workload API does not require clients to authenticate themselves. Instead,
the API implementation identifies workloads by collecting contextual
information from the environment, such as process attributes, kernel metadata,
or orchestrator-provided labels. This out-of-band identification allows
workloads to obtain their identity credentials without needing a pre-existing
secret, avoiding the bootstrapping problem of requiring a credential to obtain
a credential.</t>
        <t>Workloads may request multiple JWT-SVIDs, each with a distinct audience, to
interact with different resources or Identity Providers. As with all patterns
in this document, it is best practice to use a separate credential for each
target; see <xref target="audience"/> for details.</t>
        <t>For validation, SPIFFE defines a "trust bundle" per trust domain. A trust
bundle is a set of public keys encoded in JWK format <xref target="JWK"/> that can be
used to validate credentials. For JWT-SVIDs, the bundle contains signing keys
identified by a <tt>"use"</tt> value of <tt>jwt-svid</tt>. For X509-SVIDs, the bundle contains
CA certificates identified by a <tt>"use"</tt> value of <tt>x509-svid</tt>. Trust bundle
contents can be retrieved from the Workload API or from a dedicated SPIFFE
Bundle Endpoint (see <xref target="SPIFFE"/>).</t>
        <t>The following figure illustrates how a workload can use its SPIFFE identity to
access a protected resource outside of the trust domain. The example uses a
JWT-SVID, but using an X509-SVID is also possible.</t>
        <figure anchor="fig-spiffe">
          <name>Workload identity in SPIFFE</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="416" width="520" viewBox="0 0 520 416" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 56,32 L 56,240" fill="none" stroke="black"/>
                <path d="M 64,336 L 64,400" fill="none" stroke="black"/>
                <path d="M 72,80 L 72,144" fill="none" stroke="black"/>
                <path d="M 112,144 L 112,328" fill="none" stroke="black"/>
                <path d="M 128,144 L 128,304" fill="none" stroke="black"/>
                <path d="M 168,144 L 168,192" fill="none" stroke="black"/>
                <path d="M 192,80 L 192,144" fill="none" stroke="black"/>
                <path d="M 240,336 L 240,400" fill="none" stroke="black"/>
                <path d="M 368,80 L 368,128" fill="none" stroke="black"/>
                <path d="M 368,160 L 368,224" fill="none" stroke="black"/>
                <path d="M 368,272 L 368,336" fill="none" stroke="black"/>
                <path d="M 488,80 L 488,128" fill="none" stroke="black"/>
                <path d="M 488,160 L 488,224" fill="none" stroke="black"/>
                <path d="M 488,272 L 488,336" fill="none" stroke="black"/>
                <path d="M 512,32 L 512,240" fill="none" stroke="black"/>
                <path d="M 56,32 L 512,32" fill="none" stroke="black"/>
                <path d="M 72,80 L 192,80" fill="none" stroke="black"/>
                <path d="M 368,80 L 488,80" fill="none" stroke="black"/>
                <path d="M 192,96 L 360,96" fill="none" stroke="black"/>
                <path d="M 368,128 L 488,128" fill="none" stroke="black"/>
                <path d="M 72,144 L 192,144" fill="none" stroke="black"/>
                <path d="M 368,160 L 488,160" fill="none" stroke="black"/>
                <path d="M 168,192 L 360,192" fill="none" stroke="black"/>
                <path d="M 368,224 L 488,224" fill="none" stroke="black"/>
                <path d="M 56,240 L 512,240" fill="none" stroke="black"/>
                <path d="M 368,272 L 488,272" fill="none" stroke="black"/>
                <path d="M 128,304 L 360,304" fill="none" stroke="black"/>
                <path d="M 64,336 L 240,336" fill="none" stroke="black"/>
                <path d="M 368,336 L 488,336" fill="none" stroke="black"/>
                <path d="M 64,400 L 240,400" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="368,304 356,298.4 356,309.6" fill="black" transform="rotate(0,360,304)"/>
                <polygon class="arrowhead" points="368,192 356,186.4 356,197.6" fill="black" transform="rotate(0,360,192)"/>
                <polygon class="arrowhead" points="368,96 356,90.4 356,101.6" fill="black" transform="rotate(0,360,96)"/>
                <polygon class="arrowhead" points="120,328 108,322.4 108,333.6" fill="black" transform="rotate(90,112,328)"/>
                <g class="text">
                  <text x="372" y="52">SPIFFE</text>
                  <text x="424" y="52">Trust</text>
                  <text x="476" y="52">Domain</text>
                  <text x="220" y="84">1)</text>
                  <text x="248" y="84">Get</text>
                  <text x="300" y="84">JWT-SVID</text>
                  <text x="428" y="100">SPIFFE</text>
                  <text x="132" y="116">Workload</text>
                  <text x="412" y="116">Workload</text>
                  <text x="464" y="116">API</text>
                  <text x="220" y="180">A)</text>
                  <text x="260" y="180">access</text>
                  <text x="428" y="196">Resource</text>
                  <text x="16" y="292">B1)</text>
                  <text x="68" y="292">federate</text>
                  <text x="152" y="292">B2)</text>
                  <text x="196" y="292">access</text>
                  <text x="428" y="308">Resource</text>
                  <text x="116" y="372">Identity</text>
                  <text x="188" y="372">Provider</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
      +--------------------------------------------------------+
      |                                    SPIFFE Trust Domain |
      |                                                        |
      | +--------------+  1) Get JWT-SVID    +--------------+  |
      | |              +-------------------->|    SPIFFE    |  |
      | |   Workload   |                     | Workload API |  |
      | |              |                     +--------------+  |
      | +----+-+----+--+                                       |
      |      | |    |                        +--------------+  |
      |      | |    |     A) access          |              |  |
      |      | |    +----------------------->|   Resource   |  |
      |      | |                             |              |  |
      |      | |                             +--------------+  |
      +------+-+-----------------------------------------------+
             | |
             | |                             +--------------+
B1) federate | | B2) access                  |              |
             | +---------------------------->|   Resource   |
             v                               |              |
       +---------------------+               +--------------+
       |                     |
       |  Identity Provider  |
       |                     |
       +---------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-spiffe"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The workload requests one or more JWT-SVIDs from the SPIFFE Workload API,
   each with a distinct audience matching its intended use.</t>
          </li>
          <li>
            <t>A) A JWT-SVID audienced for the target resource can be used to directly access
   resources or other workloads within the same SPIFFE Trust Domain.</t>
          </li>
          <li>
            <t>B1) To access resources protected by other Identity Providers, the workload
    uses a JWT-SVID audienced for the Identity Provider to federate. The
    Identity Provider validates the JWT-SVID and issues a new credential
    such as an OAuth 2.0 access token, to the workload.</t>
          </li>
          <li>
            <t>B2) Using the credential issued in step B1, the workload can access resources
    outside of its trust domain.</t>
          </li>
        </ul>
        <t>The token presented at step B1 <bcp14>MUST</bcp14> be a different token with a different audience
than the one presented at step A. The JWT-SVID issued by SPIFFE is a Bearer token
which enables any holder to use it. Using the same audience for tokens presented at
step A and B1 for example allows the external Identity Provider to impersonate the
workload at the internal resource  accessed at step A. See <xref target="audience"/> for
security considerations.</t>
        <t>Here are example claims for a JWT-SVID:</t>
        <sourcecode type="json"><![CDATA[
{
  "aud": [
    "external-authorization-server"
  ],
  "exp": 1729087175,
  "iat": 1729086875,
  "sub": "spiffe://example.org/myservice"
}
]]></sourcecode>
      </section>
      <section anchor="cloudproviders">
        <name>Cloud Providers</name>
        <t>Workload forms in cloud platforms vary. Historically, virtual
machines were the most common. The introduction of containerization brought
hosted container environments or Kubernetes clusters. Containers have evolved
into <tt>serverless</tt> offerings. Regardless of the actual workload packaging,
distribution, or runtime platform, all these workloads need identities.</t>
        <t>The biggest cloud providers have established the pattern of an "Instance
Metadata Endpoint". Aside from allowing workloads to retrieve metadata about
themselves, it also allows them to receive identity. The credential types
offered can vary, and JWTs are commonly found across cloud providers.
The issued credential provides proof to anyone it is being presented to that the
workload platform has attested the workload and it can be considered
authenticated.</t>
        <t>Within a cloud provider, the issued credential can often directly be used to
access resources of any kind across the platform, making integration between the
services straightforward. From the workload perspective, no credential needs to be
issued, provisioned, rotated or revoked, as everything is handled internally by
the platform.</t>
        <t>This is not true for resources outside of the platform, such as on-premise
resources, generic web servers or other cloud provider resources. Here, the
workload first needs to federate to the Secure Token Service (STS) of the
respective cloud, which is effectively an Identity Provider. The STS issues
a new credential with which the workload can then access resources.</t>
        <t>This pattern also applies when accessing resources in the same cloud but across
different security boundaries (e.g., different account or tenant). The actual
flows and implementations may vary in these situations though.</t>
        <t>When a workload needs to access both internal platform resources and external
resources, it <bcp14>MUST</bcp14> obtain separate credentials for each purpose. The credential
used for internal platform access (step A) <bcp14>MUST NOT</bcp14> be reused for federation
to an external STS (step B1), as these represent different trust and audience
boundaries. The workload may need to contact the Instance Metadata Service
multiple times to obtain appropriately scoped credentials. Tokens issued in this
pattern are often Bearer credentials and using the same audience for tokens
presented at multiple parties allows these parties to impersonate the workload
at each other. See <xref target="audience"/> for details.</t>
        <figure anchor="fig-cloud">
          <name>Workload identity in a cloud provider</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="544" width="544" viewBox="0 0 544 544" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 40,32 L 40,272" fill="none" stroke="black"/>
                <path d="M 40,336 L 40,528" fill="none" stroke="black"/>
                <path d="M 64,96 L 64,160" fill="none" stroke="black"/>
                <path d="M 64,448 L 64,512" fill="none" stroke="black"/>
                <path d="M 112,160 L 112,440" fill="none" stroke="black"/>
                <path d="M 128,160 L 128,416" fill="none" stroke="black"/>
                <path d="M 168,160 L 168,224" fill="none" stroke="black"/>
                <path d="M 184,96 L 184,160" fill="none" stroke="black"/>
                <path d="M 304,448 L 304,512" fill="none" stroke="black"/>
                <path d="M 352,80 L 352,160" fill="none" stroke="black"/>
                <path d="M 392,192 L 392,256" fill="none" stroke="black"/>
                <path d="M 392,384 L 392,448" fill="none" stroke="black"/>
                <path d="M 512,80 L 512,160" fill="none" stroke="black"/>
                <path d="M 512,192 L 512,256" fill="none" stroke="black"/>
                <path d="M 512,384 L 512,448" fill="none" stroke="black"/>
                <path d="M 536,32 L 536,272" fill="none" stroke="black"/>
                <path d="M 536,336 L 536,528" fill="none" stroke="black"/>
                <path d="M 40,32 L 536,32" fill="none" stroke="black"/>
                <path d="M 352,80 L 512,80" fill="none" stroke="black"/>
                <path d="M 64,96 L 184,96" fill="none" stroke="black"/>
                <path d="M 184,112 L 344,112" fill="none" stroke="black"/>
                <path d="M 64,160 L 184,160" fill="none" stroke="black"/>
                <path d="M 352,160 L 512,160" fill="none" stroke="black"/>
                <path d="M 392,192 L 512,192" fill="none" stroke="black"/>
                <path d="M 168,224 L 384,224" fill="none" stroke="black"/>
                <path d="M 392,256 L 512,256" fill="none" stroke="black"/>
                <path d="M 40,272 L 536,272" fill="none" stroke="black"/>
                <path d="M 40,336 L 536,336" fill="none" stroke="black"/>
                <path d="M 392,384 L 512,384" fill="none" stroke="black"/>
                <path d="M 128,416 L 384,416" fill="none" stroke="black"/>
                <path d="M 64,448 L 304,448" fill="none" stroke="black"/>
                <path d="M 392,448 L 512,448" fill="none" stroke="black"/>
                <path d="M 64,512 L 304,512" fill="none" stroke="black"/>
                <path d="M 40,528 L 536,528" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="392,416 380,410.4 380,421.6" fill="black" transform="rotate(0,384,416)"/>
                <polygon class="arrowhead" points="392,224 380,218.4 380,229.6" fill="black" transform="rotate(0,384,224)"/>
                <polygon class="arrowhead" points="352,112 340,106.4 340,117.6" fill="black" transform="rotate(0,344,112)"/>
                <polygon class="arrowhead" points="120,440 108,434.4 108,445.6" fill="black" transform="rotate(90,112,440)"/>
                <g class="text">
                  <text x="504" y="52">Cloud</text>
                  <text x="204" y="100">1)</text>
                  <text x="232" y="100">get</text>
                  <text x="296" y="100">credentials</text>
                  <text x="396" y="116">Instance</text>
                  <text x="468" y="116">Metadata</text>
                  <text x="124" y="132">Workload</text>
                  <text x="436" y="132">Service/Endpoint</text>
                  <text x="220" y="212">A)</text>
                  <text x="260" y="212">access</text>
                  <text x="452" y="228">Resource</text>
                  <text x="16" y="308">B1)</text>
                  <text x="68" y="308">federate</text>
                  <text x="152" y="308">B2)</text>
                  <text x="196" y="308">access</text>
                  <text x="340" y="356">External</text>
                  <text x="400" y="356">(e.g.</text>
                  <text x="448" y="356">other</text>
                  <text x="500" y="356">cloud)</text>
                  <text x="452" y="420">Resource</text>
                  <text x="108" y="484">Secure</text>
                  <text x="160" y="484">Token</text>
                  <text x="216" y="484">Service</text>
                  <text x="272" y="484">(STS)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
    +-------------------------------------------------------------+
    |                                                       Cloud |
    |                                                             |
    |                                      +-------------------+  |
    |  +--------------+ 1) get credentials |                   |  |
    |  |              +------------------->| Instance Metadata |  |
    |  |   Workload   |                    |  Service/Endpoint |  |
    |  |              |                    |                   |  |
    |  +-----+-+----+-+                    +-------------------+  |
    |        | |    |                                             |
    |        | |    |                           +--------------+  |
    |        | |    |     A) access             |              |  |
    |        | |    +-------------------------->|   Resource   |  |
    |        | |                                |              |  |
    |        | |                                +--------------+  |
    +--------+-+--------------------------------------------------+
             | |
B1) federate | | B2) access
             | |
    +--------+-+--------------------------------------------------+
    |        | |                      External (e.g. other cloud) |
    |        | |                                                  |
    |        | |                                +--------------+  |
    |        | |                                |              |  |
    |        | +------------------------------->|   Resource   |  |
    |        v                                  |              |  |
    |  +-----------------------------+          +--------------+  |
    |  |                             |                            |
    |  |  Secure Token Service (STS) |                            |
    |  |                             |                            |
    |  +-----------------------------+                            |
    +-------------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-cloud"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The workload retrieves one or more identity credentials from the Instance
   Metadata Service or Endpoint. This endpoint exposes an API and is available
   at a well-known, but local-only location such as 169.254.169.254. Each
   credential <bcp14>MUST</bcp14> be scoped to its intended use with a distinct audience.
   See <xref target="audience"/>.</t>
          </li>
        </ul>
        <t>When the workload needs to access a resource within the cloud (e.g., located in
the same security boundary; protected by the same issuer as the workload
identity):</t>
        <ul spacing="normal">
          <li>
            <t>A) The workload directly accesses the protected resource with a credential
   scoped for that resource, as issued in Step 1.</t>
          </li>
        </ul>
        <t>When the workload needs to access a resource outside of the cloud (e.g.,
different cloud; same cloud, but different security boundary):</t>
        <ul spacing="normal">
          <li>
            <t>B1) The workload uses a separate cloud-issued credential, audienced for the
    external STS, to federate to the Secure Token Service of the other
    cloud/account. This credential <bcp14>MUST NOT</bcp14> be the same as the one used in
    step A). The STS validates the credential and issues a new credential,
    such as an access token to the workload.</t>
          </li>
          <li>
            <t>B2) Using the credential issued in step B1, the workload can access the
    resource outside, assuming the credential has the necessary permissions.</t>
          </li>
        </ul>
        <t>It is important to distinguish the credential obtained from the Instance Metadata
Service from a workload identity document commonly used in attestation systems.
A workload identity document typically represents attestation evidence
that is evaluated by a relying party or attestation service. In contrast,
some credentials issued by the metadata service are already the result of such
attestation and are intended to be directly consumed by relying services for
authentication and authorization decisions.</t>
        <t>In many cloud environments, the credential retrieved from the metadata service
is a bearer token. Possession of such a token is sufficient to use it, which
introduces risks around token handling and exposure. Some providers mitigate this
by constraining token scope, lifetime, or audience, or by requiring additional
proof-of-possession mechanisms. These mechanisms reduce the risk of token replay
or misuse if the token is exfiltrated.</t>
        <t>The same bearer credential <bcp14>MUST NOT</bcp14> be used across different trust domains
without appropriate controls. While direct use of the issued credential
within the same cloud security boundary is common, reusing that credential outside of
its intended scope can increase the risk of credential leakage and enable
impersonation. The federation step via the Secure Token Service (Step B1) serves as
a boundary, allowing the original credential to be exchanged for a new credential
that is scoped, audience-restricted, and appropriate for the target resource.</t>
      </section>
      <section anchor="cicd">
        <name>Continuous Integration and Deployment Systems</name>
        <t>Continuous integration and deployment (CI-CD) systems allow their pipelines (or
workflows) to receive an identity at runtime. It is a common task to upload
build outputs and other artifacts to external resources. For this, federation
to external Identity Providers is often necessary.</t>
        <t>As with other platforms, CI-CD workloads may obtain multiple tokens from the
platform, each with a distinct audience for the specific resource or Identity
Provider it needs to interact with.</t>
        <figure anchor="fig-cicd">
          <name>OAuth2 Assertion Flow in a continuous integration/deployment environment</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="352" width="448" viewBox="0 0 448 352" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 40,32 L 40,176" fill="none" stroke="black"/>
                <path d="M 56,80 L 56,160" fill="none" stroke="black"/>
                <path d="M 56,272 L 56,336" fill="none" stroke="black"/>
                <path d="M 112,176 L 112,264" fill="none" stroke="black"/>
                <path d="M 128,176 L 128,240" fill="none" stroke="black"/>
                <path d="M 200,80 L 200,160" fill="none" stroke="black"/>
                <path d="M 216,272 L 216,336" fill="none" stroke="black"/>
                <path d="M 296,208 L 296,272" fill="none" stroke="black"/>
                <path d="M 312,80 L 312,144" fill="none" stroke="black"/>
                <path d="M 416,80 L 416,144" fill="none" stroke="black"/>
                <path d="M 416,208 L 416,272" fill="none" stroke="black"/>
                <path d="M 440,32 L 440,176" fill="none" stroke="black"/>
                <path d="M 40,32 L 440,32" fill="none" stroke="black"/>
                <path d="M 56,80 L 200,80" fill="none" stroke="black"/>
                <path d="M 312,80 L 416,80" fill="none" stroke="black"/>
                <path d="M 208,112 L 312,112" fill="none" stroke="black"/>
                <path d="M 312,144 L 416,144" fill="none" stroke="black"/>
                <path d="M 56,160 L 200,160" fill="none" stroke="black"/>
                <path d="M 40,176 L 440,176" fill="none" stroke="black"/>
                <path d="M 296,208 L 416,208" fill="none" stroke="black"/>
                <path d="M 128,240 L 288,240" fill="none" stroke="black"/>
                <path d="M 56,272 L 216,272" fill="none" stroke="black"/>
                <path d="M 296,272 L 416,272" fill="none" stroke="black"/>
                <path d="M 56,336 L 216,336" fill="none" stroke="black"/>
                <path d="M 96,160 C 104.83064,160 112,167.16936 112,176" fill="none" stroke="black"/>
                <path d="M 112,160 C 120.83064,160 128,167.16936 128,176" fill="none" stroke="black"/>
                <path d="M 128,160 C 119.16936,160 112,167.16936 112,176" fill="none" stroke="black"/>
                <path d="M 104,176 C 112.83064,176 120,168.83064 120,160" fill="none" stroke="black"/>
                <path d="M 120,176 C 111.16936,176 104,168.83064 104,160" fill="none" stroke="black"/>
                <path d="M 136,176 C 127.16936,176 120,168.83064 120,160" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="296,240 284,234.4 284,245.6" fill="black" transform="rotate(0,288,240)"/>
                <polygon class="arrowhead" points="216,112 204,106.4 204,117.6" fill="black" transform="rotate(180,208,112)"/>
                <polygon class="arrowhead" points="120,264 108,258.4 108,269.6" fill="black" transform="rotate(90,112,264)"/>
                <g class="text">
                  <text x="116" y="52">Continuous</text>
                  <text x="208" y="52">Integration</text>
                  <text x="264" y="52">/</text>
                  <text x="316" y="52">Deployment</text>
                  <text x="396" y="52">Platform</text>
                  <text x="220" y="100">1)</text>
                  <text x="268" y="100">schedule</text>
                  <text x="128" y="116">Pipeline/Task</text>
                  <text x="364" y="116">Platform</text>
                  <text x="124" y="132">(Workload)</text>
                  <text x="16" y="228">B1)</text>
                  <text x="68" y="228">federate</text>
                  <text x="152" y="228">B2)</text>
                  <text x="196" y="228">access</text>
                  <text x="356" y="244">Resource</text>
                  <text x="100" y="308">Identity</text>
                  <text x="172" y="308">Provider</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
    +-------------------------------------------------+
    |    Continuous Integration / Deployment Platform |
    |                                                 |
    | +-----------------+             +------------+  |
    | |                 | 1) schedule |            |  |
    | |  Pipeline/Task  |<------------+  Platform  |  |
    | |   (Workload)    |             |            |  |
    | |                 |             +------------+  |
    | +-----+-+---------+                             |
    +--------+-+--------------------------------------+
             | |
             | |                    +--------------+
B1) federate | | B2) access         |              |
             | +------------------->|   Resource   |
             v                      |              |
      +-------------------+         +--------------+
      |                   |
      | Identity Provider |
      |                   |
      +-------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-cicd"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The CI-CD platform schedules a workload (pipeline or task). Based on
   configuration, a Workload Identity is made available by the platform.</t>
          </li>
          <li>
            <t>B1) The workload uses the platform-issued credential to federate to an
   Identity Provider, which validates the credential and issues a new
   credential, such as an access token, for the workload.</t>
          </li>
          <li>
            <t>B2) The workload uses the issued credential to access resources. For instance,
   an artifact store to upload compiled binaries, or to download libraries
   needed to resolve dependencies. It is also common to access actual
   infrastructure as resources to make deployments or changes to it.</t>
          </li>
        </ul>
        <t>While token structure is vendor-specific, all tokens contain claims carrying
the basic context of the executed tasks, such as source code management data
such as git branch, initiation context and more.</t>
        <t>CI-CD pipelines sometimes use credentials to perform code signing
operations integrity proof of the build output. As explained in the <xref target="security"/>, strength of the integrity is limited to the strength of
the credential used.</t>
      </section>
      <section anchor="service-meshes">
        <name>Service Meshes</name>
        <t>Service meshes provide infrastructure-level workload identity and secure communication
for applications through sidecar proxies deployed alongside each workload.
In a service mesh, workload identity is typically implemented using X.509 certificates
issued by the service mesh. Service meshes handle identity credential provisioning
to sidecar proxies rather than directly to application workloads. The sidecar intercepts
network traffic and handles authentication transparently to the application code.</t>
        <figure anchor="fig-servicemesh">
          <name>Simple service mesh communication between 2 workloads</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="368" width="512" viewBox="0 0 512 368" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 80,160 L 80,224" fill="none" stroke="black"/>
                <path d="M 80,288 L 80,352" fill="none" stroke="black"/>
                <path d="M 128,64 L 128,152" fill="none" stroke="black"/>
                <path d="M 128,232 L 128,288" fill="none" stroke="black"/>
                <path d="M 176,160 L 176,224" fill="none" stroke="black"/>
                <path d="M 176,288 L 176,352" fill="none" stroke="black"/>
                <path d="M 192,32 L 192,96" fill="none" stroke="black"/>
                <path d="M 312,32 L 312,96" fill="none" stroke="black"/>
                <path d="M 336,160 L 336,224" fill="none" stroke="black"/>
                <path d="M 336,288 L 336,352" fill="none" stroke="black"/>
                <path d="M 384,64 L 384,152" fill="none" stroke="black"/>
                <path d="M 384,232 L 384,288" fill="none" stroke="black"/>
                <path d="M 432,160 L 432,224" fill="none" stroke="black"/>
                <path d="M 432,288 L 432,352" fill="none" stroke="black"/>
                <path d="M 192,32 L 312,32" fill="none" stroke="black"/>
                <path d="M 128,64 L 192,64" fill="none" stroke="black"/>
                <path d="M 312,64 L 384,64" fill="none" stroke="black"/>
                <path d="M 192,96 L 312,96" fill="none" stroke="black"/>
                <path d="M 80,160 L 176,160" fill="none" stroke="black"/>
                <path d="M 336,160 L 432,160" fill="none" stroke="black"/>
                <path d="M 184,190 L 328,190" fill="none" stroke="black"/>
                <path d="M 184,194 L 328,194" fill="none" stroke="black"/>
                <path d="M 80,224 L 176,224" fill="none" stroke="black"/>
                <path d="M 336,224 L 432,224" fill="none" stroke="black"/>
                <path d="M 80,288 L 176,288" fill="none" stroke="black"/>
                <path d="M 336,288 L 432,288" fill="none" stroke="black"/>
                <path d="M 80,352 L 176,352" fill="none" stroke="black"/>
                <path d="M 336,352 L 432,352" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="392,232 380,226.4 380,237.6" fill="black" transform="rotate(270,384,232)"/>
                <polygon class="arrowhead" points="392,152 380,146.4 380,157.6" fill="black" transform="rotate(90,384,152)"/>
                <polygon class="arrowhead" points="336,192 324,186.4 324,197.6" fill="black" transform="rotate(0,328,192)"/>
                <polygon class="arrowhead" points="192,192 180,186.4 180,197.6" fill="black" transform="rotate(180,184,192)"/>
                <polygon class="arrowhead" points="136,232 124,226.4 124,237.6" fill="black" transform="rotate(270,128,232)"/>
                <polygon class="arrowhead" points="136,152 124,146.4 124,157.6" fill="black" transform="rotate(90,128,152)"/>
                <g class="text">
                  <text x="232" y="68">Service</text>
                  <text x="284" y="68">Mesh</text>
                  <text x="12" y="84">1)</text>
                  <text x="48" y="84">issue</text>
                  <text x="404" y="84">1)</text>
                  <text x="440" y="84">issue</text>
                  <text x="60" y="100">identity</text>
                  <text x="452" y="100">identity</text>
                  <text x="40" y="116">and</text>
                  <text x="432" y="116">and</text>
                  <text x="72" y="132">credentials</text>
                  <text x="464" y="132">credentials</text>
                  <text x="196" y="148">3)</text>
                  <text x="256" y="148">communicate</text>
                  <text x="220" y="164">on</text>
                  <text x="260" y="164">behalf</text>
                  <text x="300" y="164">of</text>
                  <text x="248" y="180">workloads</text>
                  <text x="128" y="196">Proxy</text>
                  <text x="384" y="196">Proxy</text>
                  <text x="148" y="260">2)</text>
                  <text x="196" y="260">delegate</text>
                  <text x="404" y="260">2)</text>
                  <text x="452" y="260">delegate</text>
                  <text x="124" y="324">Workload</text>
                  <text x="380" y="324">Workload</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                       +--------------+
                       |              |
               +-------+ Service Mesh +--------+
1) issue       |       |              |        | 1) issue
   identity    |       +--------------+        |    identity
   and         |                               |    and
   credentials |                               |    credentials
               v       3) communicate          v
         +-----------+    on behalf of   +-----------+
         |           |    workloads      |           |
         |   Proxy   |<=================>|   Proxy   |
         |           |                   |           |
         +-----------+                   +-----------+
               ^                               ^
               | 2) delegate                   | 2) delegate
               |                               |
         +-----+-----+                   +-----+-----+
         |           |                   |           |
         | Workload  |                   | Workload  |
         |           |                   |           |
         +-----------+                   +-----------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-servicemesh"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The Service Mesh issues identity credentials to proxies. For X.509-based
   meshes, this consists of an X.509 certificate containing the workload's
   identity along with the associated key pair.</t>
          </li>
          <li>
            <t>2) The proxies act on behalf of workloads that delegate their
   communication to them. In above figure each workload has its
   own proxy that solely represents it and no other workload.</t>
          </li>
          <li>
            <t>3) The proxies communicate with each other on behalf of the workloads
   they represent. This communication includes authentication aspects,
   for instance mutual TLS using X.509 certificates.</t>
          </li>
        </ul>
        <t>In above pattern each workload has a specific sidecar. An alternative deployment is to share proxies between workloads. This often results in a single proxy on each node acting on behalf of all workloads on the node.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>All security considerations in section 8 of <xref target="OAUTH-ASSERTION"/> apply.</t>
      <section anchor="security-credential-delivery">
        <name>Credential Delivery</name>
        <section anchor="general-requirements">
          <name>General Credentials Requirements</name>
          <t>Credentials <bcp14>MUST</bcp14> be scoped as narrowly as possible unless the platform issues a
single credential per workload or does not let the workload influence the
audience.</t>
          <t>Scoping as narrowly as possible means that each
credential <bcp14>MUST</bcp14> carry the smallest set of audiences that lets it serve its
purpose. A credential for direct access to a platform resource <bcp14>MUST</bcp14> be scoped to
that resource; a credential used to federate to an Identity Provider <bcp14>MUST</bcp14> carry
that Identity Provider as its sole audience. Re-using a credential across
contexts and resources conflates trust boundaries and increases the impact of a
compromise. See <xref target="audience"/> for the rationale and for specific requirements on
the <tt>"aud"</tt> claim of JWT-based credentials.</t>
          <t>Where either exception applies, a credential is necessarily used across
contexts. Such deployments cannot rely on audience scoping to contain a
compromise and therefore need to compensate by other means: keeping credential
lifetimes as short as the platform allows,
limiting which components can reach the credential
(<xref target="application-interaction-with-credential-sources"/>), and treating every party
that receives the credential as able to impersonate the workload at every other
party that accepts it (<xref target="audience"/>).</t>
        </section>
        <section anchor="security-credential-delivery-filesystem">
          <name>Filesystem</name>
          <t>Access control to the mounted file <bcp14>MUST</bcp14> be configured to limit reads to
authorized applications. Linux supports solutions such as DAC (uid and gid) or
MAC (e.g., SELinux, AppArmor). Failing to do so allows any party within the
workload and its platform to read the credentials.</t>
          <t>Credentials written to durable storage persist until they are overwritten or
removed, and may be captured in backups, snapshots, or images. Implementations
therefore commonly mount credentials from memory-backed storage instead. Such a
mount can be isolated from other host OS paths and processes to improve security
further. For example, on Linux this can be achieved by using namespaces.</t>
        </section>
        <section anchor="local-api-security">
          <name>Local APIs</name>
          <t>Local APIs often operate in clear-text, such as unencrypted HTTP, without any
confidentiality or integrity protection. Privileged components on a host or in
the infrastructure may be able to eavesdrop on a connection and view a
credential within it.</t>
          <t>Mitigations are required for Server-Side Request Forgery (SSRF) attacks against
Local APIs. For example, implementations can require a specific header that
cannot be controlled externally or prevent untrusted input from triggering
requests to link-local IPs, including through redirects. See
<xref target="application-interaction-with-credential-sources"/> for details.</t>
          <t>Adequate assurance that the identity represents the workload is required to make
sure unauthorized access is denied and credentials are not issued to other
parties when the Local API is unauthenticated. What constitutes adequate
assurance depends on the security requirements of the deployment.
Introspection of the platform, like in SPIFFE or cloud providers, can be used
to identify workloads and grant access. The more fine-grained and strict this
verification, the smaller the attack surface. For instance, allowing access by
IP or other machine-global identifiers permits any process to receive the
identity, while including user ID or other process-scoped identifiers prevents
this broader access.</t>
          <t>The potential for denial-of-service attacks against Local APIs needs to be taken
into account. Depending on the platform these attacks can affect other workloads
and their ability to receive a platform credential. Where a single Local API
serves more than one workload, protective measures such as rate limiting or
per-caller quotas <bcp14>SHOULD</bcp14> be implemented, unless the platform already bounds the
resources a single caller can consume. Without such measures one workload can
prevent others from obtaining their credentials.</t>
        </section>
        <section anchor="security-credential-delivery-env">
          <name>Environment Variables</name>
          <t>Leveraging environment variables to provide credentials presents many security
limitations. Environment variables have a wide set of use cases and are observed
by many components. They are often captured for monitoring, observability,
debugging and logging purposes and sent to components outside of the workload.
Access control is not trivial and does not achieve the same security results as
other methods. Additionally, environment variables may be spoofed or altered
by other processes running on the same host, making them an unreliable transport
for credentials in environments where process isolation is not strictly enforced.</t>
          <t>For these reasons, environment variables <bcp14>MUST NOT</bcp14> be used to deliver workload
identity credentials in production deployments where the platform offers another
delivery pattern.</t>
        </section>
        <section anchor="application-interaction-with-credential-sources">
          <name>Application Interaction with Credential Sources</name>
          <t>Implementations <bcp14>MUST</bcp14> assume that application vulnerabilities can expose workload credentials
even when platform isolation is correctly configured. Attackers commonly exploit the workload
itself to retrieve credentials rather than accessing the credential service directly.</t>
          <t>For example, untrusted input may be used to manipulate file paths when credentials are mounted
on a filesystem, or to trigger requests to local credential endpoints such as metadata or
workload APIs (for example via SSRF). Similarly, command execution or
unintended outbound requests may result in bearer tokens or proof-of-possession key material
being disclosed.</t>
          <t>Workloads therefore <bcp14>MUST</bcp14> treat credential locations as sensitive security boundaries.
Untrusted input <bcp14>MUST NOT</bcp14> influence how credential files are accessed or how local credential
APIs are contacted. Implementations should minimize which components can access credentials
and prefer proof-of-possession credentials over bearer tokens where supported. Failure to
minimize credential access increases the attack surface by allowing more code paths to
interact with sensitive material. Failing to use proof-of-possession credentials where
available means that stolen bearer tokens can be replayed by an attacker from any location.</t>
          <t>These risks exist even when credential services are reachable only locally, since compromise
often occurs through application behavior rather than network access to the credential provider.</t>
        </section>
      </section>
      <section anchor="token-typing">
        <name>Token typing</name>
        <t>Issuers <bcp14>SHOULD</bcp14> strongly type the issued tokens to workloads via the JOSE <tt>"typ"</tt>
header parameter (<xref section="4.1.9" sectionFormat="of" target="JWS"/>), and Identity Providers
accepting these tokens <bcp14>SHOULD</bcp14> validate its value according to policy, unless the
deployment cannot support specific type values as described below. See
<xref section="3.1" sectionFormat="of" target="JWT-BCP"/> for details on explicit typing. Without
explicit typing, a token intended for one purpose such as a refresh token
or an identity assertion may be accepted in a context where a different token
type is expected, enabling cross-protocol or cross-context token confusion
attacks.</t>
        <t>Where the credential is used as an authorization grant, issuers <bcp14>SHOULD</bcp14> use
<tt>authorization-grant+jwt</tt> as a <tt>"typ"</tt> value according to
<xref target="OAUTH-JWT"/>. For broad support, <tt>JWT</tt> or <tt>JOSE</tt> <bcp14>MAY</bcp14> be used by
issuers and accepted by authorization servers but it is important to highlight
that a wide range of tokens, meant for all sorts of purposes, use these values
and would be accepted. Using generic type values such as <tt>JWT</tt> or <tt>JOSE</tt> is
acceptable only when the deployment cannot support more specific types, for
instance due to limitations in existing infrastructure or token libraries. Even
in such cases, additional validation of token claims and context is essential to
mitigate confusion.</t>
      </section>
      <section anchor="custom-claims-are-important-for-context">
        <name>Custom claims are important for context</name>
        <t>Some platform-issued credentials carry custom claims that are vital for context.
Relying parties need to consider the values of these claims, not merely check
that they are present. For example, in a continuous integration and
deployment platform where a workload is scheduled for a Git repository, the
branch is crucial. A "main" branch may be protected and considered trusted to
federate to external authorization servers. But other branches may not be
allowed to access protected resources.</t>
        <t>Authorization servers that validate assertions <bcp14>MUST</bcp14> evaluate the claims that
carry the context their authorization decision depends on.
Ignoring custom claims may result in overly permissive authorization decisions,
such as granting a credential issued for an untrusted branch the same access as
one issued for a protected branch. Platform issuers should allow differentiation
based on the <tt>"sub"</tt> (subject) claim alone, so that authorization policies can be
expressed without requiring deep knowledge of vendor-specific claim structures.</t>
      </section>
      <section anchor="token-lifetime">
        <name>Token lifetime</name>
        <t>Tokens <bcp14>MUST NOT</bcp14> exceed the lifetime of the workload instance they represent,
unless the issuing platform cannot determine that lifetime; in that case the
lifetime is kept as short as the platform allows.
For example, a token valid for two hours or more exceeds the lifetime of a
workload that is expected to run for one hour. A token that outlives its workload
may continue to be accepted by relying parties even after the workload (and its
associated authorization context) has ceased to exist, enabling unauthorized
access if the token is compromised.</t>
        <t>Within the scope of this document, where a platform-issued credential is used
to authenticate to retrieve an access token for an external authorization
domain, short-lived credentials are <bcp14>RECOMMENDED</bcp14>. Short-lived credentials
reduce the window during which a stolen credential can be exploited and
limit the need for explicit revocation infrastructure.</t>
      </section>
      <section anchor="workload-lifecycle-and-invalidation">
        <name>Workload lifecycle and invalidation</name>
        <t>Platform issuers <bcp14>MUST</bcp14> invalidate credentials when an instance of the workload
stops, pauses, or ceases to exist, unless the credential lifetime is short enough
that the remaining validity window is acceptable for the deployment. Where
invalidation is not immediate, issuers <bcp14>SHOULD</bcp14> offer validators a mechanism to
query this status, unless the deployment relies solely on short lifetimes as
described in <xref target="token-lifetime"/>. Because a workload may run as multiple instances (for
example, replicas or parallel tasks), this applies to each instance
individually. Without this capability, credentials for terminated instances
remain usable until their natural expiry, creating a window for unauthorized
use. Without a status query mechanism, relying parties have no way to detect
that an instance has been removed. How these credentials are invalidated and
the status is queried varies and is not in scope of this document.</t>
      </section>
      <section anchor="proof-of-possession">
        <name>Proof of possession</name>
        <t>Identity credentials <bcp14>SHOULD</bcp14> be bound to the workload instance they represent,
and proof of possession <bcp14>SHOULD</bcp14> be performed when these credentials are used,
unless neither the platform nor the relying party supports a proof-of-possession
mechanism; in that case the compensating controls described below apply.
This reduces the impact of token theft to the scope of the proof of possession.</t>
        <t>Without proof of possession, a bearer token intercepted in transit (e.g., via a
compromised log, a man-in-the-middle, or SSRF) can be replayed by any party,
from any location, for the remaining lifetime of the token.</t>
        <t>For X.509-based credentials, proof of possession is inherent through the private
key associated with the certificate. For JWT-based credentials, the JWT <bcp14>SHOULD</bcp14>
be key-bound with an adequate proof-of-key-possession mechanism.</t>
        <t>This proof of possession applies to both the platform credential and the
access token of the external authorization domains.</t>
        <t>Where proof of possession is not supported by the platform or the relying party,
deployments <bcp14>MUST</bcp14> apply compensating controls, such as short-lived tokens, narrow
audience scoping, or additional network-level controls such as IP allowlisting or
mutual TLS.</t>
      </section>
      <section anchor="audience">
        <name>Audience</name>
        <t>For issued credentials in the form of JWTs, they <bcp14>MUST</bcp14> be audienced using the
<tt>"aud"</tt> claim. Each JWT <bcp14>MUST NOT</bcp14> carry more than one
audience, unless multiple credentials cannot be obtained or the audience cannot
be influenced as described in <xref target="general-requirements"/>. Using multiple
audiences in a single token means that any relying party listed in the <tt>"aud"</tt>
claim can present that token to any other party listed in the same claim,
potentially gaining unintended access. A single-audience token limits the blast
radius if the token is compromised or misused. Expressing audiences as URIs
avoids ambiguity between deployments and is therefore recommended. See <xref section="3" sectionFormat="of" target="OAUTH-RESOURCEINDICATORS"/> for more details and
security implications.</t>
        <t>Some workload platforms provide credentials for interacting with their own APIs
(e.g., Kubernetes). These credentials <bcp14>MUST NOT</bcp14> be used beyond the platform API.
In the example of Kubernetes, a token used for anything other than the Kubernetes
API itself <bcp14>MUST NOT</bcp14> carry the Kubernetes server in the <tt>"aud"</tt> claim. Reusing a
platform API token for federation or resource access outside the platform
conflates trust boundaries: the token's audience includes the platform, so any
relying party that accepts it could impersonate the workload back to the
platform.</t>
      </section>
      <section anchor="multi-tenancy-considerations">
        <name>Multi-Tenancy Considerations</name>
        <t>In multi-tenant platforms, relying parties <bcp14>MUST</bcp14> carefully evaluate which attributes
are considered trustworthy when making authorization decisions. Access or federation
<bcp14>MUST NOT</bcp14> be granted based solely on untrusted or easily forgeable attributes.
In particular, the <tt>"iss"</tt> (issuer) claim in such environments may not uniquely identify
a trusted authority, since each tenant could be configured with the same issuer
identifier.</t>
        <t>Relying parties <bcp14>MUST</bcp14> ensure that attributes used for authorization are bound
to a trust domain under their control or validated by an entity with a clearly
defined trust boundary. Failing to do so may allow a malicious tenant to obtain
credentials that are indistinguishable from those of a legitimate tenant, leading
to cross-tenant privilege escalation or unauthorized access to shared resources.</t>
      </section>
    </section>
    <section anchor="IANA">
      <name>IANA Considerations</name>
      <t>This document does not require actions by IANA.</t>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors and contributors would like to thank the following people for their feedback and contributions to this document (in no particular order): Dag Sneeggen, Ned Smith, Dean H. Saxe, Yaron Sheffer, Andrii Deinega, Marcel Levy, Pieter Kasselmann, Simon Canning, Evan Gilman, Joseph Salowey, Kathleen Moriarty, Brian Campbell, Judith Kahrer and Flemming Andreasen.</t>
      <t>The authors would also like to thank Justin Richer for serving as document shepherd and Charles Eckel for his AD evaluation of this document.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="OAUTH-FRAMEWORK">
          <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="JWT">
          <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="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>
        <reference anchor="JWK">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </reference>
        <reference anchor="OAUTH-ASSERTION">
          <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="JWS">
          <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="JWT-BCP">
          <front>
            <title>JSON Web Token Best Current Practices</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>JSON Web Tokens, also known as JWTs, are URL-safe JSON-based security tokens that contain a set of claims that can be signed and/or encrypted. JWTs are being widely used and deployed as a simple security token format in numerous protocols and applications, both in the area of digital identity and in other application areas. This Best Current Practices document updates RFC 7519 to provide actionable guidance leading to secure implementation and deployment of JWTs.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="225"/>
          <seriesInfo name="RFC" value="8725"/>
          <seriesInfo name="DOI" value="10.17487/RFC8725"/>
        </reference>
        <reference anchor="OAUTH-JWT">
          <front>
            <title>Updates to OAuth 2.0 JSON Web Token (JWT) Client Authentication and Assertion-Based Authorization Grants</title>
            <author fullname="Michael B. Jones" initials="M. B." surname="Jones">
              <organization>Self-Issued Consulting</organization>
            </author>
            <author fullname="Brian Campbell" initials="B." surname="Campbell">
              <organization>Ping Identity</organization>
            </author>
            <author fullname="Chuck Mortimore" initials="C." surname="Mortimore">
              <organization>Disney</organization>
            </author>
            <author fullname="Filip Skokan" initials="F." surname="Skokan">
              <organization>Okta</organization>
            </author>
            <date day="28" month="April" year="2026"/>
            <abstract>
              <t>   This document updates RFC7521, RFC7522, RFC7523 and RFC9126 with
   respect to the treatment of audience values in OAuth 2.0 Client
   Assertion Authentication and Assertion-based Authorization Grants to
   address a security vulnerability identified in the previous
   requirements for those audience values in multiple OAuth 2.0
   specifications.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-rfc7523bis-11"/>
        </reference>
        <reference anchor="OAUTH-RESOURCEINDICATORS">
          <front>
            <title>Resource Indicators for OAuth 2.0</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document specifies an extension to the OAuth 2.0 Authorization Framework defining request parameters that enable a client to explicitly signal to an authorization server about the identity of the protected resource(s) to which it is requesting access.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8707"/>
          <seriesInfo name="DOI" value="10.17487/RFC8707"/>
        </reference>
        <reference anchor="OAUTH-TOKENEXCHANGE">
          <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="KubernetesServiceAccount" target="https://kubernetes.io/docs/concepts/security/service-accounts/">
          <front>
            <title>Kubernetes Service Account</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="May"/>
          </front>
        </reference>
        <reference anchor="TokenReviewV1" target="https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-review-v1/">
          <front>
            <title>Kubernetes Token Review API V1</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="August"/>
          </front>
        </reference>
        <reference anchor="TokenRequestV1" target="https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-request-v1/">
          <front>
            <title>Kubernetes Token Request API V1</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="August"/>
          </front>
        </reference>
        <reference anchor="SPIFFE" target="https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE.md">
          <front>
            <title>Secure Production Identity Framework for Everyone (SPIFFE)</title>
            <author>
              <organization/>
            </author>
            <date year="2023" month="May"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 1035?>

<section anchor="variations">
      <name>Variations</name>
      <section anchor="direct-access-to-protected-resources">
        <name>Direct access to protected resources</name>
        <t>Resource servers that protect resources may choose to trust multiple authorization servers, including the one that issues the platform identities. Instead of using the platform-issued identity to receive an access token of a different authorization domain, workloads can directly use the platform-issued identity to access a protected resource.</t>
        <t>In this case, technically, the protected resource and workload are part of the same authorization domain.</t>
      </section>
      <section anchor="custom-assertion-flows">
        <name>Custom assertion flows</name>
        <t>While <xref target="OAUTH-ASSERTION"/> and <xref target="OAUTH-JWT"/> are the proposed standards for this pattern, some authorization servers use <xref target="OAUTH-TOKENEXCHANGE"/> or a custom API for the issuance of an access token based on existing platform identity credentials. These patterns are discouraged as they prevent interoperability.</t>
      </section>
    </section>
    <section anchor="document-history">
      <name>Document History</name>
      <t>[[ To be removed from the final specification ]]</t>
      <t>-08</t>
      <ul spacing="normal">
        <li>
          <t>Address additional AD feedback</t>
        </li>
      </ul>
      <t>-07</t>
      <ul spacing="normal">
        <li>
          <t>Address AD feedback by hardening <bcp14>SHOULD</bcp14>/<bcp14>MUST</bcp14> normative text</t>
        </li>
      </ul>
      <t>-06</t>
      <ul spacing="normal">
        <li>
          <t>Address AD evaluation comments from Charles Eckel</t>
        </li>
        <li>
          <t>Address review feedback from Andrii Deinega</t>
        </li>
        <li>
          <t>Review use of BCP 14 language for consistency</t>
        </li>
        <li>
          <t>Reformat the filesystem security considerations and cover
credentials on durable storage</t>
        </li>
        <li>
          <t>Reference RFC 7515 for the JOSE "typ" header parameter</t>
        </li>
        <li>
          <t>Clarify Kubernetes JWK Set validation, SPIFFE Workload API client
authentication, custom claim validation and workload invalidation</t>
        </li>
        <li>
          <t>Update author affiliation</t>
        </li>
        <li>
          <t>Update acknowledgements</t>
        </li>
        <li>
          <t>Editorial improvements</t>
        </li>
      </ul>
      <t>-05</t>
      <ul spacing="normal">
        <li>
          <t>Rework introduction and abstract to remove normative language</t>
        </li>
        <li>
          <t>Differentiate cloud provider credentials from workload identities</t>
        </li>
        <li>
          <t>Discourage the use of environment variables for credentials</t>
        </li>
        <li>
          <t>Clean up references and make diagram labelling consistent</t>
        </li>
        <li>
          <t>Editorial improvements to the abstract, cloud provider section and examples</t>
        </li>
      </ul>
      <t>-04</t>
      <ul spacing="normal">
        <li>
          <t>Address review feedback from Kathleen Moriarty and Joe Salowey</t>
        </li>
        <li>
          <t>Expand introduction: explain the workload identity bootstrapping problem and the limitations of static credentials</t>
        </li>
        <li>
          <t>Expand SPIFFE section: trust bundles, JWT-SVID vs X509-SVID types, and Workload API identification</t>
        </li>
        <li>
          <t>Explicitly discuss obtaining multiple tokens with distinct audiences across all platform patterns</t>
        </li>
        <li>
          <t>Add "Application Interaction with Credential Sources" section covering SSRF and path traversal risks</t>
        </li>
        <li>
          <t>Update reference formatting</t>
        </li>
        <li>
          <t>Editorial improvements and updated acknowledgements</t>
        </li>
      </ul>
      <t>-03</t>
      <ul spacing="normal">
        <li>
          <t>Add service-mesh section</t>
        </li>
        <li>
          <t>Add multi-tenancy considerations</t>
        </li>
        <li>
          <t>Add atomicity and flushing requirements to filesystem section</t>
        </li>
        <li>
          <t>Make it clear that invalidation is a matter of querying the status</t>
        </li>
        <li>
          <t>Rework local api section &amp; security considerations</t>
        </li>
        <li>
          <t>Refer to RFC7517 in SPIFFE and add clarity on key distribution</t>
        </li>
        <li>
          <t>Editorial changes</t>
        </li>
      </ul>
      <t>-02</t>
      <ul spacing="normal">
        <li>
          <t>Updated structure, bringing concrete examples back into the main text.</t>
        </li>
        <li>
          <t>Use more generic "federation" term instead of RFC 7523 specifics.</t>
        </li>
        <li>
          <t>Overall editorial improvements.</t>
        </li>
        <li>
          <t>Fix reference of Kubernetes Token Request API</t>
        </li>
        <li>
          <t>Prefer the term "document" over "specification".</t>
        </li>
        <li>
          <t>Update contributor and acknowledgements sections.</t>
        </li>
        <li>
          <t>Remove section about OIDC as it is too specific to a certain implementation.</t>
        </li>
        <li>
          <t>Rewrite abstract to better reflect the current content of the document.</t>
        </li>
      </ul>
      <t>-01</t>
      <ul spacing="normal">
        <li>
          <t>Add credential delivery mechanisms</t>
        </li>
        <li>
          <t>Highlight relationship to other WIMSE work</t>
        </li>
        <li>
          <t>Add details about token typing and relation to OpenID Connect</t>
        </li>
        <li>
          <t>Add security considerations for audience</t>
        </li>
      </ul>
      <t>-00</t>
      <ul spacing="normal">
        <li>
          <t>Rename draft with no content changes.</t>
        </li>
        <li>
          <t>Set Arndt to Editor role.</t>
        </li>
      </ul>
      <t><strong>[as draft-wimse-workload-identity-bcp]</strong></t>
      <t>-02</t>
      <ul spacing="normal">
        <li>
          <t>Move scope from Kubernetes to generic workload identity platform</t>
        </li>
        <li>
          <t>Add various patterns to appendix
          </t>
          <ul spacing="normal">
            <li>
              <t>Kubernetes</t>
            </li>
            <li>
              <t>Cloud providers</t>
            </li>
            <li>
              <t>SPIFFE</t>
            </li>
            <li>
              <t>CI/CD</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Add some security considerations</t>
        </li>
        <li>
          <t>Update title</t>
        </li>
      </ul>
      <t>-01</t>
      <ul spacing="normal">
        <li>
          <t>Editorial updates</t>
        </li>
      </ul>
      <t>-00</t>
      <ul spacing="normal">
        <li>
          <t>Adopted by the WIMSE WG</t>
        </li>
      </ul>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="B." surname="Hofmann" fullname="Benedikt Hofmann">
        <organization>Siemens</organization>
        <address>
          <email>hofmann.benedikt@siemens.com</email>
        </address>
      </contact>
      <contact initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
        <organization>Siemens</organization>
        <address>
          <email>hannes.tschofenig@gmx.net</email>
        </address>
      </contact>
      <contact initials="E." surname="Giordano" fullname="Edoardo Giordano">
        <organization>Nokia</organization>
        <address>
          <email>edoardo.giordano@nokia.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8V96XrbVpbg//sUaPn7JlaZpCUvsa1UVRcty7GSeBlLKVdN
fdUxSFySiECAjQtKZsvuZ5lnmSebs90NACk56elRf10xSeAu55579mU4HKom
bwp9lHyo6ouiSrPkNNMlfLdJ3tXptMmn2qh0Mqn1Zc8zKqumZbqE17M6nTXD
XDez4VW+NHp4Jc8Oc3l2uLLjDQ+eqmna6HlVb46SvJxVSuWr+ihp6rVpHhwc
PDt4oNJap0fJ3ni1KnJ4OK9Kk6RllrzXaTE8z5d6T+EU87par+C57vLzMnm9
Lpo8OduYRi+Tk/Iyr6tyCT+bPXWhN/B6dpSclo2uS90MX+AOlDINzPJLWlQl
7GoDm1/lRypJ6tlUZ6bZFPJtkjTVNPhnXuK89gtT1U2tZ8Z93iyjj02dT93D
02pJi7Kf87LISz+N/tQMi9w0QxhkUhXw2LD6wz34BWC/TFervJzzsypdN4uq
htUO4VccB54dj5Kz6eJKlxdmugDo6pp+40Mb12XW9P6ul2leHCUpPmBGeKx/
meNXI1gsPVDVMOsLPUsvmio509N1jegQTf33UfK+MtUyvVhUwaR/T+vKFOll
60eZcVPbb//yH2aaFrqOp/xf/KVS06oEKE7WTXvHz0fJq2q2TMsymPS5LnWW
XzTRTzLlgr8aTeSZv5hcw4GYeOIz/jLe4qtRcg5wq2a6zOfBdK9gPG3av9n5
6MdR434E0H4aAQreMNnJKPk+B5xNyxCcJ1mV1lkV/yQzaf5tNJff/lJWF3ka
7+sNfqVUWdVLuGWX+kjhhXQfkuTH9YQuiDZnur6E+zueTqs14DqNkQj58E8l
8lgiz8ljaT3XgPKLplmZo/v3L9zzo7y6D6hs7sOJTvWqMfeNoBP8g0YapjyS
uc9jZUA7jpLDg+R1ukkeHDx4BF+fVxe6fK8vc33118OtS6OnEn4sGb87Tf56
eOvlwQXWtYYlBj8O01V+H68d0hymUsNam2pdA5m73+Bs8BlnG14eRqt/8DQZ
r+dw4Vob+Pe1Ns0tdkDP/fdtgaa7cQ9n705fvjyJ1060QQMzqbL1FEf3FPpl
DRiMRDwBhEtOLnW9Aaqb3OVh9vu3Nc+bxXqCOHzfrPLZTNv/TIpqch/wvrxP
JBwQ39znkUbLrB9xHio1HA6TdAIEGXiTUueL3CBdXSNBTjJtpkBiAOpA3WGb
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
LpDoxNO2vrT5LjbUuwclZDSN6woqe4L7R0G941ZdY+dlsHV6u873TleLKPWD
zfyp92aQauEF9DOqEfu1YOpEoXtQBQolff1doHcynmzXOAUU24ope6UNB+st
VdyfxBFpWYNbGwJkd9yTiQeime+LEixXp43AovV5NcY4e/+ay7xYNwjrit5O
EDtUWgX2tlVc7vpUQk/K/zNHigduGysQw8x62TP8QkBRahwCjQGgli1hUjHe
cyXjfEnVr8iXIhd9vs7Noj2aq+ncoXqO4LkiKhJH000AcwV74ypuSMPJ0ihk
jNOqR2q8a4hms5JiJE5pN9EwGpmBOIFoqxqjhtLGxhLVWrraUCYEeizCNfBW
qA4Z1fBITTNQBssVRSGdzmFEZn1L+V0VAHSPFFi/cCMx/Ybq4cwIgVQ4IdkX
au3pL4edO8KEZtb1kueyK3cWTPTStCrUsL0icKmAZj3N3dmX3LyGaUlcLaV1
8D1xU+19KnKTTQI3GVcP0YRrdrsuswpLtK1ns3yaswvPZaiQcU65umyG6/QC
WMgWzi+ToZRDmDJmn0BKbCEp5ylY5k0+Z/tDbtSEwYdmXo5WpZGIZg+C6v2I
Ai7+ED5MbClxmi6zDb4UWdcxZnPl9+gLnhGBoYq/9hsYhcrMEQbAjojU0RKo
guZGUcFPQ1AIU2qoJMEsLyiCLLNl+JDITdoWnW6NLrGIt81Y7Gw1rqZrYGWy
tWowqpkqoklBgqAkRYcJqLaznRGqw2p8+Z0BGeiYXKVNRGEcm1ORIELnRMQw
x0JaqYkhGYxgy61xKTMSoLwtKre+tqA+CNFdLPewwzwtRkI2jVMNydRta+Dd
SMR06nyeI+OLI2WpRJatR8eu0Zaj3lUuJDHCc9ahr4rDfqLwuLanJd6hmu5A
yddYm/k08H9weXdXqeZMClhc35nm0wzrc/vX8tZrvjRgcvf4dHj8Yt/Vv+Da
QhySvMpXmruZ3K24tyJZqfdDF1laBg1HGusqdLX1bbk9zO/lMsQkwWG7twyx
ZLVuTNB4Ew2Ps3TKkeJ9JbFeEqCwDWFsEN7uUScvCxtPHffkJLGg02RQwo3g
EXgSg7o3rQo7joiqvh4jfdE19ph39hIJMueabW1EfrdFNbBjbEGv+yFytZqJ
fb3Bwr53Uw+ye62f7HvdGT+juueSxT/HP4XvvRMsvn+OONgpguH31novuWs1
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
fkxu2QAA

-->

</rfc>
