<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<?rfc 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-03" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.2 -->
  <front>
    <title abbrev="Workload Identity">Workload Identity Practices</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-workload-identity-practices-03"/>
    <author initials="A." surname="Schwenkschuster" fullname="Arndt Schwenkschuster">
      <organization>SPIRL</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="2025" month="October" day="17"/>
    <area>Applications and Real-Time</area>
    <workgroup>Workload Identity in Multi System Environments</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 102?>

<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
<xref target="I-D.ietf-wimse-arch"/> and other protocols, such as
<xref target="I-D.ietf-wimse-s2s-protocol"/>.</t>
    </abstract>
  </front>
  <middle>
    <?line 112?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Just like people, the workloads inside container orchestration systems (e.g.,
Kubernetes) need identities 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="RFC6749"/> 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 other identity providers, which in
turn, issue credentials that grant access to resources.</t>
      <t>Traditionally, workloads were provisioned with client credentials and used for
example the corresponding client credential flow (Section 1.3.4 <xref target="RFC6749"/>) to
retrieve an OAuth 2.0 access token. This model presents a number of security and
maintenance issues. Secret materials must be provisioned and rotated, which
requires either automation to be built, or periodic manual effort. Secret
materials can be stolen and used by attackers to impersonate the workload.
Other, non OAuth 2.0 flows, such as direct API keys or other secrets, 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="RFC7519"/>). 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) Platform issues credential to workload. The way this is achieved varies
   by platform, for instance, it can be pushed to the workload or
   pulled by the workload.</t>
        </li>
        <li>
          <t>A) The credential can give the workload direct access to resources within the
   platform or the platform itself (e.g., to perform infrastructure operations)</t>
        </li>
        <li>
          <t>B1) The workload uses the credential to federate to an Identity Provider. This
    step is optional and only needed when accessing outside resources.</t>
        </li>
        <li>
          <t>B2) The workload accesses resources outside of the platform and uses the
    federated identity obtained in the previous step.</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="terminology">
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all
capitals, as shown here.</t>
    </section>
    <section anchor="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="environment-variables">
        <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>
      </section>
      <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 SHOULD 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). Solutions SHOULD also
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
unauthorised access to the local API. In addition, the pattern requires client-side
code, which may introduce portability challenges. The request–response paradigm
can also increase latency, particularly when communication goes over the network.</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
(JWTs) <xref target="RFC7519"/> 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>
        </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="RFC7517"/> is exposed via a web server. This
allows the Service Account Token to be validated outside of the cluster and
access to the actual 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">B1)</text>
                  <text x="244" y="244">access</text>
                  <text x="404" y="260">Resource</text>
                  <text x="16" y="372">C1)</text>
                  <text x="68" y="372">federate</text>
                  <text x="152" y="372">C2)</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 |             |
         | |         |             +---------+             |
         | +-+-+---+-+                                     |
         |   | |   |                      +--------------+ |
         |   | |   |   B1) access         |              | |
         |   | |   +--------------------->|   Resource   | |
         |   | |                          |              | |
         |   | |                          +--------------+ |
         |   | |                                           |
         +---+-+-------------------------------------------+
             | |
             | |                          +--------------+
C1) federate | | C2) 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
   a Service Account Token from the Kubernetes API server.</t>
          </li>
          <li>
            <t>2) The kubelet starts the Pod and, based on the configuration of the Pod,
   delivers the token to the containers within the Pod.</t>
          </li>
        </ul>
        <t>Now, the Pod can use the token to:</t>
        <ul spacing="normal">
          <li>
            <t>A) Access the Kubernetes Control Plane, considering it has access to it.</t>
          </li>
          <li>
            <t>B) Access other resources within the cluster, for instance, other Pods.</t>
          </li>
          <li>
            <t>C) Access resources outside of the cluster:  </t>
            <ul spacing="normal">
              <li>
                <t>C1) The application within the Pod uses the Service Account Token to
    federate to an Identity Provider outside of the Kubernetes Cluster.</t>
              </li>
              <li>
                <t>C2) Using the federated identity, the application within the Pod accesses
    resources outside of the cluster.</t>
              </li>
            </ul>
          </li>
        </ul>
        <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": "https://kubernetes.default.svc",  # matches the first value passed to the --service-account-issuer flag
  "jti": "ea28ed49-2e11-4280-9ec5-bc3d1d84661a",  # ServiceAccountTokenJTI feature must be enabled for the claim to be present
  "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 either X.509
