<?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.24 (Ruby 3.3.6) -->
<?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-01" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.0 -->
  <front>
    <title abbrev="Workload Identity">Workload Identity Practices</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-workload-identity-practices-01"/>
    <author initials="A." surname="Schwenkschuster" fullname="Arndt Schwenkschuster" role="editor">
      <organization>SPIRL</organization>
      <address>
        <email>arndts.ietf@gmail.com</email>
      </address>
    </author>
    <author initials="B." surname="Hofmann" fullname="Benedikt Hofmann">
      <organization>Siemens</organization>
      <address>
        <email>hofmann.benedikt@siemens.com</email>
      </address>
    </author>
    <author initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
      <organization>Siemens</organization>
      <address>
        <email>hannes.tschofenig@gmx.net</email>
      </address>
    </author>
    <author initials="E." surname="Giordano" fullname="Edoardo Giordano">
      <organization>Nokia</organization>
      <address>
        <email>edoardo.giordano@nokia.com</email>
      </address>
    </author>
    <author initials="Y." surname="Rosomakho" fullname="Yaroslav Rosomakho">
      <organization>Zscaler</organization>
      <address>
        <email>yrosomakho@zscaler.com</email>
      </address>
    </author>
    <date year="2025" month="March" day="03"/>
    <area>Applications and Real-Time</area>
    <workgroup>Workload Identity in Multi System Environments</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 99?>

<t>The use of the OAuth 2.0 framework in container orchestration systems poses challenges, particularly in managing credentials such as client_id and client_secret, which can be complex and prone to errors. To address this, the industry has shifted towards a federation-based approach where credentials of the underlying workload platform are used as assertions towards an OAuth authorization server, leveraging the Assertion Framework for OAuth 2.0 Client Authentication <xref target="RFC7521"/>, specifically <xref target="RFC7523"/>.</t>
      <t>This specification describes a meta flow in <xref target="overview"/>, gives security recommendations in <xref target="recommendations"/> and outlines concrete patterns in <xref target="patterns"/>. It referes to existing industry practices that are mainly built on top of OAuth. It may not be in line with the (currently work in progress) WIMSE architecture <xref target="I-D.ietf-wimse-arch"/> and other protocols, such as <xref target="I-D.ietf-wimse-s2s-protocol"/>.</t>
    </abstract>
  </front>
  <middle>
    <?line 105?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Workloads often require access to external resources to perform their tasks. For example, access to a database, a web server or another workload. These resources are protected by an authorization server and can only be accessed with an access token. The challenge for workloads is to get this access token issued.</t>
      <t>Traditionally, workloads were provisioned with client credentials and use the corresponding client credential flow (Section 1.3.4 <xref target="RFC6749"/>) to retrieve an access token. This model comes with a set of challenges that make it insecure and high-maintenance. Secret materials need to be provisioned and rotated, which often happens manually. It also can be stolen and used by attackers to impersonate the workload.</t>
      <t>A solution to this problem is to not provision secret material to the workload and use the platform the workload runs on to attest for it. Many workload platforms offer a credential, in most cases a JWT token. Signed by a platform-internal authorization server, the credential attests the workload and its attributes. Based on <xref target="RFC7521"/> and its JWT profile <xref target="RFC7523"/>, this credential can then be used as a client assertion towards a different authorization server.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all
capitals, as shown here.</t>
      <t>For the scope of this specification, the term authorization server is only used for the authorization server of the external authorization domain as highlighted in <xref target="fig-overview"/>.</t>
      <t>Even though, technically, the platform credential is also issued by an authorization server within the workload platform, this specification only refers to it as "platform issuer" or just "platform".</t>
    </section>
    <section anchor="oauth-assertion-in-workload-environments">
      <name>OAuth Assertion in Workload Environments</name>
      <section anchor="overview">
        <name>Overview</name>
        <t><xref target="fig-overview"/> illustrates a generic pattern that applies across all of the patterns described in <xref target="patterns"/>:</t>
        <figure anchor="fig-overview">
          <name>OAuth2 Assertion Flow in generic Workload Environment</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="416" width="496" viewBox="0 0 496 416" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 16,32 L 16,160" fill="none" stroke="black"/>
                <path d="M 16,272 L 16,400" fill="none" stroke="black"/>
                <path d="M 32,80 L 32,144" fill="none" stroke="black"/>
                <path d="M 40,320 L 40,384" fill="none" stroke="black"/>
                <path d="M 96,144 L 96,208" fill="none" stroke="black"/>
                <path d="M 96,240 L 96,320" fill="none" stroke="black"/>
                <path d="M 176,144 L 176,176" fill="none" stroke="black"/>
                <path d="M 176,208 L 176,320" fill="none" stroke="black"/>
                <path d="M 224,240 L 224,320" fill="none" stroke="black"/>
                <path d="M 240,80 L 240,144" fill="none" stroke="black"/>
                <path d="M 256,320 L 256,336" fill="none" stroke="black"/>
                <path d="M 256,368 L 256,384" fill="none" stroke="black"/>
                <path d="M 288,80 L 288,144" fill="none" stroke="black"/>
                <path d="M 352,320 L 352,336" fill="none" stroke="black"/>
                <path d="M 352,368 L 352,384" fill="none" stroke="black"/>
                <path d="M 376,144 L 376,176" fill="none" stroke="black"/>
                <path d="M 376,208 L 376,240" fill="none" stroke="black"/>
                <path d="M 456,80 L 456,144" fill="none" stroke="black"/>
                <path d="M 464,320 L 464,384" fill="none" stroke="black"/>
                <path d="M 488,32 L 488,160" fill="none" stroke="black"/>
                <path d="M 488,272 L 488,400" fill="none" stroke="black"/>
                <path d="M 16,32 L 488,32" fill="none" stroke="black"/>
                <path d="M 32,80 L 240,80" fill="none" stroke="black"/>
                <path d="M 288,80 L 456,80" fill="none" stroke="black"/>
                <path d="M 32,144 L 88,144" fill="none" stroke="black"/>
                <path d="M 104,144 L 240,144" fill="none" stroke="black"/>
                <path d="M 288,144 L 368,144" fill="none" stroke="black"/>
                <path d="M 384,144 L 456,144" fill="none" stroke="black"/>
                <path d="M 16,160 L 488,160" fill="none" stroke="black"/>
                <path d="M 224,240 L 376,240" fill="none" stroke="black"/>
                <path d="M 16,272 L 488,272" fill="none" stroke="black"/>
                <path d="M 40,320 L 168,320" fill="none" stroke="black"/>
                <path d="M 184,320 L 256,320" fill="none" stroke="black"/>
                <path d="M 352,320 L 464,320" fill="none" stroke="black"/>
                <path d="M 256,352 L 352,352" fill="none" stroke="black"/>
                <path d="M 40,384 L 256,384" fill="none" stroke="black"/>
                <path d="M 352,384 L 464,384" fill="none" stroke="black"/>
                <path d="M 16,400 L 488,400" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="384,144 372,138.4 372,149.6" fill="black" transform="rotate(270,376,144)"/>
                <polygon class="arrowhead" points="360,352 348,346.4 348,357.6" fill="black" transform="rotate(0,352,352)"/>
                <polygon class="arrowhead" points="264,352 252,346.4 252,357.6" fill="black" transform="rotate(180,256,352)"/>
                <polygon class="arrowhead" points="184,320 172,314.4 172,325.6" fill="black" transform="rotate(90,176,320)"/>
                <polygon class="arrowhead" points="104,144 92,138.4 92,149.6" fill="black" transform="rotate(270,96,144)"/>
                <g class="text">
                  <text x="268" y="52">External</text>
                  <text x="360" y="52">Authorization</text>
                  <text x="444" y="52">Domain</text>
                  <text x="112" y="116">Authorization</text>
                  <text x="196" y="116">Server</text>
                  <text x="336" y="116">Protected</text>
                  <text x="412" y="116">Resource</text>
                  <text x="132" y="196">3)</text>
                  <text x="172" y="196">access</text>
                  <text x="224" y="196">token</text>
                  <text x="340" y="196">4)</text>
                  <text x="380" y="196">access</text>
                  <text x="12" y="228">2)</text>
                  <text x="56" y="228">present</text>
                  <text x="128" y="228">assertion</text>
                  <text x="364" y="292">Workload</text>
                  <text x="436" y="292">Platform</text>
                  <text x="404" y="340">Credential</text>
                  <text x="140" y="356">Workload</text>
                  <text x="388" y="356">issued</text>
                  <text x="428" y="356">by</text>
                  <text x="276" y="372">1)</text>
                  <text x="312" y="372">pull/</text>
                  <text x="396" y="372">Platform</text>
                  <text x="308" y="388">push</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
 +----------------------------------------------------------+
 |                           External Authorization Domain  |
 |                                                          |
 | +-------------------------+     +--------------------+   |
 | |                         |     |                    |   |
 | |   Authorization Server  |     | Protected Resource |   |
 | |                         |     |                    |   |
 | +-------^---------+-------+     +----------^---------+   |
 +---------+---------+------------------------+-------------+
           |         |                        |
           |   3) access token           4) access
           |         |                        |
