Safeguard
Security Guides•

What are pushed authorization requests (PAR) and when do you need them?

PAR lets an OAuth client send its authorization request straight to the server, not through browser URLs. What it protects, who needs it, and how it works.

Safeguard Security Team
4 min read

Pushed authorization requests (PAR, RFC 9126) let an OAuth client send the details of its authorization request directly to the authorization server over a back channel, and get back a short reference to use in the browser redirect. It protects request integrity and confidentiality, which matters for payments and regulated data.

The problem it fixes

In a normal OAuth flow the app sends the user to the authorization endpoint with parameters in the URL query string. RFC 9126 lists three weaknesses of that approach:

  • There is no cryptographic integrity or authenticity protection. An attacker could change the requested scope, or swap the context of a payment, by editing parameters.
  • There is no confidentiality for the parameters. They pass through the user agent in the clear and can leak into web server logs and, through the referrer, to other sites. That is significant when personal or regulated data is in the request, as in identity and open banking.
  • Request URLs can grow large when fine grained authorization data is needed, which can cause processing errors.

How PAR works

  1. The client sends a POST to the authorization server's PAR endpoint with the same parameters it would have put in the URL, plus its client authentication.
  2. The server validates the request and the client before any user interaction.
  3. The server returns a request_uri, a reference to the stored request, and an expires_in value. RFC 9126's examples show lifetimes of 60 and 90 seconds.
  4. The client redirects the user to the authorization endpoint with only the client ID and the request_uri.
  5. The server looks up the stored request and continues the flow as usual.

The sensitive details never travel through the browser or its history.

Why mobile and partner apps care

RFC 9126 points out that sending the request as a POST through the user agent is hard for installed mobile apps. Per RFC 8252, those apps open the authorization request URL in the system browser using platform APIs, which means the initial request is a GET carrying everything in the URL. PAR gives them a way to keep the details out of that URL.

Another benefit is early client authentication. The server can authenticate the client before any user interaction and refuse spoofed or tampered requests early.

When PAR is worth it

SituationPAR useful?
Payments, open banking or other high value flowsYes, request tampering has real cost
Requests carrying personal data or fine grained authorization detailsYes, keeps them out of URLs and logs
Very long authorization requestsYes, avoids URL length limits
Simple sign in with a few standard scopesOptional
Client that cannot authenticate to the serverLimited benefit

PAR complements other mechanisms. PKCE still protects the code exchange, and JWT secured authorization requests can be combined with PAR if you need signed requests and non repudiation.

What to check before you adopt it

  1. Does your authorization server support a PAR endpoint, and can it require PAR for specific clients?
  2. Can your client library push requests and use request_uri?
  3. Do you log PAR request bodies anywhere? They carry the same data you were trying to keep out of URLs.
  4. Is the request_uri single use and short lived on your server? It should be, since it references a stored request.
  5. Have you updated redirect URI validation and the other checks in your OAuth threat model?

Safeguard's asset discovery helps you find API hosts and versions you may have lost track of, and its SBOM and dependency scanning shows which libraries ship in your builds. You can start with the free scan at gold.safeguard.sh/scan.

Quick check

Does PAR replace PKCE?

No. PAR protects the authorization request. PKCE protects the authorization code from interception. Many deployments use both.

Is the request_uri a secret?

Treat it as a short lived, single use reference. It is sent through the browser, so it should not be reusable by anyone who sees it.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.