<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-vicente-oauth-apm-00" category="info" submissionType="independent" xml:lang="en" version="3">

  <front>
    <title abbrev="OAuth APM">Authorization Posture Mechanism (APM) for OAuth 2.0</title>

    <seriesInfo name="Internet-Draft" value="draft-vicente-oauth-apm-00"/>

    <author initials="B." surname="Vicente" fullname="Brian Vicente">
      <organization>Sanctum SecOps LLC</organization>
      <address>
        <postal>
          <city>Pine City</city>
          <region>NY</region>
          <country>United States of America</country>
        </postal>
        <email>admin@sanctumsecops.com</email>
        <uri>https://orcid.org/0009-0006-6395-5308</uri>
      </address>
    </author>

    <date year="2026" month="June" day="8"/>

    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>

    <keyword>oauth</keyword>
    <keyword>authorization</keyword>
    <keyword>posture</keyword>
    <keyword>zero trust</keyword>
    <keyword>device posture</keyword>
    <keyword>graduated outcome</keyword>
    <keyword>least privilege</keyword>

    <abstract>
      <t>
        OAuth 2.0 access tokens encode an authorization decision made at issuance time.
        Sender-constraining mechanisms such as Mutual-TLS certificate binding
        (<xref target="RFC8705"/>) and Demonstrating Proof of Possession (<xref target="RFC9449"/>)
        extend this model by proving key possession at request time, but neither mechanism
        re-evaluates the full security context — certificate validity, token claims, and
        device-level security posture — against the conditions present at token issuance,
        nor provides a normative pathway for graduated least-privilege outcomes when that
        context has degraded.
      </t>
      <t>
        This document describes the Authorization Posture Mechanism (APM) problem domain:
        the gap between what per-request sender-constraining mechanisms prove
        cryptographically and what Zero Trust Architecture requires for per-request
        authorization decisions. It motivates and specifies requirements for a mechanism
        that (a) assembles a per-request Consistency View comprising the client
        certificate, the bound access token, and an integrity-protected device-posture
        signal; (b) evaluates the Consistency View against the Issuance Posture recorded
        at token issuance; and (c) produces graduated, least-privilege outcomes — scope
        reduction, method restriction, or full denial — proportional to the degree of
        posture degradation detected.
      </t>
    </abstract>

    <note title="Source and Archival" removeInRFC="true">
      <t>
        Source for this draft is maintained at
        <eref target="https://github.com/Sanc-Admin/oauth-apm">https://github.com/Sanc-Admin/oauth-apm</eref>.
        A citable archival version of this document is available at Zenodo:
        <eref target="https://doi.org/10.5281/zenodo.20584241">https://doi.org/10.5281/zenodo.20584241</eref>.
        Author ORCID iD:
        <eref target="https://orcid.org/0009-0006-6395-5308">https://orcid.org/0009-0006-6395-5308</eref>.
      </t>
      <t>
        Discussion of this document occurs on the IETF "oauth" mailing list
        (oauth@ietf.org). Issues and pull requests may be filed at the GitHub
        repository linked above.
      </t>
    </note>

    <note title="IPR Considerations" removeInRFC="true">
      <t>
        The author has filed or intends to file United States patent applications
        covering subject matter described in this document. By posting this
        Internet-Draft, the author submits to the IETF Trust the rights described
        in Section 5 of BCP 78 and BCP 79. Patent licensing terms are not yet known.
        Implementers and reviewers should consult the IETF Datatracker IPR
        disclosure page for this document for current disclosure status.
      </t>
    </note>

  </front>

  <middle>

    <!-- Section 1: Introduction -->
    <section anchor="introduction" numbered="true">
      <name>Introduction</name>

      <!-- Section 1.1: Background and Motivation -->
      <section anchor="motivation" numbered="true">
        <name>Background and Motivation</name>
        <t>
          Zero Trust Architecture, as defined in NIST SP 800-207 <xref target="NIST.SP.800-207"/>,
          requires that access to resources be granted on a per-request basis using dynamic
          policy that includes the observable state of the client identity, the requesting
          asset, and behavioral or environmental attributes. NIST SP 800-207 §3.2 states
          explicitly:
        </t>
        <blockquote>
          "No resource is inherently trusted. Every asset must have its security posture
          evaluated via a PEP before a request is granted to an enterprise-owned resource.
          This evaluation should be continual for as long as the session lasts."
        </blockquote>
        <t>
          The OAuth 2.0 framework <xref target="RFC6749"/> issues access tokens that represent an
          authorization decision frozen at the moment of issuance. The resource server
          validates token expiry and scope coverage; it does not re-evaluate whether the
          security conditions that justified issuance still hold. This design was deliberate
          and appropriate for the HTTP API delegation use case OAuth was designed to serve,
          but it creates a structural gap with respect to ZTA's per-request evaluation
          requirement.
        </t>
        <t>
          Two families of sender-constraining mechanisms have been standardized to address
          portions of this gap:
        </t>
        <ol spacing="normal">
          <li>
            <t><strong>Certificate-bound access tokens</strong> (<xref target="RFC8705"/>): The authorization server
            records a SHA-256 thumbprint of the client's mutual-TLS certificate in the
            <tt>cnf/x5t#S256</tt> claim. The resource server checks that the certificate
            presented in the current TLS handshake matches the thumbprint. This
            proves that the presenter of the token also possesses the private key of the
            enrolled certificate. It does not prove that the certificate is currently
            valid, that the device on which the key resides is in a compliant security
            state, or that any conditions beyond key possession hold at request time.
            Section 6.5 of <xref target="RFC8705"/> explicitly places TLS termination and revocation
            re-evaluation outside the scope of the specification.</t>
          </li>
          <li>
            <t><strong>Demonstrating Proof of Possession</strong> (<xref target="RFC9449"/>): Each HTTP request carries
            a freshly generated DPoP proof JWT binding the request to a specific HTTP
            method (<tt>htm</tt>) and URI (<tt>htu</tt>). This provides per-request proof of key
            possession and prevents token-theft replay for a different endpoint. Section
            11.7 of <xref target="RFC9449"/> states definitively that DPoP does not ensure the
            integrity of the request payload or headers beyond method and URI. Section
            11.11 states that cryptographic binding between DPoP and client authentication
            mechanisms beyond the scope of that specification is out of scope.</t>
          </li>
        </ol>
        <t>
          Neither mechanism addresses the third dimension: device-level security posture.
          Neither mechanism evaluates, per-request, whether the triple formed by (client
          certificate, bound access token, device posture) remains consistent with the
          security context recorded at token issuance.
        </t>
        <t>
          When inconsistency is detected — for example, when a device that was MDM-enrolled
          and fully patched at token issuance is later found to be missing a critical
          security update — the current OAuth ecosystem offers only binary outcomes: either
          the request succeeds (if the token is still structurally valid) or fails (if the
          resource server applies an out-of-band revocation).
        </t>
      </section>

      <!-- Section 1.2: Gaps in Adjacent Mechanisms -->
      <section anchor="adjacent-gaps" numbered="true">
        <name>Gaps in Adjacent Mechanisms</name>

        <!-- Section 1.2.1 -->
        <section anchor="gap-step-up" numbered="true">
          <name>Step-Up Authentication (RFC 9470)</name>
          <t>
            RFC 9470 <xref target="RFC9470"/> defines the <tt>insufficient_user_authentication</tt> error code
            and a <tt>WWW-Authenticate</tt> challenge mechanism by which a resource server can
            signal that the authentication context associated with a token does not meet
            requirements. The client must then re-authenticate at the required
            <tt>acr_values</tt> or within the required <tt>max_age</tt>.
          </t>
          <t>
            This mechanism is reactive (it fires on a specific request failure, not
            proactively), addresses authentication strength only (not device posture), and
            its outcome is structurally binary: the authentication requirement is either
            satisfied upon re-authentication, or the request is denied. There is no
            mechanism for the resource server to respond with "proceed with a reduced set
            of permitted operations" rather than "re-authenticate or be denied."
          </t>
        </section>

        <!-- Section 1.2.2 -->
        <section anchor="gap-rar" numbered="true">
          <name>Rich Authorization Requests (RFC 9396)</name>
          <t>
            RFC 9396 <xref target="RFC9396"/> defines the <tt>authorization_details</tt> parameter, enabling
            fine-grained authorization grants specifying <tt>actions</tt>, <tt>locations</tt>,
            <tt>datatypes</tt>, and <tt>privileges</tt> at issuance time. This is a significant improvement
            over the coarse <tt>scope</tt> model for expressing initial grants.
          </t>
          <t>
            However, the <tt>authorization_details</tt> claim in an issued token is static for
            the token's lifetime. Section 5.3 of <xref target="RFC9396"/> does not define any mechanism
            for the resource server to narrow the <tt>actions</tt> or <tt>privileges</tt> fields
            per-request in response to a runtime posture signal. If the device posture
            degrades after token issuance, there is no standardized pathway to downgrade
            from <tt>"actions": ["read", "write", "delete"]</tt> to <tt>"actions": ["read"]</tt> for
            the duration of the degraded state.
          </t>
        </section>

        <!-- Section 1.2.3 -->
        <section anchor="gap-caep" numbered="true">
          <name>Continuous Access Evaluation (CAEP)</name>
          <t>
            The OpenID Continuous Access Evaluation Profile <xref target="CAEP"/> defines an
            event-driven, asynchronous push mechanism by which a Transmitter (such as an
            MDM system or identity provider) can signal state changes to a Receiver (such
            as a resource server or authorization server). The Device Compliance Change
            event type carries only a binary <tt>previous_status</tt> / <tt>current_status</tt> of
            <tt>compliant</tt> or <tt>not-compliant</tt>.
          </t>
          <t>
            CAEP operates asynchronously. Between the occurrence of a compliance change
            event and the Receiver's processing of the pushed Security Event Token, there
            is a temporal gap during which a client with a valid access token may interact
            with a resource server against a degraded security posture that has not yet
            been signaled. CAEP does not provide a per-request, in-band posture assertion
            alongside individual HTTP requests.
          </t>
        </section>

        <!-- Section 1.2.4 -->
        <section anchor="gap-attestation" numbered="true">
          <name>Attestation-Based Client Authentication</name>
          <t>
            The draft <xref target="I-D.ietf-oauth-attestation-based-client-auth"/> defines a two-token
            structure for attesting client instance properties: a Client Attestation JWT
            (issued by the client's backend) and a per-request Client Attestation PoP JWT.
            The Client Attestation JWT may be reused across requests until its <tt>exp</tt> claim.
          </t>
          <t>
            Section 7 of that draft notes that if device posture degrades within the
            validity window of a Client Attestation JWT, there is no normative mechanism to
            force fresh attestation. Furthermore, the draft explicitly does not define a
            schema for device posture claims within the Client Attestation JWT; what
            hardware and software properties are attested is left to deployment-specific
            conventions. The mechanism operates at the client authentication layer, not the
            per-request resource-access layer.
          </t>
        </section>

      </section>

      <!-- Section 1.3 (implicit) — skipped per source structure; next anchor is relationship = §1.4 -->

      <!-- Section 1.4: Relationship to This Document -->
      <section anchor="relationship" numbered="true">
        <name>Relationship to This Document</name>
        <t>
          This document defines the APM problem domain and specifies functional
          requirements for a mechanism addressing the three identified gaps:
        </t>
        <ol spacing="normal">
          <li>
            <t><strong>Gap A</strong> <xref target="gap-a"/>: No per-request triple consistency verification — no
            normative mechanism evaluates the certificate, bound token, and device-posture
            signal together per-request.</t>
          </li>
          <li>
            <t><strong>Gap B</strong> <xref target="gap-b"/>: No graduated least-privilege outcomes — no normative
            mechanism responds to posture degradation with anything other than a binary
            allow/deny decision.</t>
          </li>
          <li>
            <t><strong>Gap C</strong> <xref target="gap-c"/>: No method-level downgrade on posture degradation — no
            normative mechanism restricts permitted HTTP methods or operation types for
            an existing valid token in response to a runtime posture change.</t>
          </li>
        </ol>
        <t>
          This document is informational. It describes the problem domain and specifies
          requirements; it does not mandate a specific protocol design. Implementors,
          working group participants, and standards authors are encouraged to use the
          requirements in <xref target="requirements"/> as evaluation criteria for proposed solutions.
        </t>

        <!-- Gap A anchor -->
        <section anchor="gap-a" numbered="false">
          <name>Gap A: No Per-Request Triple Consistency Verification</name>
          <t>
            No normative mechanism evaluates the certificate, bound token, and device-posture
            signal together per-request.
          </t>
        </section>

        <!-- Gap B anchor -->
        <section anchor="gap-b" numbered="false">
          <name>Gap B: No Graduated Least-Privilege Outcomes</name>
          <t>
            No normative mechanism responds to posture degradation with anything other than
            a binary allow/deny decision.
          </t>
        </section>

        <!-- Gap C anchor -->
        <section anchor="gap-c" numbered="false">
          <name>Gap C: No Method-Level Downgrade on Posture Degradation</name>
          <t>
            No normative mechanism restricts permitted HTTP methods or operation types for
            an existing valid token in response to a runtime posture change.
          </t>
        </section>

      </section>

      <!-- Section 1.5: Post-Quantum Relevance -->
      <section anchor="pq-relevance" numbered="true">
        <name>Post-Quantum Relevance</name>
        <t>
          The APM mechanism is motivated not only by current Zero Trust Architecture
          requirements but also by the post-quantum cryptographic transition
          underway across the Internet.
        </t>
        <t>
          Shor's algorithm <xref target="SHOR1994"/> solves the Integer Factorization Problem
          (IFP) and the Elliptic Curve Discrete Logarithm Problem (ECDLP) in
          polynomial quantum time, meaning that a sufficiently capable
          Cryptographically Relevant Quantum Computer (CRQC) can break RSA and
          ECDSA/ECDH keys. The TLS client certificates that form the certificate
          component of the APM Consistency View are today predominantly RSA or
          ECDSA certificates. If a CRQC breaks the private key corresponding to
          such a certificate, the <tt>cnf/x5t#S256</tt> binding asserted by <xref target="RFC8705"/>
          is defeated: an attacker can present any token bound to the compromised
          certificate thumbprint and forge the TLS handshake.
        </t>
        <t>
          Grover's algorithm <xref target="GROVER1996"/> provides a quadratic speedup for
          unstructured search, effectively halving the bit-security of hash-based
          constructs. SHA-256 hashes used in <tt>cnf/x5t#S256</tt> (<xref target="RFC8705"/>) and
          <tt>cnf/jkt</tt> (<xref target="RFC9449"/>) provide approximately 128-bit quantum preimage
          resistance — sufficient for current threat models, but motivating the
          migration to PQ-signed certificates as the certificate component of the
          Consistency View.
        </t>
        <t>
          The Harvest-Now-Decrypt-Later (HNDL) threat further amplifies the
          urgency: an adversary who records TLS sessions today can retroactively
          recover the session keys once a CRQC is available, recovering the access
          tokens exchanged within those sessions. Per-request triple consistency
          evaluation (REQ-1 through REQ-3) and the short posture-assertion freshness
          window (<xref target="fmt-cv-headers"/>) limit the window of exposure of any individual
          access token and its associated Consistency View to the current request
          rather than an entire session lifetime.
        </t>
        <t>
          The APM mechanism is designed to remain applicable as the OAuth ecosystem
          transitions to PQ-signed certificates: the certificate component of the
          Consistency View is algorithm-agnostic; <xref target="RFC8705"/> does not restrict the
          certificate's key type. A Consistency View assembled from an ML-DSA
          certificate (as defined in <xref target="FIPS204"/>) functions identically to one
          assembled from an ECDSA certificate.
        </t>
      </section>

    </section>

    <!-- Section 2: Conventions and Definitions -->
    <section anchor="conventions" numbered="true">
      <name>Conventions and Definitions</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>The following terms are used throughout this document.</t>

      <dl newline="true" spacing="normal">
        <dt>Access Token:</dt>
        <dd>
          A credential issued by an authorization server to a client, as defined in
          <xref target="RFC6749"/> Section 1.4. For the purposes of this document, all access tokens
          are assumed to be sender-constrained using either <xref target="RFC8705"/> (mTLS
          certificate binding) or <xref target="RFC9449"/> (DPoP key binding), or both.
        </dd>

        <dt>Authorization Server (AS):</dt>
        <dd>
          The server issuing access tokens to the client after successfully
          authenticating the resource owner and obtaining authorization, as defined in
          <xref target="RFC6749"/> Section 1.1.
        </dd>

        <dt>Client:</dt>
        <dd>
          An application making protected resource requests, as defined in <xref target="RFC6749"/>
          Section 1.1.
        </dd>

        <dt>Consistency View:</dt>
        <dd>
          The triple of (a) the TLS client certificate or DPoP public key presented with
          a request, (b) the bound access token's claims, and (c) the device-posture
          signal supplied with the request. A Consistency View is assembled per-request
          at the resource server or a co-located policy enforcement point. The Consistency
          View is evaluated against the Issuance Posture to determine whether posture
          degradation has occurred.
        </dd>

        <dt>Device-Posture Signal:</dt>
        <dd>
          An integrity-protected assertion about the security state of the device from
          which the request originates. The specific encoding and transport of the
          device-posture signal is deployment-specific but MUST be integrity-protected
          (e.g., cryptographically signed) to prevent forgery. The device-posture
          signal is treated as an opaque input to the Consistency View evaluation; this
          document does not define a normative schema for posture attributes.
        </dd>

        <dt>Graduated Outcome:</dt>
        <dd>
          A result of Consistency View evaluation that is neither unconditional access
          nor unconditional denial. Graduated outcomes reduce the effective permission
          set in proportion to the degree of posture degradation detected. Graduated
          outcomes include but are not limited to Scope Reduction and Method Restriction.
        </dd>

        <dt>Issuance Posture:</dt>
        <dd>
          A representation of the security posture of the client and its device at the
          time the access token was issued by the authorization server. Issuance Posture
          is recorded either as a claim in the access token or as an entry in the AS's
          token metadata store associated with the token identifier. The Issuance Posture
          serves as the baseline against which per-request posture signals are compared.
        </dd>

        <dt>Method Restriction:</dt>
        <dd>
          A Graduated Outcome that limits the set of HTTP methods (or equivalently, the
          set of resource operation types expressed as <tt>actions</tt> in the sense of
          <xref target="RFC9396"/>) that the resource server will process for a given request.
          For example: an access token that nominally authorizes <tt>GET</tt>, <tt>POST</tt>, <tt>PUT</tt>,
          and <tt>DELETE</tt> may be restricted to <tt>GET</tt> only when posture degradation is
          detected.
        </dd>

        <dt>Policy Enforcement Point (PEP):</dt>
        <dd>
          A component that evaluates the Consistency View and applies the resulting
          graduated outcome, consistent with the ZTA reference architecture in
          <xref target="NIST.SP.800-207"/> Section 3.
        </dd>

        <dt>Posture Degradation:</dt>
        <dd>
          The condition in which one or more attributes of the current device-posture
          signal are less secure than the corresponding attributes of the Issuance
          Posture. Posture degradation is a matter of degree; the evaluation function
          maps a degradation vector to an outcome class.
        </dd>

        <dt>Privileged Request:</dt>
        <dd>
          An HTTP request carrying an access token where the requested resource or
          operation has been designated by policy as requiring per-request triple
          consistency evaluation. Not all requests need undergo Consistency View
          evaluation; policy may designate specific resource URIs, HTTP methods, or
          token scopes as requiring APM processing.
        </dd>

        <dt>Resource Server (RS):</dt>
        <dd>
          The server hosting protected resources, accepting access tokens, as defined
          in <xref target="RFC6749"/> Section 1.1.
        </dd>

        <dt>Scope Reduction:</dt>
        <dd>
          A Graduated Outcome that substitutes a narrower scope string or a narrower
          <tt>authorization_details</tt> object for the one granted at issuance. Scope
          reduction takes effect for the current request and possibly subsequent requests
          until posture is restored. Scope reduction MUST NOT be implemented by
          modifying the token itself; it MUST be implemented by the resource server
          applying the reduced scope as an additional constraint during request
          processing.
        </dd>
      </dl>

    </section>

    <!-- Section 3: Problem Statement -->
    <section anchor="problem-statement" numbered="true">
      <name>Problem Statement</name>

      <section anchor="prob-static" numbered="true">
        <name>The Static Authorization Problem</name>
        <t>
          RFC 6749 <xref target="RFC6749"/> describes a model in which the access token represents an
          authorization decision made at the time of issuance. Section 7 of <xref target="RFC6749"/>
          specifies that the resource server validates the token's expiry and scope, but
          "the methods used by the resource server to validate the access token, as well
          as any error responses, are beyond the scope of this specification." No
          mechanism in <xref target="RFC6749"/> addresses re-evaluation of the conditions that
          justified issuance. The token is, in effect, a session surrogate: once issued,
          it carries the authorization context of the issuance event until expiry or
          explicit revocation.
        </t>
        <t>
          This model was appropriate for the original delegation use case. It is
          insufficient for environments governed by Zero Trust Architecture principles,
          which <xref target="NIST.SP.800-207"/> §2.1 describes as requiring:
        </t>
        <blockquote>
          "...least privilege per-request access decisions in information systems and
          services in the face of a network viewed as compromised."
        </blockquote>
        <t>
          NIST SP 800-207 Tenet 6 states: "All resource authentication and authorization
          are dynamic and strictly enforced before access is allowed." This requirement
          cannot be satisfied by a token whose authorization context was frozen at
          issuance.
        </t>
      </section>

      <section anchor="prob-single-dim" numbered="true">
        <name>The Single-Dimension Binding Problem</name>
        <t>
          Both <xref target="RFC8705"/> and <xref target="RFC9449"/> extend the static token model by adding a
          sender-constraint dimension. Certificate-bound tokens (<xref target="RFC8705"/>) prove that
          the presenter holds the private key corresponding to the certificate thumbprint
          embedded in <tt>cnf/x5t#S256</tt>. DPoP (<xref target="RFC9449"/>) proves that the presenter holds
          the key corresponding to the <tt>cnf/jkt</tt> thumbprint and that the proof covers
          the specific HTTP method and URI of the current request.
        </t>
        <t>
          These mechanisms close a critical replay-token vulnerability but remain
          single-dimension: they prove cryptographic possession of a key. They do not
          evaluate:
        </t>
        <ul spacing="normal">
          <li>Whether the certificate has been revoked since issuance (<xref target="RFC8705"/> §6.5
          explicitly excludes revocation re-evaluation from scope)</li>
          <li>Whether the device possessing the key is in a compliant security state at
          the time of the request</li>
          <li>Whether the triple of (certificate, token, device posture) is mutually
          consistent with what was presented and recorded at token issuance</li>
        </ul>
        <t>
          A threat actor who compromises a device to the point of exfiltrating its
          private key material can generate valid DPoP proofs and present valid
          certificate-bound tokens indefinitely, because neither mechanism evaluates
          device security state per-request.
        </t>
      </section>

      <section anchor="prob-binary" numbered="true">
        <name>The Binary Outcome Problem</name>
        <t>
          When a resource server determines that the authentication or authorization
          context of a request is insufficient, the RFC 9470 step-up mechanism
          <xref target="RFC9470"/> provides a single escalation path: the client must re-authenticate
          at the required <tt>acr_values</tt>. The outcome is binary: upon successful
          re-authentication, full access resumes; without it, the request is denied.
        </t>
        <t>
          This binary model imposes disproportionate operational consequences for minor
          posture degradations. Consider a device that was fully patched at token
          issuance but is now one day behind on a non-critical software update. Under
          the binary model, the choices are:
        </t>
        <ol spacing="normal">
          <li>Accept the risk and serve the request as if posture were unchanged.</li>
          <li>Deny the request entirely, disrupting the user's workflow.</li>
        </ol>
        <t>
          Neither choice aligns with least-privilege principles. A graduated model would
          permit a reduced set of operations — for example, read-only operations — while
          requiring posture remediation or step-up authentication before write or
          delete operations are permitted. <xref target="RFC9396"/> enables fine-grained initial
          grants but provides no mechanism for post-issuance narrowing of
          <tt>authorization_details</tt> in response to a runtime posture signal (<xref target="RFC9396"/>
          §5.3).
        </t>
      </section>

      <section anchor="prob-async" numbered="true">
        <name>The Asynchronous Signaling Problem</name>
        <t>
          OpenID CAEP <xref target="CAEP"/> provides the closest existing mechanism for continuous
          access evaluation in the OAuth ecosystem. CAEP's Device Compliance Change
          event signals a transition between <tt>compliant</tt> and <tt>not-compliant</tt> states.
          However:
        </t>
        <ol spacing="normal">
          <li>CAEP operates asynchronously: the event is pushed from a Transmitter to a
          Receiver via the SSE framework. There is a temporal gap between the occurrence
          of a compliance change and the Receiver's action on that event.</li>
          <li>CAEP's device compliance vocabulary is binary. No event in the CAEP
          specification carries fine-grained posture attributes that could be used to
          differentiate, for example, "missing non-critical update" from "MDM enrollment
          revoked."</li>
          <li>CAEP does not provide a per-request, synchronous posture assertion. A client
          with a valid access token may successfully complete multiple requests in the
          window between a compliance change occurrence and the Receiver's propagation
          of that change into an authorization enforcement decision.</li>
          <li>CAEP does not define graduated outcomes. What a Receiver should do upon
          receiving a Device Compliance Change event is out of scope; no normative
          mapping from posture transition to permission change is defined.</li>
        </ol>
      </section>

      <section anchor="prob-summary" numbered="true">
        <name>Summary: Why All Four Together Still Leave a Gap</name>
        <t>
          The combination of RFC 8705, RFC 9449, RFC 9470, RFC 9396, and CAEP does not
          close the APM gap because:
        </t>
        <ul spacing="normal">
          <li><t><strong>Per-request sender-constraining</strong> (<xref target="RFC8705"/>, <xref target="RFC9449"/>): Proves key
          possession but does not evaluate device posture.</t></li>
          <li><t><strong>Fine-grained initial grants</strong> (<xref target="RFC9396"/>): Precise at issuance but
          static thereafter.</t></li>
          <li><t><strong>Reactive step-up</strong> (<xref target="RFC9470"/>): Binary, fires on authentication-level
          failures only, does not address device posture.</t></li>
          <li><t><strong>Asynchronous push events</strong> (<xref target="CAEP"/>): Not synchronous with individual
          requests, binary compliance vocabulary, no normative graduated outcomes.</t></li>
        </ul>
        <t>
          None of these mechanisms defines: (a) the per-request triple of certificate,
          token, and device-posture signal as a unit of evaluation; (b) a normative
          comparison of that triple against the conditions recorded at issuance; or (c) a
          normative mapping from the result of that comparison to a graduated,
          least-privilege outcome. This gap is the subject of the APM requirements in
          <xref target="requirements"/>.
        </t>
      </section>

    </section>

    <!-- Section 4: Requirements -->
    <section anchor="requirements" numbered="true">
      <name>Requirements</name>

      <t>
        This section specifies functional requirements for a solution to the APM problem
        domain. Requirements are expressed in abstract, non-implementation-specific
        language. These requirements describe what a solution SHOULD satisfy; they do
        not constitute a protocol specification. The key words are as defined in
        <xref target="conventions"/>.
      </t>
      <t>
        A compliant APM solution SHOULD satisfy the following requirements.
      </t>

      <t>
        <strong>REQ-1: Per-Request Triple Assembly.</strong>
        For each Privileged Request, the enforcing entity (resource server or PEP)
        SHOULD assemble a Consistency View comprising (a) the client certificate
        thumbprint or DPoP public key thumbprint presented with the request, (b) the
        claims of the bound access token, including the <tt>cnf</tt> claim, and (c) an
        integrity-protected device-posture signal supplied with or verifiably associated
        with the request.
      </t>

      <t>
        <strong>REQ-2: Issuance Posture Recording.</strong>
        At token issuance, the authorization server SHOULD record the security posture
        of the requesting client as the Issuance Posture. The Issuance Posture SHOULD
        be associated with the token either as a signed claim in the token itself or as
        metadata in a token-associated record accessible via token introspection
        (<xref target="RFC7662"/>). The Issuance Posture MUST NOT contain posture claims of higher
        sensitivity than the access token itself warrants.
      </t>

      <t>
        <strong>REQ-3: Consistency Evaluation.</strong>
        The enforcing entity SHOULD evaluate the Consistency View against the Issuance
        Posture to determine whether posture degradation has occurred. This evaluation
        SHOULD be synchronous with the processing of the Privileged Request. The
        evaluation function SHOULD be deterministic: the same Consistency View and the
        same Issuance Posture SHOULD produce the same outcome classification.
      </t>

      <t>
        <strong>REQ-4: Graduated Outcome Production.</strong>
        The enforcing entity SHOULD produce graduated outcomes ordered by the least-
        privilege principle. Outcome classes SHOULD include at minimum:
      </t>
      <ul spacing="normal">
        <li><t><strong>Permit</strong>: The Consistency View is consistent with the Issuance Posture;
        the request proceeds under the full authorization of the access token.</t></li>
        <li><t><strong>Scope Reduction</strong>: One or more posture attributes are degraded but the
        degradation does not warrant full denial; the request proceeds under a
        narrower effective scope.</t></li>
        <li><t><strong>Method Restriction</strong>: Posture degradation warrants restricting permitted
        HTTP methods or operation types; the request proceeds only if the requested
        method is within the restricted set.</t></li>
        <li><t><strong>Full Denial</strong>: Posture degradation is sufficiently severe that no
        operation is permitted; the request is denied with an error response that
        includes actionable guidance for the client.</t></li>
      </ul>

      <t>
        <strong>REQ-5: Method-Level Restriction.</strong>
        The graduated outcome framework SHOULD include Method Restriction as a distinct
        outcome class. Method Restriction SHOULD be expressible in terms of both HTTP
        methods and, where applicable, operation types expressed as <tt>actions</tt> in the
        sense of <xref target="RFC9396"/> §2.2. A Method Restriction outcome MUST NOT prevent the
        client from discovering which operations remain available; the response MUST
        convey the permitted method set or operation set.
      </t>

      <t>
        <strong>REQ-6: Scope Reduction.</strong>
        The graduated outcome framework SHOULD include Scope Reduction as a distinct
        outcome class. Scope Reduction MUST NOT be implemented by modifying the access
        token. Scope Reduction MUST be implemented at the resource server or PEP layer
        as an additional constraint applied during request processing. When a Scope
        Reduction outcome is produced, the response SHOULD convey the reduced effective
        scope to the client in a manner compatible with the client's ability to
        re-request operations within the reduced scope.
      </t>

      <t>
        <strong>REQ-7: Deterministic Outcome Mapping.</strong>
        A deployment implementing APM SHOULD define a policy that maps posture
        degradation dimensions to outcome classes in a deterministic, auditable manner.
        The policy SHOULD be expressed such that the mapping from degradation to outcome
        is reproducible and does not depend on transient state beyond the Consistency
        View and Issuance Posture.
      </t>

      <t>
        <strong>REQ-8: Integrity-Protected Posture Signal.</strong>
        The device-posture signal component of the Consistency View MUST be integrity-
        protected to prevent a compromised or malicious client from supplying a falsely
        elevated posture signal. Integrity protection SHOULD be cryptographic (e.g.,
        a signed attestation). The signing authority for the posture signal SHOULD be
        distinct from the client itself; where only client-self-signed posture signals
        are available, the enforcing entity SHOULD apply additional skepticism to the
        resulting Consistency View evaluation.
      </t>

      <t>
        <strong>REQ-9: Backward Compatibility with RFC 8705 and RFC 9449.</strong>
        An APM mechanism SHOULD operate as an additive layer over existing sender-
        constraining mechanisms. The APM mechanism MUST NOT weaken the <tt>cnf/x5t#S256</tt>
        binding assurance provided by <xref target="RFC8705"/> or the <tt>cnf/jkt</tt> binding assurance
        provided by <xref target="RFC9449"/>. Implementations that do not support APM MUST continue
        to function correctly when encountering APM-related claims or response
        parameters they do not recognize; unknown parameters MUST be ignored.
      </t>

      <t>
        <strong>REQ-10: Non-Interference with Token Revocation.</strong>
        An APM mechanism that produces a Scope Reduction or Method Restriction outcome
        for a given request MUST NOT be interpreted as a token revocation event.
        Access token revocation is governed by <xref target="RFC7009"/>. A graduated APM outcome
        is request-scoped; the token itself remains valid for subsequent requests,
        which may yield different outcome classifications if posture is restored.
      </t>

    </section>

    <!-- Section 5: Mechanism -->
    <section anchor="mechanism" numbered="true">
      <name>Mechanism</name>

      <section anchor="mech-overview" numbered="true">
        <name>Overview</name>
        <t>
          The APM mechanism operates at three points in the OAuth request lifecycle:
        </t>
        <ol spacing="normal">
          <li><t><strong>Token Issuance</strong> (Authorization Server): The AS records the Issuance
          Posture alongside the issued token.</t></li>
          <li><t><strong>Request Processing</strong> (Resource Server / PEP): For each Privileged
          Request, the RS or PEP assembles the Consistency View, evaluates it against
          the Issuance Posture, and determines the outcome class.</t></li>
          <li><t><strong>Outcome Conveyance</strong> (Resource Server / PEP to Client): The RS or PEP
          returns either a normal response (for Permit outcomes) or a structured error
          response (for Scope Reduction, Method Restriction, or Full Denial outcomes)
          that enables the client to understand its effective permission set and, if
          applicable, to take corrective action.</t></li>
        </ol>
      </section>

      <section anchor="mech-assembly" numbered="true">
        <name>Consistency View Assembly</name>
        <t>
          The Consistency View is assembled per-request at the enforcement boundary. Its
          three components are obtained as follows:
        </t>
        <t>
          <strong>Certificate Component:</strong>
          If the access token is certificate-bound per <xref target="RFC8705"/>, the certificate
          component is the SHA-256 thumbprint of the client certificate presented in
          the current mutual-TLS handshake. The RS computes this thumbprint from the
          certificate delivered by the TLS layer and compares it to the <tt>cnf/x5t#S256</tt>
          claim in the token. This comparison is the existing <xref target="RFC8705"/> enforcement
          step; APM does not replace or modify it.
        </t>
        <t>
          If the access token is DPoP-bound per <xref target="RFC9449"/>, the key component is the
          SHA-256 thumbprint of the public key in the DPoP proof's <tt>jwk</tt> header
          parameter, verified against <tt>cnf/jkt</tt>. APM does not replace or modify the
          DPoP verification step.
        </t>
        <t>
          <strong>Token Claims Component:</strong>
          The token claims component comprises the access token's <tt>sub</tt>, <tt>scope</tt> (or
          <tt>authorization_details</tt>), <tt>cnf</tt>, <tt>iss</tt>, <tt>aud</tt>, <tt>iat</tt>, and <tt>exp</tt> claims, plus
          any posture-related claims defined by the Issuance Posture recording mechanism
          (see <xref target="mech-issuance-posture"/>).
        </t>
        <t>
          <strong>Device-Posture Signal Component:</strong>
          The device-posture signal is an integrity-protected assertion supplied by or
          verifiably associated with the client for the current request. How the signal
          is conveyed to the enforcement boundary is deployment-specific. Candidate
          conveyance mechanisms include but are not limited to:
        </t>
        <ul spacing="normal">
          <li>A signed JWT carried in a dedicated HTTP request header.</li>
          <li>A signed posture claim within a DPoP proof extension field.</li>
          <li>A reference (handle) to a posture record previously registered with the
          AS or a posture service, verified by the RS via an out-of-band query.</li>
        </ul>
        <t>
          Regardless of conveyance mechanism, the posture signal MUST satisfy REQ-8
          (integrity protection). The RS or PEP MUST verify the integrity protection
          before including the signal in the Consistency View. A posture signal that
          fails integrity verification MUST be treated as absent; the enforcing entity
          MUST NOT use an unverified posture signal as a basis for elevation above the
          Issuance Posture.
        </t>
      </section>

      <section anchor="mech-issuance-posture" numbered="true">
        <name>Issuance Posture Recording</name>
        <t>
          At token issuance, the AS records the security posture of the requesting client
          as the Issuance Posture. Two recording strategies are defined:
        </t>
        <t>
          <strong>Strategy A — Token Claim:</strong>
          The AS includes an <tt>apm_posture</tt> claim in the access token (JWT) or in the
          token introspection response. The claim contains a compact, integrity-protected
          representation of the posture attributes that were verified at issuance. The
          exact structure of <tt>apm_posture</tt> is determined by the posture schema agreed
          upon between the AS, the client, and the RS for the deployment.
        </t>
        <t>
          Because the <tt>apm_posture</tt> claim is included in a token that may be presented
          to third parties, implementations MUST consider the sensitivity of the posture
          attributes included. Attributes that would enable re-identification or that
          expose sensitive device configuration details MUST NOT be included in the token
          claim form; they SHOULD be included only in the introspection-response form or
          stored server-side.
        </t>
        <t>
          <strong>Strategy B — Server-Side Metadata:</strong>
          The AS stores the Issuance Posture server-side, associated with the token
          identifier (<tt>jti</tt>). The RS retrieves the Issuance Posture by querying the token
          introspection endpoint (<xref target="RFC7662"/>) or a dedicated APM metadata endpoint. This
          strategy avoids embedding posture attributes in bearer tokens but introduces
          a per-request network round-trip for posture retrieval.
        </t>
      </section>

      <section anchor="mech-evaluation" numbered="true">
        <name>Consistency Evaluation</name>
        <t>
          The enforcing entity evaluates the Consistency View against the Issuance Posture
          using an evaluation function defined by deployment policy. The evaluation
          function MUST be deterministic (REQ-3) and MUST produce one of the outcome
          classes defined in REQ-4.
        </t>
        <t>
          The evaluation proceeds in the following order:
        </t>
        <ol spacing="normal">
          <li><t><strong>Sender constraint verification</strong>: Verify that the certificate or key
          thumbprint in the Consistency View matches the <tt>cnf</tt> claim in the token.
          If this verification fails, the request MUST be denied with HTTP 401 and
          <tt>invalid_token</tt> error, as per <xref target="RFC8705"/> or <xref target="RFC9449"/>. APM processing
          does not proceed for requests that fail sender constraint verification.</t></li>
          <li><t><strong>Posture signal verification</strong>: Verify the integrity protection of the
          device-posture signal. If the signal is absent or integrity verification
          fails, the enforcing entity SHOULD treat the current posture as unknown.
          An unknown posture SHOULD be mapped to a degraded outcome class by policy.</t></li>
          <li><t><strong>Issuance Posture retrieval</strong>: Retrieve the Issuance Posture from the token
          claim or server-side metadata as appropriate for the deployment's recording
          strategy.</t></li>
          <li><t><strong>Degradation vector computation</strong>: For each posture attribute dimension
          covered by the Issuance Posture, determine whether the current value is
          equal to, better than, or worse than the issuance-time value. The set of
          dimensions that have degraded constitutes the degradation vector.</t></li>
          <li><t><strong>Outcome class determination</strong>: Map the degradation vector to an outcome
          class using the deployment's policy. The policy MUST be designed such that:</t>

            <ul spacing="normal">
              <li>A zero-degradation vector maps to the Permit outcome.</li>
              <li>An increase in the severity of the degradation vector monotonically
              increases the restrictiveness of the outcome class.</li>
              <li>The outcome class for a given degradation vector is the same regardless
              of the identity of the requesting client or the specific resource being
              accessed, given the same policy.</li>
            </ul>
          </li>
        </ol>
      </section>

      <section anchor="mech-outcomes" numbered="true">
        <name>Graduated Outcome Application</name>
        <t>
          The four outcome classes are ordered by increasing restrictiveness:
          Permit &lt; Scope Reduction &lt; Method Restriction &lt; Full Denial.
          A deployment policy MUST implement this ordering monotonically: if a
          degradation vector maps to Method Restriction, all more-severe degradation
          vectors MUST map to Method Restriction or Full Denial. No degradation
          vector may map to a less-restrictive outcome than a strictly less-severe
          degradation vector, given the same policy.
        </t>

        <section anchor="outcome-permit" numbered="true">
          <name>Permit</name>
          <t>
            When the Consistency View is consistent with the Issuance Posture, the
            enforcing entity permits the request to proceed under the full authorization
            of the access token. No additional response headers or error codes are
            generated by APM processing.
          </t>
        </section>

        <section anchor="outcome-scope-reduction" numbered="true">
          <name>Scope Reduction</name>
          <t>
            When the evaluation produces a Scope Reduction outcome, the enforcing entity:
          </t>
          <ol spacing="normal">
            <li>Determines the reduced effective scope according to the deployment's
            scope-reduction policy.</li>
            <li>Processes the request only for operations within the reduced effective
            scope.</li>
            <li>Responds with the appropriate HTTP status code for the request (200 or
            similar for operations within scope; 403 for operations outside the reduced
            scope), and includes a <tt>WWW-Authenticate</tt> header on 403 responses that
            communicates both the reason and the currently effective scope.</li>
          </ol>
          <t>
            The <tt>WWW-Authenticate</tt> response header for a Scope Reduction outcome SHOULD
            take the following form:
          </t>
          <sourcecode><![CDATA[
WWW-Authenticate: Bearer error="apm_scope_reduced",
  error_description="Authorization posture degraded; effective scope narrowed",
  scope="<reduced-scope-string>"
          ]]></sourcecode>
          <t>
            Where <tt>&lt;reduced-scope-string&gt;</tt> is the space-delimited scope string representing
            the effective scope under the Scope Reduction outcome. Clients receiving an
            <tt>apm_scope_reduced</tt> error SHOULD NOT retry the denied operation without first
            restoring posture. Clients MAY retry operations that fall within the reduced
            scope.
          </t>
        </section>

        <section anchor="outcome-method-restriction" numbered="true">
          <name>Method Restriction</name>
          <t>
            When the evaluation produces a Method Restriction outcome, the enforcing entity:
          </t>
          <ol spacing="normal">
            <li>Determines the set of permitted HTTP methods (or operation types, if the
            deployment maps <tt>authorization_details</tt> <tt>actions</tt> to HTTP methods) according
            to the deployment's method-restriction policy.</li>
            <li>Processes the request only if the HTTP method of the current request is
            within the permitted set.</li>
            <li>Responds with HTTP 403 and a <tt>WWW-Authenticate</tt> header that communicates
            the permitted method set for requests that use a non-permitted method.</li>
          </ol>
          <t>
            The <tt>WWW-Authenticate</tt> response header for a Method Restriction outcome SHOULD
            take the following form:
          </t>
          <sourcecode><![CDATA[
WWW-Authenticate: Bearer error="apm_method_restricted",
  error_description="Authorization posture degraded; method not permitted",
  allowed_methods="GET HEAD"
          ]]></sourcecode>
          <t>
            Where <tt>allowed_methods</tt> is a space-delimited list of currently permitted HTTP
            methods. Clients receiving an <tt>apm_method_restricted</tt> error SHOULD inspect the
            <tt>allowed_methods</tt> value and, if the required operation is unavailable, SHOULD
            initiate posture remediation or re-authorization rather than retrying the
            denied method.
          </t>
        </section>

        <section anchor="outcome-full-denial" numbered="true">
          <name>Full Denial</name>
          <t>
            When the evaluation produces a Full Denial outcome, the enforcing entity
            responds with HTTP 401 and a <tt>WWW-Authenticate</tt> challenge. Full Denial
            challenges SHOULD use the <tt>insufficient_authorization_posture</tt> error code
            (see <xref target="iana-error-codes"/>) rather than the generic <tt>invalid_token</tt>, to enable
            the client to distinguish a posture-triggered denial from a token validity
            failure. Clients receiving a Full Denial outcome SHOULD initiate posture
            remediation and re-authorization.
          </t>
          <t>
            The <tt>WWW-Authenticate</tt> response header for a Full Denial outcome SHOULD take
            the following form:
          </t>
          <sourcecode><![CDATA[
WWW-Authenticate: Bearer error="insufficient_authorization_posture",
  error_description="Authorization posture degraded below minimum threshold"
          ]]></sourcecode>
        </section>

      </section>

      <section anchor="mech-sequence" numbered="true">
        <name>Sequence Diagram</name>
        <t>
          The following diagram illustrates the APM flow for a Privileged Request that
          results in a Method Restriction outcome. Steps 1-4 are the existing OAuth
          sender-constraint flow (unchanged); steps 5-9 are the additional APM steps.
        </t>
        <figure anchor="fig-sequence">
          <name>APM Flow for Method Restriction Outcome</name>
          <artwork type="ascii-art"><![CDATA[
 Client          Resource Server (RS / PEP)    Authorization Server (AS)
   |                        |                            |
   |  (1) Token Request                                  |
   |  (with posture signal)                              |
   |---------------------------------------------------->|
   |                                                     |
   |                        |  (2) Issuance Posture      |
   |                        |  recorded server-side      |
   |                        |       [AS internal]        |
   |                                                     |
   |  (3) Access Token      |                            |
   |<----------------------------------------------------|
   |                        |                            |
   |  (4) Privileged        |                            |
   |  Request               |                            |
   |  Authorization:        |                            |
   |  DPoP <token>          |                            |
   |  DPoP: <proof>         |                            |
   |  APM-Posture: <signal> |                            |
   |----------------------->|                            |
   |                        |                            |
   |                        | (5) Verify sender          |
   |                        | constraint (RFC 8705       |
   |                        | / RFC 9449)                |
   |                        |---+                        |
   |                        |   | verify cnf/jkt vs      |
   |                        |   | DPoP jwk thumbprint    |
   |                        |<--+                        |
   |                        |                            |
   |                        | (6) Retrieve Issuance      |
   |                        | Posture (token claim or    |
   |                        | introspection query)       |
   |                        |---+  [or via introspect]  |
   |                        |   |<--------------------> |
   |                        |<--+                        |
   |                        |                            |
   |                        | (7) Assemble Consistency   |
   |                        | View: verify posture       |
   |                        | signal integrity;          |
   |                        | compute degradation vector |
   |                        |---+                        |
   |                        |<--+                        |
   |                        |                            |
   |                        | (8) Apply policy:          |
   |                        | degradation vector ->      |
   |                        | Method Restriction outcome |
   |                        |---+                        |
   |                        |<--+                        |
   |                        |                            |
   | (9) HTTP 403           |                            |
   | WWW-Authenticate:      |                            |
   |  error="apm_method_   |                            |
   |  restricted"           |                            |
   |  allowed_methods="GET" |                            |
   |<-----------------------|                            |
   |                        |                            |
   | (10) Client inspects   |                            |
   | WWW-Authenticate;      |                            |
   | retries with GET or    |                            |
   | initiates posture      |                            |
   | remediation            |                            |
   |---+                    |                            |
   |<--+                    |                            |
          ]]></artwork>
        </figure>
      </section>

    </section>

    <!-- Section 6: Message Formats -->
    <section anchor="message-formats" numbered="true">
      <name>Message Formats</name>

      <section anchor="fmt-issuance-posture" numbered="true">
        <name>Issuance Posture Claim</name>
        <t>
          When recording Issuance Posture as a token claim (Strategy A from
          <xref target="mech-issuance-posture"/>), the claim name is <tt>apm_posture</tt>. The claim value is
          a JSON object. The schema of the <tt>apm_posture</tt> object is deployment-defined;
          this document specifies the following registered sub-fields:
        </t>
        <dl newline="true" spacing="normal">
          <dt><tt>posture_at</tt>:</dt>
          <dd>(REQUIRED) A JSON numeric value representing the time at which posture was
          recorded, as a NumericDate per <xref target="RFC7519"/> §2.</dd>

          <dt><tt>posture_hash</tt>:</dt>
          <dd>(OPTIONAL) A base64url-encoded, integrity-protected digest of the posture
          attributes evaluated at issuance. The digest algorithm and the input format
          are identified by the <tt>posture_alg</tt> sub-field.</dd>

          <dt><tt>posture_alg</tt>:</dt>
          <dd>(OPTIONAL, REQUIRED if <tt>posture_hash</tt> is present) A string identifying the
          algorithm used to compute <tt>posture_hash</tt>. Values follow the JOSE JWA registry
          (<xref target="RFC7518"/>). Implementations SHOULD use <tt>S256</tt> (SHA-256).</dd>

          <dt><tt>posture_ref</tt>:</dt>
          <dd>(OPTIONAL) A URI pointing to a server-side posture record that can be
          retrieved for detailed comparison. Use of <tt>posture_ref</tt> requires that the RS
          or PEP have the ability to dereference the URI.</dd>
        </dl>
        <t>
          Example <tt>apm_posture</tt> claim embedded in a JWT access token:
        </t>
        <figure anchor="fig-token-posture-claim">
          <name>JWT Access Token with apm_posture Claim</name>
          <sourcecode type="json"><![CDATA[
{
  "iss": "https://as.example.com",
  "sub": "user@example.com",
  "aud": "https://rs.example.com",
  "exp": 1800000000,
  "iat": 1799996400,
  "jti": "aB3xQ9pR",
  "cnf": {
    "jkt": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs"
  },
  "scope": "records:read records:write",
  "apm_posture": {
    "posture_at": 1799996400,
    "posture_hash": "Y2Fj...base64url-truncated",
    "posture_alg": "S256",
    "posture_ref": "https://as.example.com/posture/aB3xQ9pR"
  }
}
          ]]></sourcecode>
        </figure>
      </section>

      <section anchor="fmt-cv-headers" numbered="true">
        <name>Consistency View Request Headers</name>
        <t>
          When conveying the device-posture signal as an HTTP request header, the header
          name is <tt>APM-Posture</tt>. The value is a compact-serialized signed JWT (a JWS in
          compact serialization per <xref target="RFC7519"/>) whose payload contains the posture
          attributes as of the time of the request.
        </t>
        <t>
          The APM-Posture JWT MUST include the following claims:
        </t>
        <dl newline="true" spacing="normal">
          <dt><tt>iat</tt>:</dt>
          <dd>(REQUIRED) Issuance time of the posture assertion. Resource servers and PEPs
          MUST reject posture assertions whose <tt>iat</tt> is more than a deployment-defined
          freshness window in the past. A freshness window of 60 seconds is RECOMMENDED
          for most deployments; lower values SHOULD be used for high-sensitivity
          resources.</dd>

          <dt><tt>jti</tt>:</dt>
          <dd>(REQUIRED) A per-request unique identifier for the posture assertion. Resource
          servers and PEPs SHOULD maintain a short-term record of seen <tt>jti</tt> values to
          detect replayed posture assertions.</dd>

          <dt><tt>sub</tt>:</dt>
          <dd>(REQUIRED) The subject for which posture is asserted. MUST match the <tt>sub</tt>
          claim of the bound access token.</dd>

          <dt><tt>ath</tt>:</dt>
          <dd>(REQUIRED) A base64url-encoded SHA-256 hash of the access token to which this
          posture assertion is bound, following the same convention as the DPoP <tt>ath</tt>
          claim in <xref target="RFC9449"/> §4.2. This binds the posture assertion to the specific
          token presented in the same request.</dd>
        </dl>
        <t>
          Additional posture-specific claims are deployment-defined. The signing key for
          the APM-Posture JWT SHOULD be a key controlled by a posture attestation service
          that is distinct from the client itself, to satisfy REQ-8.
        </t>
        <t>
          Example APM-Posture JWT payload:
        </t>
        <figure anchor="fig-posture-jwt">
          <name>APM-Posture JWT Payload (Deployment-Specific Fields Omitted)</name>
          <sourcecode type="json"><![CDATA[
{
  "iat": 1799996400,
  "jti": "posture-X7pQ2w",
  "sub": "user@example.com",
  "ath": "fUHyO2r8tx45IsZggRC...base64url-truncated"
}
          ]]></sourcecode>
        </figure>
      </section>

      <section anchor="fmt-error-responses" numbered="true">
        <name>Graduated Outcome Error Responses</name>

        <section anchor="fmt-scope-reduction-resp" numbered="true">
          <name>Scope Reduction Response</name>
          <figure anchor="fig-scope-reduction">
            <name>Scope Reduction 403 Response</name>
            <sourcecode><![CDATA[
HTTP/1.1 403 Forbidden
WWW-Authenticate: Bearer realm="example",
  error="apm_scope_reduced",
  error_description="Authorization posture degraded; effective scope reduced",
  scope="records:read"
            ]]></sourcecode>
          </figure>
          <t>
            The <tt>scope</tt> parameter in the <tt>WWW-Authenticate</tt> header reflects the reduced
            effective scope. The client MAY retry the request using only the operations
            within the indicated scope. The client SHOULD NOT retry the denied operation
            until posture is remediated and a new access token is issued under the full
            scope.
          </t>
        </section>

        <section anchor="fmt-method-restriction-resp" numbered="true">
          <name>Method Restriction Response</name>
          <figure anchor="fig-method-restriction">
            <name>Method Restriction 403 Response</name>
            <sourcecode><![CDATA[
HTTP/1.1 403 Forbidden
WWW-Authenticate: Bearer realm="example",
  error="apm_method_restricted",
  error_description="Authorization posture degraded; method not permitted",
  allowed_methods="GET HEAD OPTIONS"
            ]]></sourcecode>
          </figure>
          <t>
            The <tt>allowed_methods</tt> parameter lists the HTTP methods the RS will process for
            this client under the current degraded posture. Methods not in <tt>allowed_methods</tt>
            will be rejected with the same <tt>apm_method_restricted</tt> error.
          </t>
        </section>

        <section anchor="fmt-full-denial-resp" numbered="true">
          <name>Full Denial Response</name>
          <figure anchor="fig-full-denial">
            <name>Full Denial 401 Response</name>
            <sourcecode><![CDATA[
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",
  error="insufficient_authorization_posture",
  error_description="Authorization posture degraded below minimum threshold"
            ]]></sourcecode>
          </figure>
          <t>
            Clients receiving this response MUST initiate posture remediation before
            retrying. Clients SHOULD surface a user-facing notification indicating that
            access has been suspended due to a security posture issue.
          </t>
        </section>

        <section anchor="fmt-step-up-interaction" numbered="true">
          <name>Interaction with RFC 9470 Step-Up</name>
          <t>
            An APM Full Denial response and an RFC 9470 step-up challenge address different
            conditions and MUST NOT be conflated:
          </t>
          <ul spacing="normal">
            <li>An RFC 9470 <tt>insufficient_user_authentication</tt> challenge means the
            authentication event associated with the token does not meet the RS's
            requirements. The remedy is re-authentication.</li>
            <li>An APM <tt>insufficient_authorization_posture</tt> challenge means the device
            security posture associated with the token does not meet the RS's requirements.
            The remedy is posture remediation followed by re-authorization.</li>
          </ul>
          <t>
            A resource server MAY issue both challenges simultaneously. Per RFC 9110
            §11.6.1, a single response MAY include multiple <tt>WWW-Authenticate</tt> header
            fields, each carrying one challenge, when both conditions are present:
          </t>
          <figure anchor="fig-combined-challenge">
            <name>Combined Step-Up and APM Challenge (Two WWW-Authenticate Header Fields)</name>
            <sourcecode><![CDATA[
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",
  error="insufficient_user_authentication",
  acr_values="urn:mace:incommon:iap:silver",
  max_age=300
WWW-Authenticate: Bearer realm="example",
  error="insufficient_authorization_posture",
  error_description="Device posture below minimum threshold"
            ]]></sourcecode>
          </figure>
          <t>
            Clients MUST resolve both challenges before retrying a request that produced
            both errors. The order in which challenges are resolved is client-defined, but
            both MUST be resolved before a new request is made to the protected resource.
          </t>
        </section>

      </section>

    </section>

    <!-- Section 7: Security Considerations -->
    <section anchor="security" numbered="true">
      <name>Security Considerations</name>

      <section anchor="sec-confused-deputy" numbered="true">
        <name>Confused-Deputy Hazard from Partial Operation Under Reduced Scope</name>
        <t>
          When a Scope Reduction or Method Restriction outcome is produced, the client
          continues to hold a valid access token that nominally authorizes a broader set
          of operations. If the client uses this token to perform operations within the
          reduced effective scope at a resource server that does not implement APM, those
          operations will succeed against the nominal token scope, without the posture
          evaluation that an APM-aware resource server would apply.
        </t>
        <t>
          Implementations MUST NOT assume that APM enforcement is applied uniformly across
          all resource servers that accept the same token. Token issuance should scope
          tokens to the specific resource server audience (<tt>aud</tt>) that implements APM
          enforcement for the protected resources in question. Token issuance for
          multiple-audience tokens in APM deployments SHOULD be approached with caution.
        </t>
        <t>
          Clients that receive a Scope Reduction or Method Restriction error from an APM-
          aware resource server SHOULD NOT use the same access token to perform the
          restricted operations against a different, potentially non-APM-aware resource
          server that shares the same audience.
        </t>
      </section>

      <section anchor="sec-posture-replay" numbered="true">
        <name>Replay of Stale Posture Signal</name>
        <t>
          The device-posture signal is integrity-protected but may be replayed by an
          attacker who captures a previously valid signal. Replaying a posture signal
          generated at a time when the device was in a higher-compliance state allows the
          attacker to present an artificially elevated Consistency View.
        </t>
        <t>Mitigations:</t>
        <ol spacing="normal">
          <li>The APM-Posture JWT MUST include a per-request <tt>jti</tt> claim. Resource servers
          and PEPs MUST maintain a short-term cache of seen <tt>jti</tt> values and MUST
          reject posture assertions with <tt>jti</tt> values seen within the freshness window.</li>
          <li>The APM-Posture JWT MUST include an <tt>iat</tt> claim. Resource servers and PEPs
          MUST reject posture assertions whose <tt>iat</tt> is more than the freshness window
          in the past.</li>
          <li>The APM-Posture JWT MUST include an <tt>ath</tt> claim binding the posture assertion
          to the specific access token of the current request. A posture assertion
          generated for one token MUST NOT be accepted when a different token is
          presented.</li>
          <li>The freshness window SHOULD be set to a value compatible with the sensitivity
          of the protected resources. A freshness window of 60 seconds is sufficient for
          many deployments; high-sensitivity resources MAY require shorter windows.</li>
        </ol>
      </section>

      <section anchor="sec-downgrade" numbered="true">
        <name>Downgrade-Forcing Attack</name>
        <t>
          An attacker with the ability to manipulate the device-posture signal in transit
          — or to prevent the device-posture signal from reaching the resource server —
          may attempt to force a lower-posture Consistency View than the actual device
          state. The intent may be to cause a Method Restriction or Full Denial outcome
          that disrupts service (a denial-of-service variant), or to cause the client to
          reveal information about which resources require what posture levels (a
          reconnaissance variant).
        </t>
        <t>Mitigations:</t>
        <ol spacing="normal">
          <li>The device-posture signal MUST be integrity-protected. If the signal is
          absent, the enforcing entity SHOULD treat current posture as unknown and
          apply a conservative outcome class. Implementations that treat an absent
          posture signal as equivalent to a passing posture SHOULD NOT be deployed in
          contexts requiring ZTA-level per-request evaluation.</li>
          <li>Transport of the APM-Posture JWT MUST be protected by TLS (<xref target="RFC8446"/> or
          later). Implementations MUST NOT transmit posture signals over unprotected
          transports.</li>
          <li>The signing key for the APM-Posture JWT SHOULD be managed by a posture
          attestation service separate from the client, so that a compromised client
          cannot forge an elevated posture signal.</li>
        </ol>
      </section>

      <section anchor="sec-side-channel" numbered="true">
        <name>Side-Channel from Per-Request Posture Evaluation</name>
        <t>
          Per-request posture evaluation introduces observable timing and response
          differences between requests that pass and requests that fail. An attacker who
          can make multiple requests and observe the response codes and timing may be able
          to infer information about the target system's posture policy — for example,
          which degradation dimensions trigger which outcome classes.
        </t>
        <t>Implementations SHOULD take care that:</t>
        <ol spacing="normal">
          <li>Error responses do not include more detail than necessary to enable client
          recovery. The <tt>error_description</tt> field SHOULD be informative but SHOULD NOT
          enumerate the specific posture attributes that caused the outcome.</li>
          <li>The timing of posture evaluation SHOULD NOT be correlated with the specific
          posture attributes being compared in a way that enables attribute inference.</li>
          <li>Deployments SHOULD log APM evaluation events for audit purposes but SHOULD
          NOT expose these logs via unauthenticated channels.</li>
        </ol>
      </section>

      <section anchor="sec-introspection" numbered="true">
        <name>Interaction with Token Introspection</name>
        <t>
          When Strategy B (server-side Issuance Posture metadata) is used, the resource
          server queries the authorization server's token introspection endpoint
          (<xref target="RFC7662"/>) to retrieve the Issuance Posture per-request. This introduces a
          network dependency that is not present in the token-claim strategy.
        </t>
        <t>Implementations using the introspection strategy MUST:</t>
        <ol spacing="normal">
          <li>Authenticate to the token introspection endpoint per <xref target="RFC7662"/> §2.1.</li>
          <li>Protect the introspection query with TLS.</li>
          <li>Consider the latency and availability implications of a per-request
          introspection call.</li>
          <li>Cache introspection responses only for durations compatible with the
          required posture freshness; posture-related introspection responses SHOULD
          NOT be cached beyond the APM freshness window.</li>
        </ol>
      </section>

      <section anchor="sec-no-weaken" numbered="true">
        <name>Non-Weakening of RFC 8705 Binding</name>
        <t>
          APM processing MUST NOT weaken the sender-constraint binding provided by
          <xref target="RFC8705"/> or <xref target="RFC9449"/>. Specifically:
        </t>
        <ol spacing="normal">
          <li>APM evaluation begins only after sender-constraint verification succeeds.
          A Scope Reduction or Method Restriction outcome from APM does not exempt the
          request from the requirement to pass <xref target="RFC8705"/> or <xref target="RFC9449"/> verification.</li>
          <li>APM outcome state (e.g., "this token is currently under a Method Restriction
          outcome") MUST NOT be used as a basis for relaxing the sender-constraint
          verification requirement.</li>
          <li>The <tt>cnf</tt> claim in the access token is not modified by APM processing; it
          retains its original value for all subsequent verification steps.</li>
        </ol>
      </section>

      <section anchor="sec-trust-anchor" numbered="true">
        <name>Posture Signal Integrity and Trust Anchors</name>
        <t>
          The security of the APM mechanism depends on the trustworthiness of the posture
          signal. Deployments MUST establish a trust anchor for posture signal signing
          keys that is independent of the client. Possible trust anchors include:
        </t>
        <ul spacing="normal">
          <li>A hardware-rooted attestation mechanism (e.g., TPM, Secure Enclave,
          Android Hardware Attestation) where the signing key is bound to the device
          hardware and cannot be exported.</li>
          <li>A Mobile Device Management platform that signs posture assertions on behalf
          of enrolled devices.</li>
          <li>A remote attestation verifier (in the sense of the IETF RATS architecture,
          <xref target="RFC9334"/>) that vouches for the client's posture independently.</li>
        </ul>
        <t>
          Where no independent trust anchor is available and the client must self-sign
          posture assertions, the enforcing entity SHOULD apply a lower level of trust
          to the resulting Consistency View and SHOULD map unknown or client-self-signed
          posture signals to a more restrictive outcome class.
        </t>
      </section>

    </section>

    <!-- Section 8: IANA Considerations -->
    <section anchor="iana" numbered="true">
      <name>IANA Considerations</name>

      <section anchor="iana-oauth-params" numbered="true">
        <name>OAuth Parameters Registry</name>
        <t>
          This document requests registration of the following entries in the OAuth
          Parameters Registry established by <xref target="RFC6749"/> and maintained by IANA.
        </t>

        <section anchor="iana-apm-posture-param" numbered="true">
          <name>apm_posture</name>
          <dl newline="true" spacing="normal">
            <dt>Parameter name:</dt>
            <dd><tt>apm_posture</tt></dd>

            <dt>Parameter usage location:</dt>
            <dd>access token (JWT claim); token introspection response</dd>

            <dt>Change controller:</dt>
            <dd>IETF</dd>

            <dt>Specification document:</dt>
            <dd>This document, <xref target="fmt-issuance-posture"/></dd>

            <dt>Description:</dt>
            <dd>A JSON object recording the Issuance Posture at the time the access token
            was issued. Used as the baseline for per-request Consistency View evaluation.</dd>
          </dl>
        </section>

      </section>

      <section anchor="iana-error-codes" numbered="true">
        <name>OAuth Extensions Error Registry</name>
        <t>
          This document requests registration of the following error codes in the OAuth
          Extensions Error Registry per <xref target="RFC6749"/> Appendix A.7:
        </t>

        <section anchor="iana-error-scope-reduced" numbered="true">
          <name>apm_scope_reduced</name>
          <dl newline="true" spacing="normal">
            <dt>Error name:</dt>
            <dd><tt>apm_scope_reduced</tt></dd>

            <dt>Error usage location:</dt>
            <dd>Resource access (bearer token error, <xref target="RFC6750"/> §3.1)</dd>

            <dt>Change controller:</dt>
            <dd>IETF</dd>

            <dt>Specification document:</dt>
            <dd>This document, <xref target="fmt-scope-reduction-resp"/></dd>

            <dt>Description:</dt>
            <dd>The request was processed under a reduced effective scope because the
            per-request Consistency View indicated posture degradation below the
            scope-reduction threshold. The <tt>scope</tt> parameter in the <tt>WWW-Authenticate</tt>
            header conveys the reduced effective scope.</dd>
          </dl>
        </section>

        <section anchor="iana-error-method-restricted" numbered="true">
          <name>apm_method_restricted</name>
          <dl newline="true" spacing="normal">
            <dt>Error name:</dt>
            <dd><tt>apm_method_restricted</tt></dd>

            <dt>Error usage location:</dt>
            <dd>Resource access (bearer token error, <xref target="RFC6750"/> §3.1)</dd>

            <dt>Change controller:</dt>
            <dd>IETF</dd>

            <dt>Specification document:</dt>
            <dd>This document, <xref target="fmt-method-restriction-resp"/></dd>

            <dt>Description:</dt>
            <dd>The requested HTTP method is not permitted under the Method Restriction
            outcome produced by per-request Consistency View evaluation. The
            <tt>allowed_methods</tt> parameter in the <tt>WWW-Authenticate</tt> header conveys the set
            of currently permitted methods.</dd>
          </dl>
        </section>

        <section anchor="iana-error-full-denial" numbered="true">
          <name>insufficient_authorization_posture</name>
          <dl newline="true" spacing="normal">
            <dt>Error name:</dt>
            <dd><tt>insufficient_authorization_posture</tt></dd>

            <dt>Error usage location:</dt>
            <dd>Resource access (bearer token error, <xref target="RFC6750"/> §3.1)</dd>

            <dt>Change controller:</dt>
            <dd>IETF</dd>

            <dt>Specification document:</dt>
            <dd>This document, <xref target="fmt-full-denial-resp"/></dd>

            <dt>Description:</dt>
            <dd>The per-request Consistency View indicated posture degradation severe enough
            to warrant full denial of the request. The token remains valid; the client
            SHOULD initiate posture remediation and re-authorization before retrying.</dd>
          </dl>
        </section>

      </section>

      <section anchor="iana-jwt-claims" numbered="true">
        <name>JWT Claims Registry</name>
        <t>
          This document requests registration of the following entries in the JSON Web
          Token Claims Registry established by <xref target="RFC7519"/> §10.1:
        </t>

        <section anchor="iana-jwt-posture-claim" numbered="true">
          <name>apm_posture Claim</name>
          <dl newline="true" spacing="normal">
            <dt>Claim name:</dt>
            <dd><tt>apm_posture</tt></dd>

            <dt>Claim description:</dt>
            <dd>Issuance Posture recorded at token issuance time for use in APM Consistency
            View evaluation.</dd>

            <dt>Change controller:</dt>
            <dd>IETF</dd>

            <dt>Specification document:</dt>
            <dd>This document, <xref target="fmt-issuance-posture"/></dd>
          </dl>
        </section>

      </section>

      <section anchor="iana-pen" numbered="true">
        <name>Experimental OID Arc</name>
        <t>
          The IANA Private Enterprise Number (PEN) arc <tt>1.3.6.1.4.1.65953</tt> is allocated
          to Sanctum SecOps LLC. Extensions, OIDs, or experimental identifiers under this
          arc are for experimental and private use only. Any identifiers under this arc
          MUST NOT be used in IETF-standardized protocols in place of IANA-registered
          identifiers. Permanent IANA assignments for APM-related identifiers are
          requested via the procedures described in this section; TBD placeholders will be
          resolved during IETF processing.
        </t>
      </section>

    </section>

  </middle>

  <back>

    <!-- References -->
    <references>
      <name>References</name>

      <references anchor="refs-normative">
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6749.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6750.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7519.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7518.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7662.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8446.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8705.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9449.xml"/>
      </references>

      <references anchor="refs-informative">
        <name>Informative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7009.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9334.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9396.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9470.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-oauth-attestation-based-client-auth.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-oauth-transaction-tokens.xml"/>

        <reference anchor="NIST.SP.800-207">
          <front>
            <title>Zero Trust Architecture</title>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2020" month="August"/>
          </front>
          <seriesInfo name="NIST Special Publication" value="800-207"/>
          <format type="PDF" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-207.pdf"/>
        </reference>

        <reference anchor="CAEP">
          <front>
            <title>OpenID Continuous Access Evaluation Profile 1.0</title>
            <author>
              <organization>OpenID Foundation</organization>
            </author>
            <date year="2025" month="September"/>
          </front>
          <format type="HTML" target="https://openid.net/specs/openid-caep-specification-1_0.html"/>
        </reference>

        <reference anchor="SHOR1994">
          <front>
            <title>Algorithms for Quantum Computation: Discrete Logarithms and Factoring</title>
            <author initials="P.W." surname="Shor" fullname="Peter W. Shor"/>
            <date year="1994"/>
          </front>
          <seriesInfo name="Proceedings of the 35th Annual Symposium on Foundations of Computer Science" value="pp. 124-134"/>
          <format type="DOI" target="https://doi.org/10.1109/SFCS.1994.365700"/>
        </reference>

        <reference anchor="GROVER1996">
          <front>
            <title>A Fast Quantum Mechanical Algorithm for Database Search</title>
            <author initials="L.K." surname="Grover" fullname="Lov K. Grover"/>
            <date year="1996"/>
          </front>
          <seriesInfo name="Proceedings of the 28th Annual ACM Symposium on Theory of Computing" value="pp. 212-219"/>
          <format type="DOI" target="https://doi.org/10.1145/237814.237866"/>
        </reference>

        <reference anchor="FIPS204">
          <front>
            <title>Module-Lattice-Based Digital Signature Standard</title>
            <author>
              <organization>NIST</organization>
            </author>
            <date year="2024" month="August"/>
          </front>
          <format type="DOI" target="https://doi.org/10.6028/NIST.FIPS.204"/>
        </reference>

      </references>
    </references>

    <!-- Acknowledgements -->
    <section anchor="acknowledgements" numbered="false">
      <name>Acknowledgements</name>
      <t>
        The author thanks the members of the IETF OAuth Working Group for their work on
        the specifications analyzed in this document. The analysis of gap areas builds
        on the normative text of RFC 8705, RFC 9449, RFC 9470, RFC 9396, and the OpenID
        CAEP specification, and the author acknowledges the authors of those documents
        for their foundational contributions.
      </t>
    </section>

    <!-- Appendix A: Gap Summary Table -->
    <section anchor="appendix-gaps" numbered="false">
      <name>Appendix A: Gap Summary Table</name>
      <t>
        The following table summarizes the coverage of APM requirements by existing
        specifications. The symbol "Y" indicates the requirement is addressed
        normatively; "P" indicates partial coverage with identified gaps; "N" indicates
        the requirement is not addressed.
      </t>
      <figure anchor="fig-gap-table">
        <name>APM Requirement Coverage by Existing Specifications</name>
        <artwork type="ascii-art"><![CDATA[
Requirement         | RFC   | RFC   | RFC   | RFC   | RFC   | CAEP  | Attest
                    | 6749  | 8705  | 9449  | 9470  | 9396  |       | Draft
--------------------+-------+-------+-------+-------+-------+-------+-------
REQ-1 Triple        |       |       |       |       |       |       |
Assembly            |  N    |  P    |  P    |  N    |  N    |  N    |  P
--------------------+-------+-------+-------+-------+-------+-------+-------
REQ-2 Issuance      |       |       |       |       |       |       |
Posture Recording   |  N    |  N    |  N    |  N    |  N    |  N    |  P
--------------------+-------+-------+-------+-------+-------+-------+-------
REQ-3 Consistency   |       |       |       |       |       |       |
Evaluation          |  N    |  N    |  N    |  N    |  N    |  N    |  N
--------------------+-------+-------+-------+-------+-------+-------+-------
REQ-4 Graduated     |       |       |       |       |       |       |
Outcomes            |  N    |  N    |  N    |  N    |  N    |  N    |  N
--------------------+-------+-------+-------+-------+-------+-------+-------
REQ-5 Method        |       |       |       |       |       |       |
Restriction         |  N    |  N    |  N    |  N    |  P    |  N    |  N
--------------------+-------+-------+-------+-------+-------+-------+-------
REQ-6 Scope         |       |       |       |       |       |       |
Reduction           |  N    |  N    |  N    |  N    |  P    |  N    |  N
--------------------+-------+-------+-------+-------+-------+-------+-------
REQ-7 Deterministic |       |       |       |       |       |       |
Outcome Mapping     |  N    |  N    |  N    |  N    |  N    |  N    |  N
--------------------+-------+-------+-------+-------+-------+-------+-------
REQ-8 Integrity-    |       |       |       |       |       |       |
Protected Signal    |  N    |  N    |  N    |  N    |  N    |  P    |  Y
--------------------+-------+-------+-------+-------+-------+-------+-------
REQ-9 Backward      |       |       |       |       |       |       |
Compatible          |  -    |  -    |  -    |  -    |  -    |  -    |  -
--------------------+-------+-------+-------+-------+-------+-------+-------
REQ-10 Non-         |       |       |       |       |       |       |
Revocation          |  -    |  -    |  -    |  -    |  -    |  -    |  -

Y = addressed normatively
P = partially addressed with identified gaps
N = not addressed
- = not applicable (requirement specifies APM behavior, not existing spec scope)
        ]]></artwork>
      </figure>
    </section>

    <!-- Appendix B: Relationship to NIST ZTA Model -->
    <section anchor="appendix-zta" numbered="false">
      <name>Appendix B: Relationship to NIST ZTA Model</name>
      <t>
        NIST SP 800-207 <xref target="NIST.SP.800-207"/> defines a three-component decision plane
        consisting of the Policy Engine (PE), Policy Administrator (PA), and Policy
        Enforcement Point (PEP). APM maps to this architecture as follows:
      </t>
      <t>
        The <strong>Policy Enforcement Point</strong> is the resource server or a co-located
        enforcement component. The PEP assembles the Consistency View (REQ-1), applies
        sender-constraint verification, and enforces the graduated outcome produced by
        policy evaluation.
      </t>
      <t>
        The <strong>Policy Engine</strong> consumes the Consistency View and the Issuance Posture and
        produces an outcome class. The PE function may be co-located with the PEP or
        may be a distinct service queried per-request. The PE is responsible for the
        deterministic outcome mapping required by REQ-7.
      </t>
      <t>
        The <strong>Policy Administrator</strong> communicates policy configuration from the
        authorization server to the PEP — for example, conveying the scope-reduction
        policy and the method-restriction policy that the PEP applies when evaluating
        Consistency Views. The PA may also be responsible for recording the Issuance
        Posture at token issuance time (REQ-2).
      </t>
      <t>
        This mapping illustrates that APM does not introduce new architectural roles
        beyond those already defined in <xref target="NIST.SP.800-207"/>; rather, it specifies the
        information flows — specifically, the Consistency View and Issuance Posture —
        that are needed to enable the PE to make the per-request graduated-outcome
        decisions that ZTA requires.
      </t>
    </section>

    <!-- Appendix C: Comparison with Transaction Tokens -->
    <section anchor="appendix-txn-tokens" numbered="false">
      <name>Appendix C: Comparison with Transaction Tokens</name>
      <t>
        Transaction Tokens <xref target="I-D.ietf-oauth-transaction-tokens"/> address a related but
        distinct problem: propagating user identity and authorization context across
        workloads within a trusted domain during processing of a single external request.
        Transaction Tokens are scoped to intra-domain service-mesh use cases and
        explicitly MUST NOT include the access token they were derived from.
      </t>
      <t>
        APM addresses the boundary between the external client and the resource server —
        the initial protected-resource access, not the subsequent intra-domain hops.
        The two mechanisms are complementary: an RS that receives an APM-evaluated
        request may subsequently issue Transaction Tokens for intra-domain workload
        propagation. The graduated outcome produced at the APM boundary informs the
        scope of the Transaction Token(s) issued downstream.
      </t>
      <t>
        Specifically, if the APM evaluation produces a Scope Reduction outcome (e.g.,
        reducing effective scope from <tt>records:read records:write</tt> to <tt>records:read</tt>),
        a Transaction Token Service that derives a Txn-Token from the external access
        token MUST honor the APM reduced scope and MUST NOT issue a Txn-Token whose
        <tt>scope</tt> claim exceeds the APM-reduced effective scope.
      </t>
    </section>

  </back>

</rfc>