2) present assertion |                        |
           |         |     +------------------+
           |         |     |
 +---------+---------+-----+--------------------------------+
 |         |         |     |             Workload Platform  |
 |         |         |     |                                |
 |  +------+---------v-----+---+           +-------------+  |
 |  |                          |           | Credential  |  |
 |  |        Workload          <-----------> issued by   |  |
 |  |                          | 1) pull/  | Platform    |  |
 |  +--------------------------+    push   +-------------+  |
 +----------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The figure outlines the following steps which are applicable in any pattern.</t>
        <ul spacing="normal">
          <li>
            <t>1) retrieve credential issued by platform. The way this is achieved and whether this is workload (pull) or platform (push) initiated differs based on the platform.</t>
          </li>
          <li>
            <t>2) present credential as an assertion towards an authorization server in an external authorization domain. This step uses the assertion_grant flow defined in <xref target="RFC7521"/> and, in case of JWT format, <xref target="RFC7523"/>.</t>
          </li>
          <li>
            <t>3) On success, an access token is returned to the workload to access the protected resource.</t>
          </li>
          <li>
            <t>4) The access token is used to access a protected resource in the external authorization domain. For instance by making a HTTP call.</t>
          </li>
        </ul>
        <t>Accessing different protected resources may require steps 2) to 4) again with different scope parameters. Accessing a protected resource in an entirely different authorization domain often requires the entire flow to be followed again, to retrieve a new platform-issued credential with an audience for the external authorization server. This, however, differs based on the platform and implementation.</t>
      </section>
      <section anchor="credential-issuance">
        <name>Credential issuance</name>
        <t>Credentials can be provisioned to the workload through different mechanisms which present different complexity and security risks. The following section highlights the pros and cons of most widespread solutions.</t>
        <section anchor="environment-variable">
          <name>Environment variable</name>
          <t>Injecting the credentials into the environmental variables allows for simple and fast deployments. Applications can directly access them through system-level mechanism, e.g., through the env command in linux. This flexibility, however, comes with security drawbacks.</t>
          <ul spacing="normal">
            <li>
              <t>1) environmental variables are static in nature and more dynamic solutions require to introduces higher complexity.</t>
            </li>
            <li>
              <t>2) performing access control to environmental variable is not trivial and it might also not reach the same security results.</t>
            </li>
            <li>
              <t>3) environmental 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 send to components outside of the workload.</t>
            </li>
          </ul>
          <t>Leveraging environmental variables to provide credentials presents many security limitations. This approach should be limited to cases where simplicity of the application is required, e.g., during PoCs, and the provided secrets should have a short-term validity, i.e., an initial secret during the set-up of the application.</t>
        </section>
        <section anchor="files">
          <name>Files</name>
          <t>Files allow to inject credentials into a container through the file-system and access them through primitives, e.g., Open, Close, etc. Such solutions enable secret rotation, and access control on the injected secret with standard operating system measure for files.</t>
          <ul spacing="normal">
            <li>
              <t>1) access control to the mounted file should be configure to limit access from unauthorized applications. E.g., on Linux solutions such as DAC (uid and guid) or MAC (SELinux,AppArmor) are available.</t>
            </li>
            <li>
              <t>2) isolating the mounted shared memory from critical host OS paths and processes is required. E.g, on Linux this is achieved by utilising namespaces.</t>
            </li>
            <li>
              <t>3) credentials rotation requires a solution to detect near-to-expiration secrets and substitute them. Solutions should enable configuration such that the new secret is renewed <em>before</em> the old secret is invalidated. E.g., the solution can choose to update the secret 1h before the old secret is invalidated. This enables applications time to update their usage of the old secret to the new without downtime.</t>
            </li>
          </ul>
          <t>Volume solutions find their 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, which path can be provisioned through environmental variables, only when required.</t>
        </section>
        <section anchor="local-apis">
          <name>Local APIs</name>
          <t>This set of solution rely on local APIs to communicate between the Host and the containerised application. Some implementations rely on UNIX Domain Sockets (SPIFFE), loopback interfaces or Magic (Link-Local) Addresses (AWS Metadata service) to provision credentials. Local APIs offer the capability to re-provision updated credentials. Communication between workload and API allows the workload to re-request a new credential (or a different one). Based on the technology it is even possible to pro-actively distribute new credentials to workloads (e.g. upon expiry, during a revocation event or a change in permissions). This group of solutions rely on network isolation for their security.</t>
          <ul spacing="normal">
            <li>
              <t>1) credentials are only issued when request, thus reducing unnecessary credential issuance and allowing for a narrowly-scoped and short-lived secrets. For instance one-time credentials or narrowly scoped ones such as JSON Web Tokens with specific audiences.</t>
            </li>
            <li>
              <t>2) the benefit of a more structured delivery comes with less portability between different APIs.</t>
            </li>
            <li>
              <t>3) additional latency may be introduced due to the request and additional operational overhead.</t>
            </li>
          </ul>
          <t>Local APIs offer the highest level of access control to protect the credential from un-legitimate access. They particularly thrive in environments of short-lived, narrowly scoped credentials, but come with operational overhead if the workload platform does not offer it already.</t>
        </section>
      </section>
      <section anchor="credential-format">
        <name>Credential format</name>
        <t>For the scope of this document we focus on JSON Web Token credential formats. Other formats such as X.509 certificates are possible but not as widely seen as JSON Web Tokens.</t>
        <t>The claims in the present assertion vary greatly based on use case and actual platform, but a minimum set of claims are seen across all of them. <xref target="RFC7523"/> describes them in detail and according to it, all MUST be present.</t>
        <sourcecode type="json"><![CDATA[
{
  "iss": "https://example.org",
  "sub": "my-workload",
  "aud": "target-audience",
  "exp": 1729248124
}
]]></sourcecode>
        <t>For the scope of this specification, the claims can be described the following. Everything from <xref target="RFC7523"/> applies.</t>
        <dl newline="true">
          <dt>iss</dt>
          <dd>
            <t>The issuer of the workload platform. While this can have any format, it is important to highlight that many authorization servers leverage OpenID Connect Discovery <xref target="OIDCDiscovery"/> and/or OAuth 2.0 Authorization Server Metadata <xref target="RFC8414"/> to retrieve JSON Web Keys <xref target="RFC7517"/> for validation purposes.</t>
          </dd>
          <dt>sub</dt>
          <dd>
            <t>Subject which identifies the workload within the domain/workload platform instance.</t>
          </dd>
          <dt>audience</dt>
          <dd>
            <t>One or many audiences the platform issued credential is eligible for. This is crucial when presenting the credential as an assertion towards the external authorization server which MUST identify itself as an audience present in the assertion.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="recommendations">
      <name>Security Recommendations</name>
      <t>All security considerations in section 8 of <xref target="RFC7521"/> apply.</t>
      <section anchor="token-typing">
        <name>Token typing</name>
        <t>Issuers SHOULD strongly type the issued tokens to workload via the JOSE <tt>typ</tt> header and authorization servers SHOULD validate the value of it according to policy. See Section 3.1 of <xref target="RFC8725"/> for details on explicit typing.</t>
        <t>Issuers SHOULD use <tt>authorization-grant+jwt</tt> as a <tt>typ</tt> value according to <xref target="I-D.ietf-oauth-rfc7523bis"/>. For broad support <tt>JWT</tt> or <tt>JOSE</tt> MAY be used by issuers and accepted by authorization servers but it's important to highlight that a wide range of tokens, meant for all sorts of purposes, use these values and would be accepted.</t>
      </section>
      <section anchor="custom-claims-are-important-for-context">
        <name>Custom claims are important for context</name>
        <t>Some platform issued credentials have custom claims that are vital for context and are required to be validated. For example in a continuous integration and deployment platform where a workload is scheduled for a GIT repository, the branch is crucial. A 'main' branch may be protected and considered trusted to federate to external authorization servers, other branches may not be and are not allowed to access protected resources.</t>
        <t>Authorization servers that validate assertions SHOULD make use of these claims. Platform issuers SHOULD allow differentiation based on the subject claim alone.</t>
      </section>
      <section anchor="token-lifetime">
        <name>Token lifetime</name>
        <t>Tokens SHOULD NOT exceed the lifetime of the workloads they represent. For example, a workload that has an expected lifetime of an hour should not receive a token valid for 2 hours or more.</t>
        <t>For the scope of this specification, where a platform issued credential is used to authenticate to retrieve an access token for an external authorization domain, a short-lived credential is recommended.</t>
      </section>
      <section anchor="workload-lifecycle-and-invalidation">
        <name>Workload lifecycle and invalidation</name>
        <t>Platform issuers SHOULD invalidate those when the workload stops, pauses or ceases to exist. How these credentials are invalidated is not in scope of this specification.</t>
      </section>
      <section anchor="proof-of-possession">
        <name>Proof of possession</name>
        <t>Credentials SHOULD be bound to workloads and proof of possession SHOULD be performed when these credentials are used. This mitigates token theft. This proof of possession applies to the platform credential and the access token of the external authorization domains.</t>
      </section>
      <section anchor="audience">
        <name>Audience</name>
        <t>For issued credentials in the form of JWTs, they MUST be audienced using the <tt>aud</tt> claim. Each JWT SHOULD only carry a single audience. We RECOMMEND using URIs to specify audiences. See section 3 of <xref target="RFC8707"/> for more details and security implications.</t>
        <t>Some workload platforms provide credentials for interacting with their own APIs (e.g., Kubernetes). These credentials MUST NOT be used beyond the platform API. In the example of Kubernetes: A token used for anything else than the Kubernetes API itself MUST NOT carry the Kubernetes server in the <tt>aud</tt> claim.</t>
      </section>
    </section>
    <section anchor="other-considerations">
      <name>Other considerations</name>
      <section anchor="relation-to-openid-connect-and-its-id-token">
        <name>Relation to OpenID Connect and its ID Token</name>
        <t>The outlined pattern has been referred to as "OIDC" and respectively, the Workload Identity Token as "OIDC ID Token" defined in <xref target="OIDC"/>. The authors of this document want to highlight that this pattern is not related to OpenID Connect <xref target="OIDC"/> and the issued Workload Identity Tokens by the platforms are not "ID Tokens" in the sense of OIDC.</t>
        <t>However, it is common practice for the authorization server to leverage <xref target="OIDCDiscovery"/> to retrieve the signing keys needed for token validation. The use of <xref target="RFC8414"/> or any other key distribution remain valid.</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>Add your name here.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC7521">
          <front>
            <title>Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="Y. Goland" initials="Y." surname="Goland"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification provides a framework for the use of assertions with OAuth 2.0 in the form of a new client authentication mechanism and a new authorization grant type. Mechanisms are specified for transporting assertions during interactions with a token endpoint; general processing rules are also specified.</t>
              <t>The intent of this specification is to provide a common framework for OAuth 2.0 to interwork with other identity systems using assertions and to provide alternative client authentication mechanisms.</t>
              <t>Note that this specification only defines abstract message flows and processing rules. In order to be implementable, companion specifications are necessary to provide the corresponding concrete instantiations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7521"/>
          <seriesInfo name="DOI" value="10.17487/RFC7521"/>
        </reference>
        <reference anchor="RFC7523">
          <front>
            <title>JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification defines the use of a JSON Web Token (JWT) Bearer Token as a means for requesting an OAuth 2.0 access token as well as for client authentication.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7523"/>
          <seriesInfo name="DOI" value="10.17487/RFC7523"/>
        </reference>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8414">
          <front>
            <title>OAuth 2.0 Authorization Server Metadata</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client can use to obtain the information needed to interact with an OAuth 2.0 authorization server, including its endpoint locations and authorization server capabilities.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8414"/>
          <seriesInfo name="DOI" value="10.17487/RFC8414"/>
        </reference>
        <reference anchor="RFC7519">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </reference>
        <reference anchor="RFC7517">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </reference>
        <reference anchor="RFC8707">
          <front>
            <title>Resource Indicators for OAuth 2.0</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document specifies an extension to the OAuth 2.0 Authorization Framework defining request parameters that enable a client to explicitly signal to an authorization server about the identity of the protected resource(s) to which it is requesting access.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8707"/>
          <seriesInfo name="DOI" value="10.17487/RFC8707"/>
        </reference>
        <reference anchor="RFC8725">
          <front>
            <title>JSON Web Token Best Current Practices</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>JSON Web Tokens, also known as JWTs, are URL-safe JSON-based security tokens that contain a set of claims that can be signed and/or encrypted. JWTs are being widely used and deployed as a simple security token format in numerous protocols and applications, both in the area of digital identity and in other application areas. This Best Current Practices document updates RFC 7519 to provide actionable guidance leading to secure implementation and deployment of JWTs.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="225"/>
          <seriesInfo name="RFC" value="8725"/>
          <seriesInfo name="DOI" value="10.17487/RFC8725"/>
        </reference>
        <reference anchor="RFC8693">
          <front>
            <title>OAuth 2.0 Token Exchange</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="A. Nadalin" initials="A." surname="Nadalin"/>
            <author fullname="B. Campbell" initials="B." role="editor" surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="January" year="2020"/>
            <abstract>
              <t>This specification defines a protocol for an HTTP- and JSON-based Security Token Service (STS) by defining how to request and obtain security tokens from OAuth 2.0 authorization servers, including security tokens employing impersonation and delegation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8693"/>
          <seriesInfo name="DOI" value="10.17487/RFC8693"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-oauth-rfc7523bis">
          <front>
            <title>JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and 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>
            <date day="21" month="February" year="2025"/>
            <abstract>
              <t>   This specification defines the use of a JSON Web Token (JWT) Bearer
   Token as a means for requesting an OAuth 2.0 access token as well as
   for client authentication.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-rfc7523bis-00"/>
        </reference>
        <reference anchor="I-D.ietf-wimse-arch">
          <front>
            <title>Workload Identity in a Multi System Environment (WIMSE) Architecture</title>
            <author fullname="Joseph A. Salowey" initials="J. A." surname="Salowey">
              <organization>Venafi</organization>
            </author>
            <author fullname="Yaroslav Rosomakho" initials="Y." surname="Rosomakho">
              <organization>Zscaler</organization>
            </author>
            <author fullname="Hannes Tschofenig" initials="H." surname="Tschofenig">
              <organization>University of Applied Sciences Bonn-Rhein-Sieg</organization>
            </author>
            <date day="2" month="March" year="2025"/>
            <abstract>
              <t>   The increasing prevalence of cloud computing and micro service
   architectures has led to the rise of complex software functions being
   built and deployed as workloads, where a workload is defined as a
   running instance of software executing for a specific purpose.  This
   document discusses an architecture for designing and standardizing
   protocols and payloads for conveying workload identity and security
   context information.

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-s2s-protocol-02"/>
        </reference>
        <reference anchor="OIDC" target="https://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>OpenID Connect Core 1.0 incorporating errata set 1</title>
            <author>
              <organization>Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and C. Mortimore</organization>
            </author>
            <date year="2014" month="November"/>
          </front>
        </reference>
        <reference anchor="OIDCDiscovery" target="https://openid.net/specs/openid-connect-discovery-1_0.html">
          <front>
            <title>OpenID Connect Discovery 1.0 incorporating errata set 2</title>
            <author>
              <organization>Sakimura, N., Bradley, J., Jones, M. and Jay, E.</organization>
            </author>
            <date year="2023" month="December"/>
          </front>
        </reference>
        <reference anchor="KubernetesServiceAccount" target="https://kubernetes.io/docs/concepts/security/service-accounts/">
          <front>
            <title>Kubernetes Service Account</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="May"/>
          </front>
        </reference>
        <reference anchor="TokenReviewV1" target="https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-review-v1/">
          <front>
            <title>Kubernetes Token Review API V1</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="August"/>
          </front>
        </reference>
        <reference anchor="TokenRequestV1" target="https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-request-v1/">
          <front>
            <title>Kubernetes Token Request API V1</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="August"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 292?>

