<?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.35 (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-04" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="Workload Identity">Workload Identity Practices</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-workload-identity-practices-04"/>
    <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="2026" month="April" day="10"/>
    <area>Applications and Real-Time</area>
    <workgroup>Workload Identity in Multi System Environments</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 88?>

<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="WIMSE-ARCH"/> and other protocols, such as
<xref target="WIMSE-HTTPSIG"/>.</t>
    </abstract>
  </front>
  <middle>
    <?line 98?>

<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 must 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. Credentials <bcp14>SHOULD</bcp14> have as small a set of audiences
   as possible to limit the scope of any single credential. See <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. The credential used for this step <bcp14>SHOULD</bcp14> be scoped specifically
   to the platform resource being accessed.</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
    credential used for federation <bcp14>SHOULD</bcp14> carry the Identity Provider as its
    sole audience and <bcp14>SHOULD NOT</bcp14> be the same credential used for platform
    access in step A). 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="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 <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). Solutions <bcp14>SHOULD</bcp14> 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 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>
    <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. Tokens <bcp14>SHOULD</bcp14> have a minimal set of audiences;
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 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="164" y="84">A)</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="204" y="244">B)</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  |
         |                      +--------------+           |
         |         A) access    |              |           |
         |      +-------------->|  API Server  |           |
         |      |               |              |           |
         |      |               +--------------+           |
         | +----+----+                  ^ 1) request token |
         | |         | 2) schedule +----+----+             |
         | |   Pod   |<------------+ Kubelet |             |
         | |         |             +---------+             |
         | +-+-+---+-+                                     |
         |   | |   |                      +--------------+ |
         |   | |   |    B) 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
   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>A) Access the Kubernetes Control Plane, using a token audienced for the
   API server, considering it has access to it.</t>
          </li>
          <li>
            <t>B) Access other resources within the cluster, for instance, other Pods, using
   a token audienced for the target resource.</t>
          </li>
          <li>
            <t>C) Access resources outside of the cluster:</t>
          </li>
          <li>
            <t>C1) 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. This token <bcp14>SHOULD NOT</bcp14> be the same
    token used for steps A or B. 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>C2) Using the credential issued in step C1, the application within the Pod
    accesses resources outside of the cluster.</t>
          </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 identity
credentials in one of two forms:</t>
        <ul spacing="normal">
          <li>
            <t>X509-SVID, a 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.
The Workload API does not require clients to authenticate themselves.</t>
          </li>
        </ul>
        <t>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. This
    <bcp14>SHOULD</bcp14> be a separate JWT-SVID from the one used in step A). 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>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>
        <t>When a workload needs to access both internal platform resources and external
resources, it <bcp14>SHOULD</bcp14> obtain separate credentials for each purpose. The credential
used for internal platform access (step A) <bcp14>SHOULD 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.</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>SHOULD</bcp14> be scoped to its intended use with a distinct 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>SHOULD 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>
      </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 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 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>3) 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>
      </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="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. 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>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-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 component on the machine or