certificates or JWTs. The Workload API does not require clients to authenticate themselves.
Instead, implementation collect identifying information of the workload from the
environment, such as the workload platform or the operating system.</t>
        <t>SPIFFE refers to the JWT-formatted credential as a "JWT-SVID" (JWT - SPIFFE
Verifiable Identity Document) and the X509-formatted credential as "X509-SVID".</t>
        <t>Workloads are required to specify at least one audience when requesting a
JWT-SVID from the Workload API.</t>
        <t>For validation, SPIFFE offers:</t>
        <ul spacing="normal">
          <li>
            <t>A set of public keys encoded in JWK format <xref target="RFC7517"/> retrieved from the Workload
API that can be used to validate signatures. In SPIFFE this is referred to as
the "trust bundle".</t>
          </li>
          <li>
            <t>An endpoint where the public keys used for signing are published in JWK format <xref target="RFC7517"/>. See SPIFFE Bundle Endpoint at <xref target="SPIFFE"/>.</t>
          </li>
        </ul>
        <t>The following figure illustrates how a workload can use its JWT-SVID to access a
protected resource outside of SPIFFE:</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 a JWT-SVID from the SPIFFE Workload API.</t>
          </li>
          <li>
            <t>A) The JWT-SVID 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 the SPIFFE JWT-SVID to federate to the Identity Provider.</t>
          </li>
          <li>
            <t>B2) Once federated, the workload can access resources outside of its trust
    domain.</t>
          </li>
        </ul>
        <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>Workloads in cloud platforms can have any shape or form. 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. JWT, however, is the one that is common across all of them.
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>
        <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="520" viewBox="0 0 520 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 328,80 L 328,160" fill="none" stroke="black"/>
                <path d="M 368,192 L 368,256" fill="none" stroke="black"/>
                <path d="M 368,384 L 368,448" fill="none" stroke="black"/>
                <path d="M 488,80 L 488,160" fill="none" stroke="black"/>
                <path d="M 488,192 L 488,256" fill="none" stroke="black"/>
                <path d="M 488,384 L 488,448" fill="none" stroke="black"/>
                <path d="M 512,32 L 512,272" fill="none" stroke="black"/>
                <path d="M 512,336 L 512,528" fill="none" stroke="black"/>
                <path d="M 40,32 L 512,32" fill="none" stroke="black"/>
                <path d="M 328,80 L 488,80" fill="none" stroke="black"/>
                <path d="M 64,96 L 184,96" fill="none" stroke="black"/>
                <path d="M 184,112 L 320,112" fill="none" stroke="black"/>
                <path d="M 64,160 L 184,160" fill="none" stroke="black"/>
                <path d="M 328,160 L 488,160" fill="none" stroke="black"/>
                <path d="M 368,192 L 488,192" fill="none" stroke="black"/>
                <path d="M 168,224 L 360,224" fill="none" stroke="black"/>
                <path d="M 368,256 L 488,256" fill="none" stroke="black"/>
                <path d="M 40,272 L 512,272" fill="none" stroke="black"/>
                <path d="M 40,336 L 512,336" fill="none" stroke="black"/>
                <path d="M 368,384 L 488,384" fill="none" stroke="black"/>
                <path d="M 128,416 L 360,416" fill="none" stroke="black"/>
                <path d="M 64,448 L 304,448" fill="none" stroke="black"/>
                <path d="M 368,448 L 488,448" fill="none" stroke="black"/>
                <path d="M 64,512 L 304,512" fill="none" stroke="black"/>
                <path d="M 40,528 L 512,528" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="368,416 356,410.4 356,421.6" fill="black" transform="rotate(0,360,416)"/>
                <polygon class="arrowhead" points="368,224 356,218.4 356,229.6" fill="black" transform="rotate(0,360,224)"/>
                <polygon class="arrowhead" points="328,112 316,106.4 316,117.6" fill="black" transform="rotate(0,320,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="480" y="52">Cloud</text>
                  <text x="204" y="100">1)</text>
                  <text x="232" y="100">get</text>
                  <text x="284" y="100">identity</text>
                  <text x="372" y="116">Instance</text>
                  <text x="444" y="116">Metadata</text>
                  <text x="124" y="132">Workload</text>
                  <text x="412" y="132">Service/Endpoint</text>
                  <text x="220" y="212">A)</text>
                  <text x="260" y="212">access</text>
                  <text x="428" 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="316" y="356">External</text>
                  <text x="376" y="356">(e.g.</text>
                  <text x="424" y="356">other</text>
                  <text x="476" y="356">cloud)</text>
                  <text x="428" 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 identity |                   |  |
    |  |              +---------------->| 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 an identity 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.</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 the credential
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 the cloud-issued credential to federate to the Secure Token
    Service of the other cloud/account.</t>
          </li>
          <li>
            <t>B2) Using the federated identity, the workload can access the resource outside,
    assuming the federated identity has the necessary permissions.</t>
          </li>
        </ul>
      </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>
        <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 104,160 L 104,264" fill="none" stroke="black"/>
                <path d="M 120,160 L 120,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 120,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"/>
                <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="112,264 100,258.4 100,269.6" fill="black" transform="rotate(90,104,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="12" y="228">2)</text>
                  <text x="60" y="228">federate</text>
                  <text x="140" y="228">3)</text>
                  <text x="180" 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)    |             |            |  |
    | |                 |             +------------+  |
    | +-----+-+---------+                             |
    +-------+-+---------------------------------------+
            | |
            | |                     +--------------+