<section anchor="patterns">
      <name>Patterns</name>
      <section anchor="kubernetes">
        <name>Kubernetes</name>
        <t>In Kubernetes, the primary concept of machine identity is implemented through "service accounts" <xref target="KubernetesServiceAccount"/>. These accounts can be explicitly created or a default one is automatically assigned. Service accounts utilize JSON Web Tokens (JWTs) <xref target="RFC7519"/> as their credential format, with these tokens being cryptographically signed by the Kubernetes Control Plane.</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 (which is particularly relevant to the scope of this document).</t>
        <t>To programatically use service accounts, workloads can:</t>
        <ul spacing="normal">
          <li>
            <t>use the Token Request API <xref target="TokenReviewV1"/> of the control plane</t>
          </li>
          <li>
            <t>have the token projected into the file system of the workload. This is commonly referred to as "projected service accout token".</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, when a Kubernetes Deployment is removed from the server. It is important to highlight, that invalidation is only in effect if the Token Review API <xref target="TokenReviewV1"/> of Kubernetes is used to validate the token.</t>
          </li>
        </ul>
        <t>To validate service account tokens, Kubernetes offers workloads to:</t>
        <ul spacing="normal">
          <li>
            <t>make us 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 decentrally validate the tokens signature.</t>
          </li>
          <li>
            <t>Optionally, a JSON Web Key Set <xref target="RFC7517"/> is exposed via a webserver. This allows the Service Account Token to be validated outside of the cluster and without line of sight towards the actual Kubernetes Control Plane API.</t>
          </li>
        </ul>
        <figure anchor="fig-kubernetes">
          <name>OAuth2 Assertion Flow in a Kubernetes Workload Environment</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="592" width="464" viewBox="0 0 464 592" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,176" fill="none" stroke="black"/>
                <path d="M 8,272 L 8,576" fill="none" stroke="black"/>
                <path d="M 24,80 L 24,144" fill="none" stroke="black"/>
                <path d="M 40,480 L 40,544" fill="none" stroke="black"/>
                <path d="M 48,320 L 48,384" fill="none" stroke="black"/>
                <path d="M 80,144 L 80,192" fill="none" stroke="black"/>
                <path d="M 80,224 L 80,320" fill="none" stroke="black"/>
                <path d="M 88,384 L 88,416" fill="none" stroke="black"/>
                <path d="M 88,448 L 88,480" fill="none" stroke="black"/>
                <path d="M 192,144 L 192,224" fill="none" stroke="black"/>
                <path d="M 192,256 L 192,320" fill="none" stroke="black"/>
                <path d="M 224,384 L 224,416" fill="none" stroke="black"/>
                <path d="M 224,464 L 224,480" fill="none" stroke="black"/>
                <path d="M 240,80 L 240,144" fill="none" stroke="black"/>
                <path d="M 240,288 L 240,320" fill="none" stroke="black"/>
                <path d="M 256,80 L 256,144" fill="none" stroke="black"/>
                <path d="M 280,320 L 280,384" fill="none" stroke="black"/>
                <path d="M 344,144 L 344,192" fill="none" stroke="black"/>
                <path d="M 344,224 L 344,288" fill="none" stroke="black"/>
                <path d="M 384,480 L 384,544" fill="none" stroke="black"/>
                <path d="M 424,80 L 424,144" fill="none" stroke="black"/>
                <path d="M 456,32 L 456,176" fill="none" stroke="black"/>
                <path d="M 456,272 L 456,576" fill="none" stroke="black"/>
                <path d="M 8,32 L 456,32" fill="none" stroke="black"/>
                <path d="M 24,80 L 240,80" fill="none" stroke="black"/>
                <path d="M 256,80 L 424,80" fill="none" stroke="black"/>
                <path d="M 24,144 L 72,144" fill="none" stroke="black"/>
                <path d="M 88,144 L 240,144" fill="none" stroke="black"/>
                <path d="M 256,144 L 336,144" fill="none" stroke="black"/>
                <path d="M 352,144 L 424,144" fill="none" stroke="black"/>
                <path d="M 8,176 L 456,176" fill="none" stroke="black"/>
                <path d="M 8,272 L 456,272" fill="none" stroke="black"/>
                <path d="M 240,288 L 344,288" fill="none" stroke="black"/>
                <path d="M 48,320 L 184,320" fill="none" stroke="black"/>
                <path d="M 200,320 L 280,320" fill="none" stroke="black"/>
                <path d="M 48,384 L 80,384" fill="none" stroke="black"/>
                <path d="M 96,384 L 216,384" fill="none" stroke="black"/>
                <path d="M 232,384 L 280,384" fill="none" stroke="black"/>
                <path d="M 40,480 L 384,480" fill="none" stroke="black"/>
                <path d="M 40,544 L 384,544" fill="none" stroke="black"/>
                <path d="M 8,576 L 456,576" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="352,144 340,138.4 340,149.6" fill="black" transform="rotate(270,344,144)"/>
                <polygon class="arrowhead" points="232,384 220,378.4 220,389.6" fill="black" transform="rotate(270,224,384)"/>
                <polygon class="arrowhead" points="200,320 188,314.4 188,325.6" fill="black" transform="rotate(90,192,320)"/>
                <polygon class="arrowhead" points="96,384 84,378.4 84,389.6" fill="black" transform="rotate(270,88,384)"/>
                <polygon class="arrowhead" points="88,144 76,138.4 76,149.6" fill="black" transform="rotate(270,80,144)"/>
                <g class="text">
                  <text x="244" y="52">External</text>
                  <text x="336" y="52">Authorization</text>
                  <text x="420" y="52">Domain</text>
                  <text x="104" y="116">Authorization</text>
                  <text x="188" y="116">Server</text>
                  <text x="304" y="116">Protected</text>
                  <text x="380" y="116">Resource</text>
                  <text x="12" y="212">3)</text>
                  <text x="56" y="212">present</text>
                  <text x="128" y="212">assertion</text>
                  <text x="316" y="212">5)</text>
                  <text x="356" y="212">access</text>
                  <text x="148" y="244">4)</text>
                  <text x="188" y="244">access</text>
                  <text x="240" y="244">token</text>
                  <text x="404" y="292">Kubernetes</text>
                  <text x="416" y="308">Cluster</text>
                  <text x="116" y="356">Workload</text>
                  <text x="52" y="436">1)</text>
                  <text x="100" y="436">schedule</text>
                  <text x="180" y="436">2)</text>
                  <text x="232" y="436">projected</text>
                  <text x="304" y="436">service</text>
                  <text x="224" y="452">account</text>
                  <text x="280" y="452">token</text>
                  <text x="124" y="516">Kubernetes</text>
                  <text x="200" y="516">Control</text>
                  <text x="256" y="516">Plane</text>
                  <text x="288" y="516">/</text>
                  <text x="328" y="516">kubelet</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-------------------------------------------------------+