in the infrastructure can be able to eavesdrop on 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. 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 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 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 server-side request forgery). 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 <bcp14>SHOULD</bcp14> minimise which components can access credentials
and prefer proof-of-possession credentials over bearer tokens where supported. Failure to
minimise 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 behaviour 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 and Identity Providers accepting these tokens <bcp14>SHOULD</bcp14> validate the
value of it according to policy. See <xref section="3.1" sectionFormat="of" target="JWT-BCP"/> for details
on explicit typing. Without explicit typing, a token intended for one purpose
(e.g., 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>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 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 <bcp14>SHOULD</bcp14> make use of these claims.
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 <bcp14>SHOULD</bcp14> allow differentiation
based on the 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>SHOULD NOT</bcp14> 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. 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 recommended. 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>SHOULD</bcp14> invalidate tokens when the workload stops, pauses, or
ceases to exist and <bcp14>SHOULD</bcp14> offer validators a mechanism to query this status.
Without invalidation, tokens for terminated workloads 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 a workload has been
removed and must accept the token as is. 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 workloads, and proof of possession
<bcp14>SHOULD</bcp14> be performed when these credentials are used. This mitigates token theft.
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.
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. Where proof of
possession is not supported by the platform or the relying party, deployments
<bcp14>SHOULD</bcp14> compensate with shorter token lifetimes, stricter audience scoping, and
additional network-level controls such as IP allowlisting or mutual TLS. 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 <bcp14>MUST</bcp14> be audienced using the
<tt>aud</tt> claim. Each JWT <bcp14>SHOULD</bcp14> only carry a single audience. 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. We RECOMMEND using
URIs to specify audiences. 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>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 <bcp14>SHOULD</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, Justin Richer, Pieter Kasselmann, Simon Canning, Evan Gilman, Joseph Salowey, Kathleen Moriarty and Flemming Andreasen.</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="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="26" month="March" 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-07"/>
        </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="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>
        <reference anchor="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="2" month="March" year="2026"/>
            <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
   software executing for a specific purpose, potentially comprising one
   or more running instances.  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-07"/>
        </reference>
        <reference anchor="WIMSE-HTTPSIG">
          <front>
            <title>WIMSE Workload-to-Workload Authentication with HTTP Signatures</title>
            <author fullname="Joseph A. Salowey" initials="J. A." surname="Salowey">
              <organization>CyberArk</organization>
            </author>
            <author fullname="Yaron Sheffer" initials="Y." surname="Sheffer">
              <organization>Intuit</organization>
            </author>
            <date day="7" month="April" year="2026"/>
            <abstract>
              <t>   The WIMSE architecture defines authentication and authorization for
   software workloads in a variety of runtime environments, from the
   most basic ones to complex multi-service, multi-cloud, multi-tenant
   deployments.  This document defines one of the mechanisms to provide
   workload authentication, using HTTP Signatures.  While only
   applicable to HTTP traffic, the protocol provides end-to-end
   protection of requests (and optionally, responses), even when service
   traffic is not end-to-end encrypted, that is, when TLS proxies and
   load balancers are used.  Authentication is based on the Workload
   Identity Token (WIT).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-http-signature-03"/>
        </reference>
      </references>
    </references>
    <?line 931?>

<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 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>-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:
H4sIAAAAAAAAA8V96XrbyLXg/3oKRP6+iR0TtCTbbVtZbmRJbsvdsj2WOk4m
X24bBIokWiDAC4CSGbXzLPMs82RzttoAkJK7M3eUL22JBGo5dersSxzHqs3b
Qh9EH6v6sqiSLDrNdAmfraP3dZK2eaoblUwmtb4aeEZlVVomC3g9q5NpG+e6
ncbX+aLR8bU8G+fybLw048W7T1SatHpW1euDKC+nlVL5sj6I2nrVtPu7uy92
91VS6+Qg2jlcLoscHs6rsomSMos+6KSIL/KF3lE4xayuVkt4rr/8vIzOVkWb
R+frptWL6KS8yuuqXMDXzY661Gt4PTuITstW16Vu42PcgVJNC7P8mBRVCbta
w+aX+YGKonqa6qxp14V8GkVtlXq/5iXOaz5oqrqt9bSxf68XwZ9tnaf24bRa
0KLM33lZ5KWbRn9u4yJv2hgGmVQFPBZXv3sI3wDsF8lymZczflYlq3Ze1bDa
GL7FceDZw3F0ns6vdXnZpHOArq7pOz60w7rM2sHv9SLJi4MowQeaMR7rn2f4
0RgWSw9UNcx6/v70w/cqmO9v4+hD1VSL5HJeeTP9LamrpkiuOl/KNOvafPrn
fzZpUug6nOd/8YdKpVUJoJus2u42X46j19V0kZSlN+lLXeosv2yDr2TKOX80
nsgzf25yDafQdDbIH4ZbfD2OLgBY1VSX+cyb7jWMp5vud2Y++nLc2i8Bnp/H
gHe3THYyjr7NAVGT0gfnSVYldVaFX8lMmr8bz+S7P5fVZZ6E+3qLHylVVvUC
rtaVPlB4C+0fUfTu9PjogJ6PLFbxDy81ucwXqzoZRW/Ho+hlnWSFXo+iN/DH
G7g4zSg6g18zHZ3pTMOtgw9ewgd4f4/G0RncjnxR1ZrHFAL0bqnL0+PoqAJA
pS38W+tob7wLYEirelnVsLZyFukafkmiRrfRnrye1DMNl2netsvm4NGjCsbJ
MwTto2ap00Y+iFMeGP6tdbz34+543i4KHiIDYnQQPQewXOnFRNfR/u7eE4HC
cd6k8DFQKtWHxp2BQVt/k8DHJ2O1edN2su0731e/ZOOZGTzcPW9+72l0rFOz
+/3H8NV3qwlRRt2c6/oKCPdhmlYrIHLBsbmnInkskueGj+fSPj/Oq0dAw5pH
sMBUL9vmUaPTVQ20G36hkeKER2oe+ee0txudJWtcJZ7RRXWpyw/6KtfXf9nb
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
DrNq6Rm4GVk+fqv+L27MzCeKvQAA

-->

</rfc>