2) federate | | 3) 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>2) The workload uses the identity to federate to an Identity Provider.</t>
          </li>
          <li>
            <t>3) The workload uses the federated identity 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>
      </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 workload</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="352" width="464" viewBox="0 0 464 352" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 56,144 L 56,208" fill="none" stroke="black"/>
                <path d="M 56,272 L 56,336" fill="none" stroke="black"/>
                <path d="M 104,64 L 104,136" fill="none" stroke="black"/>
                <path d="M 104,216 L 104,272" fill="none" stroke="black"/>
                <path d="M 152,144 L 152,208" fill="none" stroke="black"/>
                <path d="M 152,272 L 152,336" fill="none" stroke="black"/>
                <path d="M 168,32 L 168,96" fill="none" stroke="black"/>
                <path d="M 288,32 L 288,96" fill="none" stroke="black"/>
                <path d="M 312,144 L 312,208" fill="none" stroke="black"/>
                <path d="M 312,272 L 312,336" fill="none" stroke="black"/>
                <path d="M 360,64 L 360,136" fill="none" stroke="black"/>
                <path d="M 360,216 L 360,272" fill="none" stroke="black"/>
                <path d="M 408,144 L 408,208" fill="none" stroke="black"/>
                <path d="M 408,272 L 408,336" fill="none" stroke="black"/>
                <path d="M 168,32 L 288,32" fill="none" stroke="black"/>
                <path d="M 104,64 L 168,64" fill="none" stroke="black"/>
                <path d="M 288,64 L 360,64" fill="none" stroke="black"/>
                <path d="M 168,96 L 288,96" fill="none" stroke="black"/>
                <path d="M 56,144 L 152,144" fill="none" stroke="black"/>
                <path d="M 312,144 L 408,144" fill="none" stroke="black"/>
                <path d="M 160,174 L 304,174" fill="none" stroke="black"/>
                <path d="M 160,178 L 304,178" fill="none" stroke="black"/>
                <path d="M 56,208 L 152,208" fill="none" stroke="black"/>
                <path d="M 312,208 L 408,208" fill="none" stroke="black"/>
                <path d="M 56,272 L 152,272" fill="none" stroke="black"/>
                <path d="M 312,272 L 408,272" fill="none" stroke="black"/>
                <path d="M 56,336 L 152,336" fill="none" stroke="black"/>
                <path d="M 312,336 L 408,336" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="368,216 356,210.4 356,221.6" fill="black" transform="rotate(270,360,216)"/>
                <polygon class="arrowhead" points="368,136 356,130.4 356,141.6" fill="black" transform="rotate(90,360,136)"/>
                <polygon class="arrowhead" points="312,176 300,170.4 300,181.6" fill="black" transform="rotate(0,304,176)"/>
                <polygon class="arrowhead" points="168,176 156,170.4 156,181.6" fill="black" transform="rotate(180,160,176)"/>
                <polygon class="arrowhead" points="112,216 100,210.4 100,221.6" fill="black" transform="rotate(270,104,216)"/>
                <polygon class="arrowhead" points="112,136 100,130.4 100,141.6" fill="black" transform="rotate(90,104,136)"/>
                <g class="text">
                  <text x="208" y="68">Service</text>
                  <text x="260" y="68">Mesh</text>
                  <text x="12" y="84">1)</text>
                  <text x="48" y="84">issue</text>
                  <text x="380" y="84">1)</text>
                  <text x="416" y="84">issue</text>
                  <text x="60" y="100">identity</text>
                  <text x="428" y="100">identity</text>
                  <text x="172" y="132">3)</text>
                  <text x="232" y="132">communicate</text>
                  <text x="196" y="148">on</text>
                  <text x="236" y="148">behalf</text>
                  <text x="276" y="148">of</text>
                  <text x="224" y="164">workloads</text>
                  <text x="104" y="180">Proxy</text>
                  <text x="360" y="180">Proxy</text>
                  <text x="124" y="244">2)</text>
                  <text x="172" y="244">delegate</text>
                  <text x="380" y="244">2)</text>
                  <text x="428" y="244">delegate</text>
                  <text x="100" y="308">Workload</text>
                  <text x="356" y="308">Workload</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                    +--------------+
                    |              |
            +-------+ Service Mesh +--------+