|                         External Authorization Domain |
|                                                       |
| +--------------------------+ +--------------------+   |
| |                          | |                    |   |
| |   Authorization Server   | | Protected Resource |   |
| |                          | |                    |   |
| +------^-------------+-----+ +----------^---------+   |
|        |             |                  |             |
+--------+-------------+------------------+-------------+
         |             |                  |
3) present assertion   |              5) access
         |             |                  |
         |       4) access token          |
         |             |                  |
+--------+-------------+------------------+-------------+
|        |             |     +------------+  Kubernetes |
|        |             |     |                  Cluster |
|    +---+-------------v-----+----+                     |
|    |                            |                     |
|    |    Workload                |                     |
|    |                            |                     |
|    +----^----------------^------+                     |
|         |                |                            |
|         |                |                            |
|    1) schedule     2) projected service               |
|         |             account token                   |
|         |                |                            |
|   +-----+----------------+-------------------+        |
|   |                                          |        |
|   |     Kubernetes Control Plane / kubelet   |        |
|   |                                          |        |
|   +------------------------------------------+        |
|                                                       |
+-------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-kubernetes"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The Kubernetes Control Plane schedules the workload. This is much simplified and technically happens asynchronously.</t>
          </li>
          <li>
            <t>2) The Kubernetes Control Plane projects the service account token into the workload. This step is also much simplified and technically happens alongside the scheduling with step 1.</t>
          </li>
          <li>
            <t>3) Workloads present the projected service account token as a client assertion towards an external authorization server according to <xref target="RFC7523"/>.</t>
          </li>
          <li>
            <t>4) On success, an access token is returned to the workload to access the protected resource.</t>
          </li>
          <li>
            <t>5) The access token is used to access the protected resource in the external authorization domain.</t>
          </li>
        </ul>
        <t>As an example, the following JSON showcases the claims a Kubernetes Service Account token carries.</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>Secure Production Identity Framework For Everyone, also known as SPIFFE, is a cloud native compute foundation (CNCF) adopted project which defines an API defined called "Workload API" to delivery machine identity to workloads. Workloads can retrieve either X509 based or JWT credentials without the need to authenticate making it very easy to use. How workloads authenticate on the API is not part of the specification. It is common to use platform metadata from the operating system and the workload platform for authentication on the Workload API.</t>
        <t>For the scope of this document, the JWT formatted credential is the most relevant one. SPIFFE referres to it as "JWT-SVID" (JWT - SPIFFE Verifiable Identity Document).</t>
        <t>Workloads are required to specify at least one audience when requesting a JWT-SVID from the Workload API.</t>
        <t>To allow validation, SPIFFE offers</t>
        <ul spacing="normal">
          <li>
            <t>to download a set JWK encoded public keys that can be used to validate JWT signatures. In SPIFFE this is referred to as the "JWT trust bundle".</t>
          </li>
          <li>
            <t>invoke a validation method on the Workload API to validate JWT-SVIDs</t>
          </li>
        </ul>
        <t>Additionally, many SPIFFE deployments choose to separately publish the signing keys as a JSON Web Key Set on a web server to allow validation where the Workload API is not available.</t>
        <t>The following figure illustrates how a workload can use its JWT-SVID to access a protected resource outside of SPIFFE.</t>
        <figure anchor="fig-spiffe">
          <name>OAuth2 Assertion Flow in a SPIFFE Environment</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="480" width="480" viewBox="0 0 480 480" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,144" fill="none" stroke="black"/>
                <path d="M 8,240 L 8,464" fill="none" stroke="black"/>
                <path d="M 32,256 L 32,320" fill="none" stroke="black"/>
                <path d="M 32,384 L 32,448" fill="none" stroke="black"/>
                <path d="M 40,64 L 40,128" fill="none" stroke="black"/>
                <path d="M 88,128 L 88,160" fill="none" stroke="black"/>
                <path d="M 88,192 L 88,256" fill="none" stroke="black"/>
                <path d="M 192,144 L 192,192" fill="none" stroke="black"/>
                <path d="M 192,224 L 192,256" fill="none" stroke="black"/>
                <path d="M 208,320 L 208,336" fill="none" stroke="black"/>
                <path d="M 208,368 L 208,384" fill="none" stroke="black"/>
                <path d="M 232,64 L 232,128" fill="none" stroke="black"/>
                <path d="M 264,64 L 264,128" fill="none" stroke="black"/>
                <path d="M 336,128 L 336,160" fill="none" stroke="black"/>
                <path d="M 336,192 L 336,256" fill="none" stroke="black"/>
                <path d="M 376,256 L 376,320" fill="none" stroke="black"/>
                <path d="M 376,384 L 376,448" fill="none" stroke="black"/>
                <path d="M 448,64 L 448,128" fill="none" stroke="black"/>
                <path d="M 472,32 L 472,144" fill="none" stroke="black"/>
                <path d="M 472,240 L 472,464" fill="none" stroke="black"/>
                <path d="M 8,32 L 472,32" fill="none" stroke="black"/>
                <path d="M 40,64 L 232,64" fill="none" stroke="black"/>
                <path d="M 264,64 L 448,64" fill="none" stroke="black"/>
                <path d="M 40,128 L 80,128" fill="none" stroke="black"/>
                <path d="M 96,128 L 232,128" fill="none" stroke="black"/>
                <path d="M 264,128 L 328,128" fill="none" stroke="black"/>
                <path d="M 344,128 L 448,128" fill="none" stroke="black"/>
                <path d="M 8,144 L 472,144" fill="none" stroke="black"/>
                <path d="M 8,240 L 472,240" fill="none" stroke="black"/>
                <path d="M 32,256 L 184,256" fill="none" stroke="black"/>
                <path d="M 200,256 L 376,256" fill="none" stroke="black"/>
                <path d="M 32,320 L 376,320" fill="none" stroke="black"/>
                <path d="M 32,384 L 200,384" fill="none" stroke="black"/>
                <path d="M 216,384 L 376,384" fill="none" stroke="black"/>
                <path d="M 32,448 L 376,448" fill="none" stroke="black"/>
                <path d="M 8,464 L 472,464" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="344,128 332,122.4 332,133.6" fill="black" transform="rotate(270,336,128)"/>
                <polygon class="arrowhead" points="216,384 204,378.4 204,389.6" fill="black" transform="rotate(90,208,384)"/>
                <polygon class="arrowhead" points="200,256 188,250.4 188,261.6" fill="black" transform="rotate(90,192,256)"/>
                <polygon class="arrowhead" points="96,128 84,122.4 84,133.6" fill="black" transform="rotate(270,88,128)"/>
                <g class="text">
                  <text x="260" y="52">External</text>
                  <text x="352" y="52">Authorization</text>
                  <text x="436" y="52">Domain</text>
                  <text x="104" y="100">Authorization</text>
                  <text x="188" y="100">Server</text>
                  <text x="320" y="100">Protected</text>
                  <text x="396" y="100">Resource</text>
                  <text x="20" y="180">2)</text>
                  <text x="64" y="180">present</text>
                  <text x="136" y="180">assertion</text>
                  <text x="308" y="180">4)</text>
                  <text x="348" y="180">access</text>
                  <text x="156" y="212">3)</text>
                  <text x="196" y="212">access</text>
                  <text x="248" y="212">token</text>
                  <text x="428" y="260">Workload</text>
                  <text x="428" y="276">Platform</text>
                  <text x="212" y="292">Workload</text>
                  <text x="156" y="356">1)</text>
                  <text x="184" y="356">get</text>
                  <text x="236" y="356">JWT-SVID</text>
                  <text x="148" y="420">SPIFFE</text>
                  <text x="212" y="420">Workload</text>
                  <text x="264" y="420">API</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+---------------------------------------------------------+
