Полный справочник по зарегистрированным клеймам JWT (JSON Web Token), клеймам OpenID Connect, кастомным клеймам, правилам валидации и лучшим практикам безопасности.
| Утверждение | Описание |
|---|---|
iss | Identifies the principal that issued the JWT. Typically the auth server URL. |
sub | Identifies the principal that is the subject of the JWT — usually the user ID. |
aud | Identifies the recipients that the JWT is intended for. The API must check this. |
exp | The time after which the JWT MUST NOT be accepted. Critical for security. |
nbf | The time before which the JWT MUST NOT be accepted. Useful for deferred activation. |
iat | The time at which the JWT was issued. Used to determine the age of the token. |
jti | Unique identifier for the JWT. Prevents token replay attacks when combined with a blocklist. |
| Утверждение | Описание |
|---|---|
name | End-user's full name in displayable form. |
given_name | Given name(s) or first name of the end-user. |
family_name | Surname(s) or last name of the end-user. |
email | End-user's preferred email address. |
email_verified | True if the end-user's email has been verified by the Provider. |
picture | URL of the end-user's profile picture. |
locale | End-user's locale as a BCP 47 language tag. |
zoneinfo | End-user's time zone from the IANA Time Zone Database. |
updated_at | Time the end-user's information was last updated. |
nonce | String value used to associate a Client session with an ID Token and to mitigate replay attacks. |
at_hash | Hash of the Access Token value. Used to validate the access_token. |
auth_time | Time when the end-user was authenticated. |
| Утверждение | Описание |
|---|---|
scope | OAuth 2.0 scopes granted to the token. Defines what resources the token can access. |
roles | Non-standard but widely used. Application roles assigned to the user. |
permissions | Fine-grained permissions. Used by Auth0, AWS Cognito, and others. |
azp | The client_id of the OAuth 2.0 Client that requested the token. Used with OIDC. |
acr | Level of authentication that occurred. Values defined by the deployment. |
amr | How the user was authenticated (password, OTP, biometric, etc.). |
| Утверждение | Описание |
|---|---|
tenant_id | Multi-tenant app custom claim. Identifies the tenant/organization. |
org_id | Organization identifier used by Auth0, WorkOS, and similar platforms. |
plan | User's subscription tier. Common in SaaS billing-based access control. |
| Утверждение | Описание |
|---|---|
Verify exp | Reject any token where exp < current time (in UTC seconds). Add small clock skew (30–60s). |
Verify iss | Must exactly match the expected issuer URL. Reject mismatches. |
Verify aud | Must contain your API's identifier. Reject tokens issued for other audiences. |
Verify signature | NEVER trust a JWT without verifying its cryptographic signature using the correct key/JWKS. |
Check nbf | If nbf is present, reject tokens used before this time. |
Check alg | Explicitly specify expected algorithm. Reject 'none' algorithm. Prefer RS256 or ES256 over HS256 for public APIs. |
| Утверждение | Описание |
|---|---|
HS256 | Fast; uses a single shared secret for sign & verify. Only suitable when both parties are trusted (e.g., server-to-server). |
HS512 | Like HS256 but with 512-bit hash output. Marginally stronger for symmetric use cases. |
RS256 | Most widely supported asymmetric algorithm. Sign with private key, verify with public key. Use this for public APIs and OIDC. |
RS512 | RS256 with SHA-512. Stronger hash but same RSA security level. Marginally slower. |
ES256 | Compact, fast asymmetric algorithm. Smaller keys than RSA for equivalent security. Recommended for new systems. |
PS256 | More secure padding than RS256 (probabilistic). Required by FAPI (Financial-grade API) and advanced OIDC profiles. |
EdDSA | Modern elliptic curve algorithm. Fastest, smallest signatures. Use with jose library. Not universally supported yet. |
JWT состоит из трёх частей в кодировке Base64URL, разделённых точками: Заголовок.Полезная нагрузка.Подпись
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2F1dGguZXhhbXBsZS5jb20iLCJzdWIiOiJ1c2VyXzEyMyIsImF1ZCI6Imh0dHBzOi8vYXBpLmV4YW1wbGUuY29tIiwiZXhwIjoxNzM1Njg5NjAwLCJpYXQiOjE3MzU2MDMyMDAsInNjb3BlIjoicmVhZDp1c2VycyJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
alg: RS256Алгоритм и тип токена
typ: JWTКлеймы — данные
iss: https://auth.example.comКриптографическая верификация
sub: user_123aud: myappexp: 1735689600iat: 1735686000Попробуйте наш Кодировщик/Декодировщик JWT для кодирования/декодирования JWT-токенов
exp (время истечения) — это момент, когда токен истекает, и он не должен приниматься после этого времени. nbf (не раньше) — это момент, когда токен становится действительным, и он не должен приниматься до этого времени. iat (время выдачи) фиксирует, когда токен был выдан — полезно для определения возраста токена. Все три используют формат NumericDate (секунды с Unix epoch).
Access-токены должны быть краткосрочными: 5-60 минут для большинства приложений, 1-24 часа для API. Refresh-токены могут быть длиннее: дни или недели. Короткий срок действия ограничивает ущерб от кражи токена. Никогда не храните конфиденциальные данные в JWT-пейлоадах, так как они закодированы в base64url (не зашифрованы) и могут быть декодированы кем угодно.
sub (субъект) идентифицирует принципал (как правило, ID пользователя), о котором говорится в JWT. Он должен быть уникальным в контексте эмитента. Используйте стабильный, не переназначаемый идентификатор (например, UUID или числовой ID), а не имя пользователя или email, которые могут измениться.
Да, для stateless-авторизации. Включайте роли/разрешения в кастомные клеймы (например, 'roles': ['admin', 'user']). Однако держите токены лёгкими — не включайте всё подряд. Для детализированных разрешений рассмотрите паттерн reference token, где JWT содержит ID сессии, а разрешения запрашиваются на стороне сервера.