JWT: qué es
Tokens, autorización en la API, tokens de actualización, dónde almacenar JWT en el cliente. Guía práctica con ejemplos.
¿Qué es JWT?
JWT (JSON Web Token) — это токен в формате JSON для авторизации. Состоит из трёх частей через точку:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NSIsIm5hbWUiOiJBbGljZSJ9.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
Каждая часть — Base64-кодированный JSON:
- Header — алгоритм и тип токена:
{"alg":"HS256","typ":"JWT"} - Payload — данные (claims):
{"sub":"1234567890","name":"Alice","exp":1516239022} - Signature — HMAC-SHA256(header + "." + payload, secret). Сервер проверяет подпись.
Зачем нужен JWT
Stateless-авторизация: сервер не хранит сессии в памяти, а проверяет подпись токена. Горизонтально масштабируется — любой сервер может проверить токен (если знает secret).
Использование
GET /api/user/profile
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NSJ9.SflKxw...
Algoritmos de firma
- HS256 (HMAC-SHA256) — симметричный, один secret у всех. Простой, но secret нужно передавать всем серверам.
- RS256 (RSA-SHA256) — асимметричный, есть private и public ключи. Сервер подписывает private, проверяет public. Безопаснее для микросервисов.
- ES256 (ECDSA-SHA256) — на эллиптических кривых. Короче, быстрее.
- none — без подписи. НИКОГДА не используйте в продакшене!
OAuth 2.0
OAuth 2.0 — протокол авторизации. Позволяет дать приложению доступ к вашим данным на другом сервисе без передачи пароля.
Сценарий: «Войти через Google»
- Вы нажимаете «Войти через Google» в приложении X.
- Приложение X перенаправляет вас на Google: «Дай мне доступ к email и имени».
- Google спрашивает: «Приложение X хочет знать ваш email. Разрешить?» Вы нажимаете «Да».
- Google перенаправляет вас обратно в приложение X с authorization code.
- Приложение X обменивает code на access token (на сервере, не в браузере).
- Приложение X использует access token для запросов к Google API от вашего имени.
Гранты (flows)
- Authorization Code — для веб-приложений с сервером (самый безопасный).
- Authorization Code + PKCE — для SPA и мобильных приложений.
- Client Credentials — для machine-to-machine (сервер-сервер).
- Password Grant — для доверенных first-party приложений (deprecated в OAuth 2.1).
- Device Code — для устройств без браузера (Smart TV, IoT).
JWT frente a OAuth 2.0
| JWT | OAuth 2.0 |
|---|---|
| Формат токена | Протокол авторизации |
| Что выглядит токен | Как выдать токен |
| Можно без OAuth | Можно с другим форматом |
| Самодостаточен | Описывает process |
Они часто работают вместе: OAuth 2.0 выдаёт JWT в качестве access token. RFC 9068 (JWT Profile for OAuth 2.0) стандартизирует это.
Token de acceso versus token de actualización
| Access Token | Refresh Token |
|---|---|
| Короткоживущий (5-60 мин) | Долгоживущий (дни-месяцы) |
| Используется для запросов | Только для обмена на новый access |
| Хранится в памяти / httpOnly cookie | Хранится в httpOnly cookie / secure storage |
| Можно отозвать сразу (если access token в deny-list) | Можно отозвать — истекут все access tokens пользователя |
Без refresh token: пользователь логинится каждый час. С refresh token — раз в месяц.
Dónde almacenar JWT en el cliente
| Место | Seguridad | Удобство |
|---|---|---|
| localStorage | ❌ Уязвимо к XSS | Просто |
| sessionStorage | ❌ Уязвимо к XSS | Средне |
| httpOnly cookie | ✅ Защищено от JS, ⚠️ CSRF | Просто |
| В памяти (React state) | ✅ Защищено от XSS | Теряется при F5 |
| Service Worker | ✅ Хорошо | Сложно |
Оптимально: access token в памяти, refresh token в httpOnly cookie. Или: оба в httpOnly cookie с SameSite=Strict + CSRF-токен.
Vulnerabilidades típicas
- JWT в localStorage + XSS = угон аккаунта. Атакующий через XSS вставляет <script> и ворует localStorage.
- alg=none в JWT. Некоторые библиотеки принимали токены без подписи. Уже редко, но проверяйте.
- Не ротация refresh tokens. Если украли один refresh, можно жить с ним месяцы. Ротируйте: каждый refresh выдаёт новый refresh.
- Long-lived access tokens. Если access на месяц — не отзовёшь при компрометации. Короткие (5-15 мин) + refresh = безопаснее.
FAQ
Что такое JWT? JWT (JSON Web Token) — это токен в формате JSON, используемый для авторизации в API. Выглядит как три блока через точки: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NSJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c. Внутри — header (алгоритм), payload (данные о пользователе), signature (подпись). Используется для stateless-авторизации: сервер не хранит сессии, а проверяет подпись токена.
Что такое OAuth 2.0? OAuth 2.0 — это протокол авторизации, позволяющий дать третьему приложению доступ к вашим данным на другом сервисе без передачи пароля. Например: «Разрешить приложению Todoist читать мои задачи в Google Calendar». Не передаёт пароль — выдаёт временный токен. Используется для: входа через Google/Apple/Facebook, доступа приложений к API, делегирования прав.
Чем отличается JWT от OAuth 2.0? JWT — это формат токена (как выглядит). OAuth 2.0 — это протокол авторизации (как выдать токен). Они часто используются вместе: OAuth 2.0 авторизует, JWT — формат access token. Можно использовать JWT без OAuth (просто выдавать токены при логине). Можно использовать OAuth с другими форматами токенов (random opaque strings).
Что такое refresh token? Refresh token — это долгоживущий токен (дни, недели, месяцы), который используется для получения нового access token без повторного логина. Access token короткоживущий (5-60 минут) для безопасности. Когда access token истекает — клиент отправляет refresh token на /token endpoint и получает новую пару. Если refresh token украли — можно отозвать все access tokens пользователя.
Где хранить JWT на клиенте? НЕ в localStorage (уязвимо к XSS). Лучшие варианты: 1) httpOnly cookie — защищён от XSS, но уязвим к CSRF (нужна CSRF-защита). 2) В памяти приложения (React/Vue state) — безопасно от XSS, но теряется при перезагрузке. 3) Service Worker / Web Worker. Оптимально: access token в памяти, refresh token в httpOnly cookie.
Что такое Bearer token? Bearer token — это тип токена авторизации в HTTP. В заголовке Authorization: 'Bearer eyJhbGciOi...'. Любой, кто знает токен, может им воспользоваться. Стандарт RFC 6750. Используется в OAuth 2.0, JWT, простых API-ключах. Защита: HTTPS, хранение в безопасном месте, ротация.
👉 API документация → — примеры использования токенов в нашем API.