|                           External Authorization Domain |
|   +-----------------------+   +----------------------+  |
|   |                       |   |                      |  |
|   | Authorization Server  |   |  Protected Resource  |  |
|   |                       |   |                      |  |
|   +-----^-----------------+   +--------^-------------+  |
+---------+------------+-----------------+----------------+
          |            |                 |
 2) present assertion  |             4) access
          |            |                 |
          |       3) access token        |
          |            |                 |
+---------+------------+-----------------+----------------+
|  +------+------------v-----------------+----+  Workload |
|  |                                          |  Platform |
|  |                  Workload                |           |
|  |                                          |           |
|  +---------------------+--------------------+           |
|                        |                                |
|                 1) get JWT-SVID                         |
|                        |                                |
|  +---------------------v--------------------+           |
|  |                                          |           |
|  |           SPIFFE Workload API            |           |
|  |                                          |           |
|  +------------------------------------------+           |
+---------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-spiffe"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The workload request a JWT-SVID from the SPIFFE Workload API with an audience that identifies the external authorization server.</t>
          </li>
          <li>
            <t>2) The workload presents the JWT-SVID as a client assertion in the assertion flow based on <xref target="RFC7523"/>.</t>
          </li>
          <li>
            <t>3) On success, an access token is returned to the workload to access the protected resource.</t>
          </li>
          <li>
            <t>4) The access token is used to access the protected resource in the external authorization domain.</t>
          </li>
        </ul>
        <t>The claims of a JWT-SVID for example look like this:</t>
        <sourcecode type="json"><![CDATA[
{
  "aud": [
    "external-authorization-server"
  ],
  "exp": 1729087175,
  "iat": 1729086875,
  "sub": "spiffe://example.org/myservice"
}
]]></sourcecode>
        <t>TODO: write about "iss" in JWT-SVID.</t>
      </section>
      <section anchor="cloudproviders">
        <name>Cloud Providers</name>
        <t>Workload in cloud platforms can have any shape or form. Historically, virtual machines were the most common, with the introduction of containerization, hosted container environment or Kubernetes clusters were introduced, and lately, <tt>serverless</tt> functions are offered. Regardless of the actual workload packaging, distribution and runtime platform, all are in need of identity.</t>
        <t>To create a common identity interface across cloud services and offerings, the pattern of an <tt>Instance Metadata Endpoint</tt> has been established by the biggest cloud providers. Next to the option for workloads to get 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 allows 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 easy and <tt>credential less</tt>. While the term is technically misleading, from a user perspective, no credential needs to be issued, provisioned, rotated or revoked, as everything is handled internally by the platform.</t>
        <t>Resources outside of the platform, for example resources or workloads in other clouds, generic web servers or on-premise resources, are most of the time, however, protected by different domains and authorization servers and deny the platform issued credential. In this scenario, the pattern of using the platform issued credential as an assertion in the context of <xref target="RFC7521"/>, for JWT particularly <xref target="RFC7523"/> towards the authorization server that protected the resource to get an access token.</t>
        <figure anchor="fig-cloud">
          <name>OAuth2 Assertion Flow in a cloud environment</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="544" width="496" viewBox="0 0 496 544" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 32,32 L 32,176" fill="none" stroke="black"/>
                <path d="M 32,272 L 32,528" fill="none" stroke="black"/>
                <path d="M 48,80 L 48,144" fill="none" stroke="black"/>
                <path d="M 64,320 L 64,384" fill="none" stroke="black"/>
                <path d="M 64,448 L 64,512" fill="none" stroke="black"/>
                <path d="M 104,144 L 104,192" fill="none" stroke="black"/>
                <path d="M 104,224 L 104,320" fill="none" stroke="black"/>
                <path d="M 160,384 L 160,400" fill="none" stroke="black"/>
                <path d="M 160,432 L 160,448" fill="none" stroke="black"/>
                <path d="M 208,144 L 208,224" fill="none" stroke="black"/>
                <path d="M 208,256 L 208,320" fill="none" stroke="black"/>
                <path d="M 240,256 L 240,320" fill="none" stroke="black"/>
                <path d="M 248,80 L 248,144" fill="none" stroke="black"/>
                <path d="M 264,320 L 264,384" fill="none" stroke="black"/>
                <path d="M 264,448 L 264,512" fill="none" stroke="black"/>
                <path d="M 272,80 L 272,144" fill="none" stroke="black"/>
                <path d="M 360,144 L 360,192" fill="none" stroke="black"/>
                <path d="M 360,224 L 360,256" fill="none" stroke="black"/>
                <path d="M 384,320 L 384,336" fill="none" stroke="black"/>
                <path d="M 384,368 L 384,464" fill="none" stroke="black"/>
                <path d="M 448,80 L 448,144" fill="none" stroke="black"/>
                <path d="M 464,32 L 464,176" fill="none" stroke="black"/>
                <path d="M 472,320 L 472,464" fill="none" stroke="black"/>
                <path d="M 488,272 L 488,528" fill="none" stroke="black"/>
                <path d="M 32,32 L 464,32" fill="none" stroke="black"/>
                <path d="M 48,80 L 248,80" fill="none" stroke="black"/>
                <path d="M 272,80 L 448,80" fill="none" stroke="black"/>
                <path d="M 48,144 L 96,144" fill="none" stroke="black"/>
                <path d="M 112,144 L 248,144" fill="none" stroke="black"/>
                <path d="M 272,144 L 352,144" fill="none" stroke="black"/>
                <path d="M 368,144 L 448,144" fill="none" stroke="black"/>
                <path d="M 32,176 L 464,176" fill="none" stroke="black"/>
                <path d="M 240,256 L 360,256" fill="none" stroke="black"/>
                <path d="M 32,272 L 488,272" fill="none" stroke="black"/>
                <path d="M 64,320 L 200,320" fill="none" stroke="black"/>
                <path d="M 216,320 L 264,320" fill="none" stroke="black"/>
                <path d="M 384,320 L 472,320" fill="none" stroke="black"/>
                <path d="M 264,352 L 384,352" fill="none" stroke="black"/>
                <path d="M 64,384 L 264,384" fill="none" stroke="black"/>
                <path d="M 64,448 L 152,448" fill="none" stroke="black"/>
                <path d="M 168,448 L 264,448" fill="none" stroke="black"/>
                <path d="M 384,464 L 472,464" fill="none" stroke="black"/>
                <path d="M 64,512 L 264,512" fill="none" stroke="black"/>
                <path d="M 32,528 L 488,528" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="392,352 380,346.4 380,357.6" fill="black" transform="rotate(0,384,352)"/>
                <polygon class="arrowhead" points="368,144 356,138.4 356,149.6" fill="black" transform="rotate(270,360,144)"/>
                <polygon class="arrowhead" points="216,320 204,314.4 204,325.6" fill="black" transform="rotate(90,208,320)"/>
                <polygon class="arrowhead" points="168,448 156,442.4 156,453.6" fill="black" transform="rotate(90,160,448)"/>
                <polygon class="arrowhead" points="112,144 100,138.4 100,149.6" fill="black" transform="rotate(270,104,144)"/>
                <g class="text">
                  <text x="252" y="52">External</text>
                  <text x="344" y="52">Authorization</text>
                  <text x="428" y="52">Domain</text>
                  <text x="112" y="116">Authorization</text>
                  <text x="196" y="116">Server</text>
                  <text x="320" y="116">Protected</text>
                  <text x="396" y="116">Resource</text>
                  <text x="16" y="212">B1)</text>
                  <text x="64" y="212">present</text>
                  <text x="108" y="212">as</text>
                  <text x="160" y="212">assertion</text>
                  <text x="336" y="212">B3)</text>
                  <text x="380" y="212">access</text>
                  <text x="176" y="244">B2)</text>
                  <text x="220" y="244">access</text>
                  <text x="272" y="244">token</text>
                  <text x="456" y="292">Cloud</text>
                  <text x="284" y="324">1)</text>
                  <text x="312" y="324">get</text>
                  <text x="332" y="340">identity</text>
                  <text x="164" y="356">Workload</text>
                  <text x="428" y="356">Instance</text>
                  <text x="428" y="388">Metadata</text>
                  <text x="136" y="420">A1)</text>
                  <text x="180" y="420">access</text>
                  <text x="428" y="420">Service/</text>
                  <text x="428" y="436">Endpoint</text>
                  <text x="128" y="484">Protected</text>
                  <text x="204" y="484">Resource</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
   +-----------------------------------------------------+
   |                       External Authorization Domain |
   |                                                     |
   | +------------------------+  +---------------------+ |
   | |                        |  |                     | |
   | | Authorization Server   |  | Protected Resource  | |
   | |                        |  |                     | |
   | +------^------------+----+  +----------^----------+ |
   |        |            |                  |            |
   +--------+------------+------------------+------------+
            |            |                  |
