{
  "product": "Specification (reference)",
  "title": "JSON Web Token",
  "summary": "Signed claims in a URL-safe string — and the ways it goes wrong.",
  "category": "formats",
  "entries": [
    {
      "path": [
        "Structure",
        "Three base64url segments joined by dots"
      ],
      "value": "header.payload.signature",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Structure",
        "Header declares alg and typ"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Structure",
        "Payload is a JSON claims set"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Claims",
        "Registered claims"
      ],
      "value": "iss, sub, aud, exp, nbf, iat, jti",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Claims",
        "Custom claims namespaced to avoid collision"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Signing",
        "HMAC with a shared secret"
      ],
      "value": "HS256",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Signing",
        "Asymmetric signatures"
      ],
      "value": "RS256, ES256",
      "status": "yes",
      "note": "verify with the public key"
    },
    {
      "path": [
        "Verification",
        "Signature checked before any claim is read"
      ],
      "value": "",
      "status": "yes",
      "note": "the cardinal rule"
    },
    {
      "path": [
        "Verification",
        "alg is never taken from the token alone"
      ],
      "value": "",
      "status": "yes",
      "note": "reject \"none\" and algorithm confusion"
    },
    {
      "path": [
        "Verification",
        "exp and nbf enforced with a bounded clock skew"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Verification",
        "aud and iss checked against expectation"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Key management",
        "Key rotation via kid and a JWKS endpoint"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Key management",
        "Keys cached with a documented refresh policy"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Operational",
        "Revocation strategy stated"
      ],
      "value": "",
      "status": "yes",
      "note": "short expiry, denylist, or refresh tokens"
    },
    {
      "path": [
        "Operational",
        "Tokens are not used as a session store"
      ],
      "value": "",
      "status": "yes",
      "note": "size and staleness consequences understood"
    }
  ]
}
