Remember the server before the browser returns
01The client retains an issuer and its endpoint mapping before processing a browser-carried response.
Decoded iss exactly matches the saved issuer. This simplified successful example then sends code qa-code-A to the saved token endpoint. Other OAuth checks are assumed satisfied, not replaced by this comparison.
Source for this drawing: RFC 9207 · Read RFC section 1 ↗
New to this? Start hereA quick picture + helpful background
A key is different from permission.
An app, a person, and a server have different roles. Follow who asks, who grants permission, and who checks the credential. A key in the drawing is an analogy, not a literal protocol field.
Helpful first, if these ideas are unfamiliar
These pictures are analogies to help you learn. The linked RFC explains the actual rules.
Terms in this drawing
Related RFCs and changes
“Updates” changes part of an earlier RFC. “Obsoletes” replaces it. This list shows selected related documents.
Check who issued the response before sending a code onward.
- OAuth lets one client use several authorization servers. A mix-up can send a code or token to the wrong recipient; single-server clients are not vulnerable to this particular attack class.
- An issuer identifier names the authorization server. It is not the authorization endpoint, token endpoint, client ID or user identity. Supporting servers MUST provide their issuer identifier to clients.
- RFC 9207 requires comparison to the issuer where the request was sent. Later RFC 9700 §4.4.2 explicitly requires storing that issuer for each request, bound to the user agent, and requires a mix-up defense for clients using two or more servers.
- A matching issuer check permits the flow to continue only alongside its other checks: state, PKCE, callback policy, client authentication and token validation remain distinct.
The picture is one normal authorization-code transaction, not a full OAuth implementation or an attack trace. Later RFC 9700 guidance is labeled separately;RFC 9207 does not formally update RFC 6749 or RFC 9700.
Read the RFC section ↗