B1) present as assertion |              B3) access
            |            |                  |
            |       B2) access token        |
            |            |   +--------------+
   +--------+------------+---+------------------------------+
   |        |            |   |                        Cloud |
   |        |            |   |                              |
   |   +----+------------v---+--+ 1) get       +----------+ |
   |   |                        |    identity  |          | |
   |   |        Workload        +--------------> Instance | |
   |   |                        |              |          | |
   |   +-----------+------------+              | Metadata | |
   |               |                           |          | |
   |           A1) access                      | Service/ | |
   |               |                           | Endpoint | |
   |   +-----------v------------+              |          | |
   |   |                        |              +----------+ |
   |   |   Protected Resource   |                           |
   |   |                        |                           |
   |   +------------------------+                           |
   +--------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-cloud"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The workload retrieves identity from the Instance Metadata Endpoint.</t>
          </li>
        </ul>
        <t>In case the workload needs to access a resource within the cloud (protected by the same authorization server that issued the workload identity)</t>
        <ul spacing="normal">
          <li>
            <t>A1) The workload directly access the protected resource with the credential issued in step 1.</t>
          </li>
        </ul>
        <t>In case the workload needs to access a resource outside of the cloud (protected by a different authorization server). This can also be the same cloud but different context (tenant, account).</t>
        <ul spacing="normal">
          <li>
            <t>B1) The workload presents cloud-issued credential as an assertion towards the external authorization server using <xref target="RFC7523"/>.</t>
          </li>
          <li>
            <t>B2) On success, an access token is returned to the workload to access the protected resource.</t>
          </li>
          <li>
            <t>B3) Using the access token, the workload is able to access the protected resource in the external authorization domain.</t>
          </li>
        </ul>
      </section>
      <section anchor="cicd">
        <name>Continuoues integration/deployment systems</name>
        <t>Continuous integration and deployment systems allow their pipelines/workflows to receive identity every time they run. Particularly in situations where build outputs need to be uploaded to resources protected by other authorization server, deployments need to be made, or more generally, protected resources to be accessed, <xref target="RFC7523"/> is used to federate the pipeline/workflow identity to an identity of the other authorization server.</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="464" width="488" viewBox="0 0 488 464" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,160" fill="none" stroke="black"/>
                <path d="M 8,256 L 8,320" fill="none" stroke="black"/>
                <path d="M 8,384 L 8,448" fill="none" stroke="black"/>
                <path d="M 24,64 L 24,128" fill="none" stroke="black"/>
                <path d="M 80,320 L 80,336" fill="none" stroke="black"/>
                <path d="M 80,368 L 80,384" fill="none" stroke="black"/>
                <path d="M 88,128 L 88,176" fill="none" stroke="black"/>
                <path d="M 88,208 L 88,256" fill="none" stroke="black"/>
                <path d="M 200,128 L 200,208" fill="none" stroke="black"/>
                <path d="M 200,240 L 200,256" fill="none" stroke="black"/>
                <path d="M 240,64 L 240,128" fill="none" stroke="black"/>
                <path d="M 288,64 L 288,128" fill="none" stroke="black"/>
                <path d="M 304,320 L 304,336" fill="none" stroke="black"/>
                <path d="M 304,368 L 304,384" fill="none" stroke="black"/>
                <path d="M 392,128 L 392,176" fill="none" stroke="black"/>
                <path d="M 392,208 L 392,256" fill="none" stroke="black"/>
                <path d="M 464,64 L 464,128" fill="none" stroke="black"/>
                <path d="M 480,32 L 480,160" fill="none" stroke="black"/>
                <path d="M 480,256 L 480,320" fill="none" stroke="black"/>
                <path d="M 480,384 L 480,448" fill="none" stroke="black"/>
                <path d="M 8,32 L 480,32" fill="none" stroke="black"/>
                <path d="M 24,64 L 240,64" fill="none" stroke="black"/>
                <path d="M 288,64 L 464,64" fill="none" stroke="black"/>
                <path d="M 24,128 L 80,128" fill="none" stroke="black"/>
                <path d="M 96,128 L 240,128" fill="none" stroke="black"/>
                <path d="M 288,128 L 384,128" fill="none" stroke="black"/>
                <path d="M 400,128 L 464,128" fill="none" stroke="black"/>
                <path d="M 8,160 L 480,160" fill="none" stroke="black"/>
                <path d="M 8,256 L 192,256" fill="none" stroke="black"/>
                <path d="M 208,256 L 480,256" fill="none" stroke="black"/>
                <path d="M 8,320 L 72,320" fill="none" stroke="black"/>
                <path d="M 88,320 L 296,320" fill="none" stroke="black"/>
                <path d="M 312,320 L 480,320" fill="none" stroke="black"/>
                <path d="M 8,384 L 296,384" fill="none" stroke="black"/>
                <path d="M 312,384 L 480,384" fill="none" stroke="black"/>
                <path d="M 8,448 L 480,448" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="400,128 388,122.4 388,133.6" fill="black" transform="rotate(270,392,128)"/>
                <polygon class="arrowhead" points="312,384 300,378.4 300,389.6" fill="black" transform="rotate(90,304,384)"/>
                <polygon class="arrowhead" points="312,320 300,314.4 300,325.6" fill="black" transform="rotate(270,304,320)"/>
                <polygon class="arrowhead" points="208,256 196,250.4 196,261.6" fill="black" transform="rotate(90,200,256)"/>
                <polygon class="arrowhead" points="96,128 84,122.4 84,133.6" fill="black" transform="rotate(270,88,128)"/>
                <polygon class="arrowhead" points="88,320 76,314.4 76,325.6" fill="black" transform="rotate(270,80,320)"/>
                <g class="text">
                  <text x="268" y="52">External</text>
                  <text x="360" y="52">Authorization</text>
                  <text x="444" y="52">Domain</text>
                  <text x="104" y="100">Authorization</text>
                  <text x="188" y="100">Server</text>
                  <text x="344" y="100">Protected</text>
                  <text x="420" y="100">Resource</text>
                  <text x="12" y="196">3)</text>
                  <text x="56" y="196">present</text>
                  <text x="128" y="196">assertion</text>
                  <text x="356" y="196">4)</text>
                  <text x="396" y="196">access</text>
                  <text x="148" y="228">4)</text>
                  <text x="188" y="228">access</text>
                  <text x="240" y="228">token</text>
                  <text x="188" y="292">Task</text>
                  <text x="252" y="292">(Workload)</text>
                  <text x="36" y="356">1)</text>
                  <text x="88" y="356">schedules</text>
                  <text x="244" y="356">2)</text>
                  <text x="292" y="356">retrieve</text>
                  <text x="364" y="356">identity</text>
                  <text x="108" y="420">Continuous</text>
                  <text x="200" y="420">Integration</text>
                  <text x="256" y="420">/</text>
                  <text x="308" y="420">Deployment</text>
                  <text x="388" y="420">Platform</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+----------------------------------------------------------+
