🗝️ JWT (JSON Web Tokens): Компактний та самодостатній спосіб безпечної передачі інформації
Що це?
JWT (JSON Web Token) - це стандарт RFC 7519, який визначає компактний, самодостатній та безпечний спосіб передачі інформації між сторонами як об'єкт JSON, підписаний цифровим підписом. Цей підпис може бути виконаний за допомогою секретного ключа (з використанням алгоритму HMAC) або пари ключів (публічний/приватний ключ з використанням RSA або ECDSA).
JWT часто використовуються для аутентифікації (хто користувач?) та авторизації (що користувач може робити?). Завдяки своїй самодостатності, вони можуть містити всю необхідну інформацію про користувача та його права доступу, що зменшує необхідність багаторазових звернень до бази даних.
Структура JWT:
JWT складається з трьох частин, розділених крапками (.):
Header (Заголовок): Містить метадані про токен, такі як тип токена (
alg, algorithm - алгоритм підпису) та тип вмісту (typ, type - зазвичай "JWT"). Заголовок кодується в Base64Url.json{ "alg": "HS256", "typ": "JWT" }Payload (Корисне навантаження): Містить твердження (claims) - інформацію про сутність (зазвичай користувача) та інші дані. Існують три типи тверджень:
- Зареєстровані (Registered Claims): Стандартні, але необов'язкові твердження, такі як:
iss(issuer) - видавець токена.sub(subject) - суб'єкт токена (зазвичай ID користувача).aud(audience) - отримувач токена.exp(expiration time) - час закінчення терміну дії токена (у форматі Unix timestamp).nbf(not before) - час, раніше якого токен не є дійсним.iat(issued at) - час видачі токена.jti(JWT ID) - унікальний ідентифікатор токена.
- Публічні (Public Claims): Твердження, визначені користувачами. Їх слід обирати обережно, щоб уникнути конфліктів імен.
- Приватні (Private Claims): Кастомні твердження, що використовуються для передачі специфічної для програми інформації між сторонами.
Корисне навантаження кодується в Base64Url.
json{ "sub": "1234567890", "name": "John Doe", "admin": true, "iat": 1516239022 }- Зареєстровані (Registered Claims): Стандартні, але необов'язкові твердження, такі як:
Signature (Підпис): Створюється шляхом об'єднання закодованих заголовка та корисного навантаження, їх підписання за допомогою алгоритму, вказаного в заголовку, та секретного ключа (для HMAC) або приватного ключа (для RSA або ECDSA). Підпис використовується для перевірки цілісності токена (чи не був він змінений після видачі) та автентичності (чи був він підписаний довіреною стороною).
Signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)Підпис кодується в Base64Url.
Як це працює (спрощений сценарій аутентифікації):
- Коли користувач успішно аутентифікується на сервері, сервер генерує JWT, що містить інформацію про користувача (наприклад, його ID) та підписує його за допомогою секретного ключа.
- Сервер повертає цей JWT клієнту (зазвичай у заголовку
Authorization: Bearer YOUR_JWTабо у cookie). - Клієнт зберігає JWT та включає його в кожен наступний запит до захищених ресурсів API (зазвичай у заголовку
Authorization: Bearer YOUR_JWT). - Сервер API отримує JWT, перевіряє його підпис за допомогою того самого секретного ключа (або відповідного публічного ключа, якщо використовується асиметричне шифрування).
- Якщо підпис дійсний, сервер вважає користувача автентифікованим та може отримати інформацію про нього з корисного навантаження токена. Сервер також може перевірити твердження, такі як термін дії токена (
exp).
Переваги JWT:
- Компактність: JWT є невеликими за розміром, що робить їх зручними для передачі в HTTP-заголовках або URL.
- Самодостатність: Токен містить всю необхідну інформацію про користувача, що зменшує необхідність звертатися до бази даних для кожного запиту (stateless).
- Безпека: Підпис гарантує цілісність та автентичність токена.
- Масштабованість: Stateless-архітектура спрощує масштабування серверної частини.
- Простота використання: Легко генерувати та перевіряти на різних платформах та мовах програмування завдяки існуючим бібліотекам.
Недоліки JWT:
- Розмір: Хоча й компактні, розмір токена може зростати зі збільшенням кількості тверджень, що може впливати на продуктивність при передачі у заголовках.
- Відкликання: Відкликати JWT може бути складно, оскільки вони самодостатні. Після видачі термін їх дії продовжується до закінчення. Для вирішення цієї проблеми часто використовуються короткий термін дії токенів та/або додаткові механізми відкликання (наприклад, чорні списки токенів на сервері).
- Секретний ключ: Безпека залежить від збереження секретного ключа (для HMAC) або приватного ключа (для асиметричного шифрування) в таємниці.
Використання JWT:
- Аутентифікація: Передача JWT після успішної аутентифікації користувача для подальшої ідентифікації.
- Авторизація: Передача інформації про права доступу користувача в корисне навантаження токена для прийняття рішень щодо авторизації на сервері.
- Передача інформації: Безпечна передача неконфіденційної інформації між сторонами.
Висновок:
JWT є потужним інструментом для реалізації безпечної аутентифікації та авторизації в веб-додатках та API. Їхня самодостатність та можливість перевірки цілісності роблять їх популярним вибором для сучасних розподілених систем. Однак, важливо враховувати їхні обмеження, особливо щодо відкликання, та вживати відповідних заходів безпеки при їх використанні.