
- ID tokens tell your client app who logged in.
- Bearers authorize calls to resource APIs.
- Sending identity proofs to APIs causes security bugs.
Understanding the OAuth2 access token vs ID token divide
OAuth 2.0 access tokens grant client applications authorization to invoke protected resource APIs, whereas OpenID Connect ID tokens assert user authentication and identity attributes exclusively to the client application. Modern sign-in flows return two separate artifacts to developers. Yet engineers often mix up their network destinations. An identity proof belongs strictly inside the frontend client. In contrast, an authorization bearer grants permission to invoke protected remote endpoints. Using the wrong item breaks system security.
OAuth 2.0 covers delegated permissions across services. OpenID Connect adds a distinct layer of user identity on top of standard token flows. Each layer has its own job. Clients inspect records. Servers verify authorization keys on incoming calls.
Core purposes and intended token consumers
Every credential has a target recipient known as its audience. The ID token belongs to the client app. It proves a person signed in. The frontend reads user details like names or emails from it. It never forwards this proof to outside endpoints.
The authorization bearer targets the resource server. When your client calls an API, it puts this key in the HTTP header. The API checks permissions and expiration times. Unlike identity proofs, these keys convey authority rather than user profiles.
Token structure and payload differences
Data formats match their architectural roles. OpenID Connect requires identity proofs to be signed JSON Web Tokens. They carry claims defined by the OpenID standard. These list the issuer, subject, client audience, issue time, and expiration.
OAuth 2.0 does not force a single format for bearer keys. Architectural needs dictate structure. They can be simple random strings kept in a database. Many clouds also use JSON Web Tokens under RFC 9068. These keys include target API audiences and granted scopes.
// OpenID Connect ID Token Payload
{
"iss": "https://auth.example.com/",
"sub": "usr_94820147",
"aud": "client_app_web_123",
"exp": 1793184000,
"iat": 1793180400,
"name": "Alex Mercer",
"email": "alex@example.com"
}
Notice the audience matches the frontend client ID. Now check the RFC 9068 bearer payload below.
// RFC 9068 JWT Profile Bearer Payload
{
"iss": "https://auth.example.com/",
"sub": "usr_94820147",
"aud": "https://api.example.com/v1/",
"client_id": "client_app_web_123",
"exp": 1793181300,
"iat": 1793180400,
"scope": "read:reports write:orders"
}
The bearer key audience points straight to the API route. It holds permission scopes instead of personal profile data. This structure keeps security boundaries clean.
Comparing access tokens and ID tokens
Engineers must separate user identity from API permissions. The table below compares both credentials in production stacks.
| Attribute | OAuth2 Access Token | OpenID Connect ID Token |
|---|---|---|
| Primary Standard | RFC 6749 and RFC 9068 | OpenID Connect Core 1.0 |
| Intended Consumer | Resource server (API endpoint) | Client application (Frontend UI) |
| Mandatory Format | Opaque string or signed JWT | Signed JWT (JSON Web Signature) |
| Typical Lifetime | Configurable; short-lived per authorization server policy | Short-lived; verified at authentication time |
| Audience (aud) Claim | Target API resource identifier | Client application client_id |
| Primary Contents | Scopes and API permissions | User identity and authentication event |
| Transport Location | HTTP Authorization: Bearer header | Internal frontend session state |
Why passing ID tokens to APIs creates security risks
Sending an identity proof to an API causes serious risks. The biggest danger is audience confusion. If an API accepts an ID token, any client app could reuse it. A bad actor could build a rogue app and collect user proofs. Then they could replay them against your API.
Also, identity proofs lack permission scopes. An API cannot tell read calls from write calls with them. Scope controls restrict actions. It only knows who signed in, not what they can do. Strong security requires scopes found only in valid bearer keys. Review OAuth2 vs SAML authentication to see how modern protocols isolate delegation from identity. Also explore Basic Auth vs Bearer token headers for API transport patterns.
Validation rules and implementation checklist
Every service must verify its incoming credentials. To validate identity proofs, the client checks cryptographic signatures against identity provider keys. Check audience tags. Match them directly to your local client identifier. Verify issuers. Check expiration clocks carefully. APIs verifying bearer keys must match the audience to their own address. Signatures ensure token integrity across distributed services. When using JSON keys, verify signatures with public keys. Learn more about signing keys in our RS256 vs PS256 guide. Resource servers inspect tokens to confirm expiration and required scopes. Always reject keys if the audience claim does not match your service.
Frequently asked questions about OAuth2 tokens
Can an application send an ID token to a backend API?
Never send an ID token downstream to a backend service because the audience claim targets your frontend client app rather than remote API scopes.
Are OAuth2 access tokens required to be JWTs?
No. RFC 6749 allows opaque strings or structured JWTs.
Who is the intended consumer of an ID token?
The client app alone consumes it to verify user sign-in.
Sources and technical documentation
- OAuth.net ID Tokens vs Access Tokens Guide: Foundational overview of consumers and security boundaries.
- RFC 9068: JWT Profile for OAuth 2.0 Access Tokens: IETF standard defining JWT access claims and validation rules.
- OpenID Connect Core 1.0 Specification: Official standard defining ID structure, claims, and rules.