Skip to content
Agent Identity

IETF · May 2015

JSON Web Token (JWT)

RFC 7519

M. Jones, J. Bradley, N. Sakimura

RFCStableIdentity + Authn + AuthzFoundationField guide

Every modern agent-auth proposal — AAuth (aa-agent+jwt, aa-auth+jwt), WIMSE WIT, RFC 9068 access tokens, ID-JAG, transaction tokens — is a JWT profile. If you cannot validate iss, aud, typ, and cnf, you cannot implement the landscape.

At a glance

Problem
Parties need a compact, URL-safe way to carry claims between systems, optionally signed or encrypted.
Identity / authn / authz
A container. An ID Token is identity; a JWT access token is authorization; a WIT or AAuth agent token is identity bound to a key. The JWT format does not decide the layer — the profile does.

Actors

  • Issuer
  • Subject
  • Audience / relying party

01

The gap for agents

RFC 7519 is a container: header, claims, optional signature or encryption. It does not decide whether you are looking at identity, authorization, or a workload credential. Agent stacks fail when they treat 'it is a JWT' as a complete protocol.

Every modern agent-auth proposal — AAuth (aa-agent+jwt, aa-auth+jwt), WIMSE WIT (wit+jwt), RFC 9068 access tokens (at+jwt), ID Tokens, ID-JAG, transaction tokens, DPoP proofs — is a JWT profile. If you cannot validate iss, aud, typ, alg, exp, and cnf, you cannot implement the landscape.

02

Actors and trust boundaries

The issuer's signing key is the trust anchor. The audience is who may accept the token. The subject is who the token is about — which might be a user, a client, or a workload, depending on the profile. Never let the presenter choose iss/aud for you.

03

Mechanics

JWS compact serialization is what almost all OAuth/OIDC profiles use. Validate signature against an allow-listed alg (never none, never confuse alg with the payload). Check typ where the profile defines one (RFC 8725). Check exp, nbf, iat, iss, aud as the profile requires. Nested JWTs (JWE, or assertions inside assertions) need explicit policy — see 7523bis work.

iss / sub / audfrom spec
Quoted registered claims. Identity is usually the pair (iss, sub). aud is who may accept the token — client_id for ID Tokens, API for access tokens.
exp / nbf / iatfrom spec
Quoted time window. Agent tokens should be short-lived; clock skew policy is profile-specific (FAPI 2.0 is strict).
typfrom spec
Quoted JOSE header. Profiles use at+jwt, wit+jwt, wpt+jwt, aa-agent+jwt, etc. Unchecked typ is token confusion.
cnffrom spec
Quoted RFC 7800 confirmation. DPoP jkt, mTLS x5t#S256, AAuth/WIMSE jwk. Proof-of-possession lives here.
actfrom spec
Quoted RFC 8693 actor claim for delegation chains. Overbroad act is an agent-specific hazard.

04

Step-by-step flows

Flow 1

Validate a profiled JWT

  1. 1

    Parse compact JWS. Reject unencrypted tokens if the profile required JWE (rare in this cluster).

  2. 2

    Check typ and alg against the profile allow-list.

  3. 3

    Verify signature with keys for that issuer (JWKS, trust anchors — profile says which, and some profiles forbid fetching JWKS from iss alone).

  4. 4

    Check exp/nbf, iss, aud, and profile claims (client_id, cnf, wth, …).

  5. 5

    Only then apply authorization policy.

05

Identity vs authentication vs authorization

A container. An ID Token is identity; a JWT access token is authorization; a WIT or AAuth agent token is identity bound to a key. The profile, not RFC 7519, decides the layer.

06

How it composes

  • JWT access tokens

    RFC 9068 profiles 7519 as typ at+jwt with mandatory aud.

  • OpenID Connect Core

    ID Token is a 7519 JWT with OIDC validation rules (nonce, at_hash, aud=client_id).

  • AAuth

    Multiple typed JWTs (aa-*). typ is load-bearing.

  • WIMSE credentials

    WIT is typ wit+jwt with cnf.jwk; must not be used as bearer.

  • Token Exchange

    Often inputs and outputs JWTs; act is a 7519 claim defined by 8693.

07

What bites agent implementers

  • alg=none and algorithm confusion

    Follow RFC 8725 (and 8725bis in the RFC Editor queue in 2026). Allow-list algorithms.

  • Wrong audience

    Accepting a token because the signature is valid is how MCP servers get calendar tokens. Check aud.

  • Untyped JWTs

    If typ is absent, do not guess. Cross-profile confusion (ID Token as access token, person token as auth token) is the recurring agent bug.

08

Stability — what you can ship

RFC 7519, May 2015. Stable format. Profiles and RFC 8725 JWT BCP are what you actually implement. https://www.rfc-editor.org/rfc/rfc7519.html

Catalog claims (short form)

iss / sub / aud
Issuer, subject, audience. Identity is usually the pair (iss, sub).
exp / nbf / iat
Time window. Agent tokens should be short-lived.
cnf
Confirmation key, used by DPoP, mTLS, AAuth, WIMSE to bind a key.
act
Actor claim from RFC 8693, used for delegation chains.

Implementer notes

Never treat an unprofiled JWT as an access token. Follow RFC 8725 JWT BCP (and the 2026 rfc8725bis work in the RFC Editor queue). Check typ, alg allow-lists, and audience.

Relationship to others

Primary sources

  • RFC 7519https://www.rfc-editor.org/rfc/rfc7519.html