1) issue    |       |              |        | 1) issue
   identity |       +--------------+        |    identity
            |                               |
            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 identities in the form of credentials
   to proxies.</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 spects, for instance in the form of 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="RFC7521"/> apply.</t>
      <section anchor="security-credential-delivery">
        <name>Credential Delivery</name>
        <section anchor="environment-variables-1">
          <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.</t>
          <t>This approach should be limited to non-production cases where convenience
outweighs security considerations, and the provided secrets are limited in
validity or utility. For example, an initial secret might be used during the
setup of the application.</t>
        </section>
        <section anchor="filesystem-1">
          <name>Filesystem</name>
          <ul spacing="normal">
            <li>
              <t>1) Access control to the mounted file should be configured to limit reads to
   authorized applications. Linux supports solutions such as DAC (uid and
   gid) or MAC (e.g., SELinux, AppArmor).</t>
            </li>
            <li>
              <t>2) Mounted shared memory should be isolated from other host OS paths and
   processes. For example, on Linux this can be achieved by using namespaces.</t>
            </li>
          </ul>
        </section>
        <section anchor="local-apis-1">
          <name>Local APIs</name>
          <t>Local APIs often operate in clear-text such as unencrypted HTTP without any
confidentiality or integrity protection. Privileged component on the machine or
in the infrastructure can be able to eyes-drop the connection and the credential
within it.</t>
          <t>Mitigating measures are required to mitigate a particular variant of Server-Side Request Forgery attacks
