iat (Issued At) Claim in a JWT
iat is the moment the token was issued, in seconds since the Unix epoch. It does not limit validity by itself; it is the reference point for how old a token is and for the lifetime the issuer intended.
At a glance
- Claim
- iat (Issued At)
- Defined in
- RFC 7519 section 4.1.6
- Value type
- NumericDate: seconds since 1970-01-01T00:00:00Z
- Required
- Optional in RFC 7519. Required in an OpenID Connect ID token and an RFC 9068 access token.
- Sample value
- 1735689600, which is 2025-01-01 00:00:00 UTC
- In the decoder
- Explained by name as Issued At, rendered as local time, and used to compute the token's age and its lifetime.
In detail
iat states when the issuer built the token, using the same NumericDate seconds count as exp and nbf. On its own it grants and denies nothing: a verifier that reads iat and no exp has learned the token's age and still has no rule about when to stop accepting it. Its value is as a reference point that other rules are written against.
Two rules commonly lean on it. An application can impose a maximum acceptable age independently of the issuer's own exp, which is useful when a service wants tighter freshness than the identity provider offers. And when a re-authentication was requested with max_age, the relying party compares auth_time rather than iat, because iat only says when this token was minted, which may be long after the person actually typed a password.
Because the issuer writes iat from its own clock, a value in the future means the two clocks disagree rather than that anything malicious happened, at least usually. Verifiers therefore treat a slightly future iat as tolerable and a wildly future one as a defect. Any check written against iat needs the same leeway that exp checks need, for the same reason.
The decoder converts iat to a readable local timestamp, derives the token's age from it, and derives the intended lifetime from the gap between iat and exp, which feeds the lifetime progress bar. Its validation list warns when iat is more than sixty seconds in the future, and raises an error when exp is less than or equal to iat, since a token cannot expire before it existed.
Examples
{
"iat": 1735689600,
"exp": 1735776000
}Lifetime is exp minus iat, here 86400 seconds. Age is now minus iat, which changes every second.
Things that catch people out
- Using iat as an expiry. A token with iat and no exp never expires, no matter how old the issue time looks.
- Deriving age from iat on a machine whose clock is ahead of the issuer's. The token then appears to come from the future, which the decoder flags once the gap passes sixty seconds.
- Copying an old iat into a reissued token. The age check downstream then rejects a token that was minted seconds ago.
Try it: JWT Decoder
Paste a token to decode the header and payload, read the claims and expiry, and verify the signature in your browser. Nothing is uploaded.
JWT Decoder
LOCAL · Browser-OnlyDecode and inspect JSON Web Tokens without sending them to a server
Related JWT claims and algorithms
All jwt claims and algorithms →exp (Expiration Time) Claim in a JWT
The exp claim sets when a JWT stops being accepted. NumericDate format, clock skew allowances, and the four expiry states the decoder shows.
nbf (Not Before) Claim in a JWT
The nbf claim marks the earliest time a JWT may be accepted. When a not before time is worth setting, and how the decoder flags a future one.
auth_time Claim in an OpenID Connect ID Token
The auth_time claim records when the end user actually authenticated, not when the token was issued. How max_age uses it and how the decoder shows it.
jti (JWT ID) Claim in a JWT
The jti claim gives a JWT a unique identifier. How it supports replay detection and denylists, what it costs to store, and how the decoder shows it.
azp (Authorized Party) Claim in a JWT
The azp claim names the client an ID token was issued to. When OpenID Connect requires it, how it differs from aud, and what the decoder shows.
nonce Claim in an OpenID Connect ID Token
The nonce claim binds an ID token to one authentication request. How the value round trips, why it must be compared, and how the decoder shows it.
Tools for this
- JWT Decoder Free online JWT decoder - decode and inspect JSON Web Tokens without sending them to a server
- Timestamp Converter Free online timestamp converter - convert between Unix timestamps and human-readable dates instantly