|                            External Authorization Domain |
| +--------------------------+     +---------------------+ |
| |                          |     |                     | |
| |   Authorization Server   |     |  Protected Resource | |
| |                          |     |                     | |
| +-------^-------------+----+     +------------^--------+ |
|         |             |                       |          |
+---------+-------------+-----------------------+----------+
          |             |                       |
3) present assertion    |                  4) access
          |             |                       |
          |      4) access token                |
          |             |                       |
+---------+-------------v-----------------------+----------+
|                                                          |
|                    Task (Workload)                       |
|                                                          |
+--------^---------------------------^---------------------+
         |                           |
   1) schedules              2) retrieve identity
         |                           |
+--------+---------------------------v---------------------+
|                                                          |
|       Continuous Integration / Deployment Platform       |
|                                                          |
+----------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-cicd"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The continuous integration / deployment platform (CI-CD platform) schedules a task (considered a workload) to be performed.</t>
          </li>
          <li>
            <t>2) The workload is able to retrieve identity from the CI-CD platform. This can differ based on the platform and potentially is already supplied during scheduling phase in step 1.</t>
          </li>
          <li>
            <t>3) The workload presents the CI-CD issued credential as an assertion towards the authorization server in the external authorization domain based on <xref target="RFC7521"/>. In case of JWT also <xref target="RFC7523"/>.</t>
          </li>
          <li>
            <t>4) On success, an access token is returned to the workload to access the protected resource.</t>
          </li>
          <li>
            <t>5) Using the access token, the workload is able to access the protected resource in the external authorization domain.</t>
          </li>
        </ul>
        <t>Tokens of different providers look different, but all of them contain claims carrying the basic context of the executed tasks such as source code management data (e.g. git branch), initiation and more.</t>
      </section>
    </section>
    <section anchor="variations">
      <name>Variations</name>
      <section anchor="direct-access-to-protected-resources">
        <name>Direct access to protected resources</name>
        <t>Resource servers that protect resources may choose to trust multiple authorization servers, including the one that issues the platform identities. Instead of using the platform issued identity to receive an access token of a different authorization domain, workloads can directly use the platform issued identity to access a protected resource.</t>
        <t>In this case, technically, the protected resource and workload are part of the same authorization domain.</t>
      </section>
      <section anchor="custom-assertion-flows">
        <name>Custom assertion flows</name>
        <t>While <xref target="RFC7521"/> and <xref target="RFC7523"/> are the proposed standards for this pattern, some authorization servers use <xref target="RFC8693"/> or a custom API for the issuance of an access token based on an existing platform identity credentials. These pattern 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>-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>
  </back>
  <!-- ##markdown-source:
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
2ETmBJPi0AoQK1vbHSFVD90G4L+rIFUPO6ouuM8/PMDW3nSQSZw0HSFcAltO
tFLkqQfwD8AsgIg30pDfkIEkVKZGAuOhfO21DVV4qiSObMgT5ey8rL7nNkpJ
MgOl6OksLJK8RWuqVJINmVPNJGDh2zbrsJ5My2ClEvh+xKyfel4L6+oMiMdr
WUGHnVAiNAidar7CwbNMqK8SaWtSqeqXpO+yS2zoeoc8zl37a0j3amC26yZ9
pyfKpOraGwDWHQHmd/3mWbuCwKy+3BkDVu21mqM2YccavC81lLhD5288H/SP
2jHr4OnYN4X0V9R+ethVsPseE3Q1eHpwt1GkY+zG3nc3Q+mOK7W7+Xh6kYWF
3DsO946L5XrvtlZ+zT/sWusB/3lNPMTabDZwwp3f7nNH76ZNpgG4/1ROtuvq
3Tl359fPjX13HlyztxMnP3eTrE2Q7p7b/p1WRQt7eos3cO/b5rbyb9++rzfu
u2vl94V5P7Z00cfN2/jaubt7b+IVm3t/s8mmbrFhgfZugw230/e011DrjeYa
dnqa6jI6c02/wjSiZDAqO1QT450s6lwgTsbwspB4B9s1UY3kZ0xV6xdebF0Q
f0K76B3c22lzcx1ljLtsJk4Jb9eWx1RtG5b1tTtuhea3d33X24dsKTjUY0hP
nOgKUjwgVujw61az/LhNL8wqhzY8bIcsS0+bAHJWMhqro/r3t9eqYSm4aTtD
tvpvNZ6hEPCLE8D9sYcNzIGdSbG/P8SihsYlW/dD1wp/7HlFP+zbJm8fREkU
w8U9u1etENtNavlS0uEyWWp6tQJVO5qy/aBtOmA9T6qJUvmJVTZSbxvvtjRJ
uZI8VPaX4tsHKbtkCVjsv2RttUTwaSnDaBW8Glazdtf9cjDfA+yNuoAhh7ZA
BSuEbEfrqsHPXey79mpvLPANpVVFEzxYgZYDVi0mJPQMTba4au8m/hiP7R0u
23v4bO96ZcgGFeeObJN+pvn57iQX6dyZ6fLdM7ffMkRb6tmza7W7IcJ9kxPZ
fuxzb/ZK8L580+dG7Z+5L/Olq8edPuAN07Ta9CbB9Pa4c44+yHX6/pqQ+zbt
X2bu7HwZmiu1bfWJna/rfN+Ze+IH6n/dz3ozpJpzqFqKSENBOPBemGMJ230H
7slgqv91n94fdGAeTzz3eOKen6Drv0RJ/XEH9vV/DSEeuPp9ZPhOru8LCveW
71GMaIn3PRXI9jrrj22fnQdnz9x3H6lCes2u2vYN8k6E2rEB07aUUKcj1pOz
WihZqRr1JXhSL4u2G14bswQ2Q7IqVTW2hWGpGl6aUMFdqsDsJVss5yjF+5I9
+XT73ce8uK8Tjvte7XSnKNn2O1OC9Xn9ZU2kDPwPJGj8j4jWUoEDtl57N5O4
cMlL7R5IydvKr2UdplV916JY200ArJPIN7rzcnS0Ihs5vmLalfuVNWN0Jr8K
XnN9FtSLufL3LCmlKN7O0L44zArzUnjtgfoVC8/bii/X7gtHbj8jhdV7j3WH
+Fu5Yeq18myh5/q7qqooS472rFUL6Sjtl2RRunL19T3PoVm1KqPyLU446BQu
Uxhvdn/4ErerVtdAUopG2PzSq0Zdj0rLb70ruWPeDbGZrOJL+V18e0n7za9t
FOaKldaLWeh6tHbboFHTF6UwRy3uBM6XXYTNtyDXCg1LLAEsiKsJ2LehGEkc
qWo6DQFxe8wqpCpJGaNHTw6ljJGt7YHBOTYLxRV9Z1d67cQcvaLEKnm/fRNJ
/BLyxpbysT4zWxLKq+snFey4VD75JCl2neuw0z2yod0Sd7EeoHzz97+ry5zL
jjSKd0wTJDD1N+v+4x/UKdgf078/4ksRfPpepRG4F4ZxuxeuhFYhhcLMPFki
erHW+P781cVzQotqXFfHbeJKuUi9WCl70VdxrBqirwwvx+rbYni0o33Z0TtN
9Z/iIpzKe3PQeYz0Do1F9PYBM+KmGE99WmQxhTQ8j7HQqCpyCoz+8OHv+Opo
HCS4ASKqq6wfe77BJFr+48MHmf5Apn8FhyCZAXQSXowK+RzF79u05jn0qfaO
lJLeRmLLVuFdxqzKOPkkku2P3vDup7N60Ib7nUPRqmbne2fPPEjn/ou4GgXi
qNUv8lYWFPUaWMSwQwTiN1+YxpmcSo6LWD0ZWd7/efD/ATsHJg8ijgAA

-->

</rfc>