against local APIs. For example, requiring a specific header that
cannot be controlled externally or preventing the use of link-local IPs,
including through redirects.</t>
          <t>Adequate attestation is required to make sure unauthorized access is denied and credentials
are not issued to other parties when the Local API is unauthenticated. 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 the attestation, 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 need to be taken
into account and protective measures should be implemented. Depending on the platform
these attacks can affect other workloads and their ability to receive a platform
credential.</t>
        </section>
      </section>
      <section anchor="token-typing">
        <name>Token typing</name>
        <t>Issuers SHOULD strongly type the issued tokens to workloads via the JOSE <tt>typ</tt>
header and Identity Providers accepting these tokens SHOULD validate the
value of it according to policy. See Section 3.1 of <xref target="RFC8725"/> for details
on explicit typing.</t>
        <t>Issuers SHOULD use <tt>authorization-grant+jwt</tt> as a <tt>typ</tt> value according to
<xref target="I-D.ietf-oauth-rfc7523bis"/>. For broad support, <tt>JWT</tt> or <tt>JOSE</tt> MAY 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.</t>
      </section>
      <section anchor="custom-claims-are-important-for-context">
        <name>Custom claims are important for context</name>
        <t>Some platform-issued credentials have custom claims that are vital for context
and are required to be validated. 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 SHOULD make use of these claims.
Platform issuers SHOULD allow differentiation based on the subject claim alone.</t>
      </section>
      <section anchor="token-lifetime">
        <name>Token lifetime</name>
        <t>Tokens SHOULD NOT exceed the lifetime of the workloads they represent. For
example, a workload that has an expected lifetime of one hour should not receive
a token valid for two hours or more.</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 recommended.</t>
      </section>
      <section anchor="workload-lifecycle-and-invalidation">
        <name>Workload lifecycle and invalidation</name>
        <t>Platform issuers SHOULD invalidate tokens when the workload stops, pauses, or
ceases to exist and SHOULD offer validators a mechanism to query this status.
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>Credentials SHOULD be bound to workloads, and proof of possession SHOULD be
performed when these credentials are used. This mitigates token theft. This
proof of possession applies to both the platform credential and the access token of
the external authorization domains.</t>
      </section>
      <section anchor="audience">
        <name>Audience</name>
        <t>For issued credentials in the form of JWTs, they MUST be audienced using the
<tt>aud</tt> claim. Each JWT SHOULD only carry a single audience. We RECOMMEND using
URIs to specify audiences. See Section 3 of <xref target="RFC8707"/> for more details and
security implications.</t>
        <t>Some workload platforms provide credentials for interacting with their own APIs
(e.g., Kubernetes). These credentials MUST NOT be used beyond the platform API.
In the example of Kubernetes, a token used for anything other than the Kubernetes
API itself MUST NOT carry the Kubernetes server in the <tt>aud</tt> claim.</t>
      </section>
      <section anchor="multi-tenancy-considerations">
        <name>Multi-Tenancy Considerations</name>
        <t>In multi-tenant platforms, relying parties MUST carefully evaluate which attributes
