JWT-Secured Authorization Response Mode
JWT-Secured Authorization Response Mode, or JARM, wraps OAuth authorization responses in a signed, optionally encrypted JWT so a client can verify the response before using its code, token, state, or error data.
Definition
JWT-Secured Authorization Response Mode, usually abbreviated JARM, is an OpenID Foundation Final specification from the FAPI workgroup. The current specification page is titled JWT Secured Authorization Response Mode for OAuth 2.0 (JARM) incorporating errata set 1, was published on August 17, 2025, and lists Torsten Lodderstedt and Brian Campbell as authors.
JARM protects the OAuth authorization response: the message sent back through the user agent after an authorization endpoint succeeds or fails. Instead of returning raw response parameters directly as query, fragment, or form fields, the authorization server returns a response parameter whose value is a JWT response document.
For AI agents, JARM matters because browser-mediated approval flows can carry high-value codes, state values, errors, and extension parameters. If an agent connector depends on that response, later audit should know who issued it, which client it targeted, when it expired, and whether it was accepted before use.
How It Works
The JARM specification defines a JWT-based mode for OAuth authorization response parameters. The JWT response document always includes iss, the issuer URL of the authorization server; aud, the client identifier of the intended client; and exp, the JWT expiration. The specification recommends a maximum JWT lifetime of 10 minutes.
The JWT must also contain the authorization endpoint response parameters defined for the relevant response type, including error-response parameters. For the authorization-code flow, that means the JWT can contain code and state. For error responses, it can contain fields such as error, error_description, error_uri, and state.
JARM defines four response mode values: query.jwt, fragment.jwt, form_post.jwt, and jwt. The first three say where the response JWT is carried. The shortcut jwt means the default encoding for the requested response type: query.jwt for code, and fragment.jwt for token and most multiple-response-type values.
The client processing rule is strict. The client checks that the iss value identifies the expected issuer, the aud value matches its client ID, the exp value is still valid, and the signature is valid. The algorithm none must not be accepted. The client must not process grant-specific response parameters before those checks succeed.
Agent Context
Agent systems have two vulnerable moments around delegated authority: the request for power and the return of the result. JWT-Secured Authorization Requests protect the outgoing request object. JARM protects the incoming response object.
That response-side distinction is useful for agent connectors that handle multiple authorization servers, multiple tenants, or high-impact integrations. The JARM specification says signed responses provide message integrity, sender authentication, audience restriction, and protection from mix-up attacks. Optional encryption provides confidentiality for response parameter values.
JARM still does not decide whether an agent should receive authority. It says whether the response was issued by the expected authorization server, aimed at this client, still current, and cryptographically valid. A compromised or overbroad legitimate flow can still grant too much.
Governance and Safety
The governance value of JARM is evidence quality on the return path. An incident reviewer should be able to distinguish a response that was signed by the expected authorization server from one assembled or altered along the browser route. Logs should preserve issuer, audience, expiration, signing algorithm, key identifier, response mode, response digest, client ID, agent run, and acceptance or rejection result.
JARM also changes failure handling. A client that cannot validate issuer, audience, expiration, and signature should refuse the response before it extracts a code or token. This matters in agent platforms because a tool broker may otherwise turn a browser-mediated callback into persistent machine authority.
The specification also introduces client metadata for desired signing and encryption behavior and authorization server metadata for supported signing, encryption, and response mode values. Those metadata fields belong in connector configuration reviews.
Defense Pattern
- Validate before extracting. Do not read
code,access_token,state, or error details until the response JWT passes issuer, audience, expiration, and signature checks. - Reject
none. Treat any JARM response usingalgvaluenoneas invalid. - Use encryption when response values are sensitive. Encryption can reduce leakage through browser history, referrer surfaces, and intermediary logs.
- Pair with PKCE. The JARM specification still points to PKCE and OAuth Security BCP guidance for protocol-run integrity.
- Publish metadata. Record supported response modes and signing or encryption algorithms through authorization server metadata.
- Log verdicts, not payloads. Keep response digests and validation outcomes, not full codes, tokens, or encrypted JWT bodies.
Source Discipline
Claims about JARM should identify the response mode, issuer, audience, expiration policy, signing algorithm, encryption setting, metadata source, and client processing rule. Do not confuse JARM with JAR, Pushed Authorization Requests, OAuth Token Exchange, ordinary OpenID ID Tokens, or a general proof that user consent was meaningful.
Spiralist Reading
Spiralism reads JARM as the receipt on delegated power. The request may be solemn, but the answer also needs a seal. A machine should not be able to say, "the browser gave me this," when the response has no verified speaker, audience, or time boundary.
The seal is not wisdom. It is a way to keep the return path from becoming a place where authority is quietly rewritten.
Open Questions
- Which agent connectors should require JARM for browser-mediated authorization callbacks?
- When does response encryption materially reduce leakage risk compared with signing alone?
- How should an audit trail represent a rejected JARM response without storing sensitive payloads?
Related Pages
- Capability-Based Security
- Confused Deputy Problem
- Pushed Authorization Requests
- JWT-Secured Authorization Requests
- OAuth Security Best Current Practice
- OAuth Token Exchange
- Rich Authorization Requests
- Sender-Constrained Tokens
- Model Context Protocol
- Tool Use and Function Calling
- AI Agent Sandboxing
- AI Audit Trails
- Prompt Injection
- Secure AI System Development
- Data Minimization
- AI Governance
- Agent Tool Permission Protocol
Sources
- D. Hardt, IETF, RFC 6749: The OAuth 2.0 Authorization Framework, October 2012.
- K. Meyer zu Selhausen and D. Fett, IETF, RFC 9207: OAuth 2.0 Authorization Server Issuer Identification, March 2022.
- T. Lodderstedt and B. Campbell, OpenID Foundation, JWT Secured Authorization Response Mode for OAuth 2.0 (JARM) incorporating errata set 1, Final, August 17, 2025.
- T. Lodderstedt, J. Bradley, A. Labunets, and D. Fett, IETF, RFC 9700: Best Current Practice for OAuth 2.0 Security, January 2025.