are considered trustworthy when making authorization decisions. Access or federation
MUST NOT be granted based solely on untrusted or easily forgeable attributes.
In particular, the <tt>issuer</tt> 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 SHOULD 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.</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, Justin Richer, Pieter Kasselmann, Simon Canning, Evan Gilman and Joseph Salowey.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC7517">
          <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="RFC7519">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </reference>
        <reference anchor="RFC7521">
          <front>
            <title>Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="Y. Goland" initials="Y." surname="Goland"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification provides a framework for the use of assertions with OAuth 2.0 in the form of a new client authentication mechanism and a new authorization grant type. Mechanisms are specified for transporting assertions during interactions with a token endpoint; general processing rules are also specified.</t>
              <t>The intent of this specification is to provide a common framework for OAuth 2.0 to interwork with other identity systems using assertions and to provide alternative client authentication mechanisms.</t>
              <t>Note that this specification only defines abstract message flows and processing rules. In order to be implementable, companion specifications are necessary to provide the corresponding concrete instantiations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7521"/>
          <seriesInfo name="DOI" value="10.17487/RFC7521"/>
        </reference>
        <reference anchor="RFC7523">
          <front>
            <title>JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification defines the use of a JSON Web Token (JWT) Bearer Token as a means for requesting an OAuth 2.0 access token as well as for client authentication.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7523"/>
          <seriesInfo name="DOI" value="10.17487/RFC7523"/>
        </reference>
        <reference anchor="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="RFC8414">
          <front>
            <title>OAuth 2.0 Authorization Server Metadata</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client can use to obtain the information needed to interact with an OAuth 2.0 authorization server, including its endpoint locations and authorization server capabilities.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8414"/>
          <seriesInfo name="DOI" value="10.17487/RFC8414"/>
        </reference>
        <reference anchor="RFC8693">
          <front>
            <title>OAuth 2.0 Token Exchange</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="A. Nadalin" initials="A." surname="Nadalin"/>
            <author fullname="B. Campbell" initials="B." role="editor" surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="January" year="2020"/>
            <abstract>
              <t>This specification defines a protocol for an HTTP- and JSON-based Security Token Service (STS) by defining how to request and obtain security tokens from OAuth 2.0 authorization servers, including security tokens employing impersonation and delegation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8693"/>
          <seriesInfo name="DOI" value="10.17487/RFC8693"/>
        </reference>
        <reference anchor="RFC8707">
          <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="RFC8725">
          <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-oauth-rfc7523bis">
          <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="7" month="October" year="2025"/>
            <abstract>
              <t>   This specification updates the requirements for 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-03"/>
        </reference>
        <reference anchor="I-D.ietf-wimse-arch">
          <front>
            <title>Workload Identity in a Multi System Environment (WIMSE) Architecture</title>
            <author fullname="Joseph A. Salowey" initials="J. A." surname="Salowey">
              <organization>CyberArk</organization>
            </author>
            <author fullname="Yaroslav Rosomakho" initials="Y." surname="Rosomakho">
              <organization>Zscaler</organization>
            </author>
            <author fullname="Hannes Tschofenig" initials="H." surname="Tschofenig">
              <organization>University of Applied Sciences Bonn-Rhein-Sieg</organization>
            </author>
            <date day="30" month="September" year="2025"/>
            <abstract>
              <t>   The increasing prevalence of cloud computing and micro service
   architectures has led to the rise of complex software functions being
   built and deployed as workloads, where a workload is defined as a
   running instance of software executing for a specific purpose.  This
   document discusses an architecture for designing and standardizing
   protocols and payloads for conveying workload identity and security
   context information.

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-s2s-protocol-07"/>
        </reference>
        <reference anchor="OIDC" target="https://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>OpenID Connect Core 1.0 incorporating errata set 1</title>
            <author>
              <organization>Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and C. Mortimore</organization>
            </author>
            <date year="2014" month="November"/>
          </front>
        </reference>
        <reference anchor="OIDCDiscovery" target="https://openid.net/specs/openid-connect-discovery-1_0.html">
          <front>
            <title>OpenID Connect Discovery 1.0 incorporating errata set 2</title>
            <author>
              <organization>Sakimura, N., Bradley, J., Jones, M. and Jay, E.</organization>
            </author>
            <date year="2023" month="December"/>
          </front>
        </reference>
        <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 801?>

<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="RFC7521"/> and <xref target="RFC7523"/> are the proposed standards for this pattern, some authorization servers use <xref target="RFC8693"/> or a custom API for the issuance of an access token based on existing platform identity credentials. These patterns are not recommended and prevent interoperability.</t>
      </section>
    </section>
    <section anchor="document-history">
      <name>Document History</name>
      <t>[[ To be removed from the final specification ]]</t>
      <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:
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
e67uzMlxWi6DnWpMLJ+/i/4fam3HpkOVAAA=

-->

</rfc>
