Що таке JSON Web Token?
A JSON Web Token (JWT) — це компактний, безпечний для URL конверт для невеликого навантаження тверджень. Це стандартний формат облікових даних для безсесійних веб-сесій, ID-токенів OAuth/OIDC, автентифікації API між машинами та підписаних magic link. JWT завжди складається з трьох base64url-сегментів, з'єднаних крапками: header.payload.signature. Заголовок та навантаження є JSON; підпис — це бінарний MAC або цифровий підпис над першими двома сегментами.
Як працюють JWT?
Коли цей інструмент декодує токен, він виконує ті самі три кроки, що й будь-яка бібліотека JWT:
- Розділити токен по крапках на рівно три непорожніх сегменти. Будь-яка інша форма є некоректною.
- Base64url-декодувати сегменти 0 і 1, потім
JSON.parseкожен. Заголовок містить алгоритм (alg) та тип токена (typ). Навантаження містить твердження (sub,exp,iat, користувацькі ключі). - Якщо надано секрет, перерахувати MAC над
<segment0>.<segment1>за алгоритмом у заголовку. Порівняти байти з третім сегментом. - Відобразити результат верифікації поряд з декодованими твердженнями, включаючи зручний для читання індикатор терміну дії, обчислений з твердження
exp.
Чому декодувати JWT у браузері?
Вставка реального, активно використовуваного JWT у сторонній відладчик передає облікові дані у логи цього сервісу, стек спостережуваності та будь-якому партнеру, якому сервіс передає дані. Навіть коли стороння сторона стверджує, що не логує токени, у вас немає способу це перевірити. Цей інструмент був створений, щоб вам ніколи не доводилося йти на такий компроміс:
- Нуль мережі: рантайм не має викликів
fetch,XMLHttpRequestабоsendBeacon. Відкрийте DevTools під час декодування та верифікації — панель Network залишиться мовчазною. - Нативний Web Crypto: верифікація HMAC використовує
crypto.subtle.importKeyтаcrypto.subtle.sign, ті самі примітиви, що викликає ваш рантайм. - Статичне розгортання: кожна сторінка є єдиним статичним HTML-файлом без серверного ендпоінту для компрометації. Немає токена для витоку, бо немає сервера, якому витікати.
Що верифікує цей інструмент, а що ні?
Версія 1 цього інструменту верифікує лише підписи сімейства HMAC-SHA. Конкретно:
- Підтримується: HS256, HS384, HS512. Надайте спільний секрет, і інструмент перерахує та порівняє MAC.
- Ще не підтримується: RS256/384/512 (RSA), ES256/384/512 (ECDSA), EdDSA та PS256/384/512 (RSA-PSS). Вони потребують відкритого ключа у форматі PEM або JWK і навмисно відкладені до наступного релізу.
- Відмовлено:
alg: "none". Інструмент декодує токен, але явно позначає його як небезпечний — валідації підпису не відбувається, і будь-яка виробнича система, що приймає такий токен, має серйозну вразливість.
Як виглядає приклад декодування JWT?
Вставте канонічний приклад токена RFC 7519 у поле введення вище:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Заголовок декодується у {"alg":"HS256","typ":"JWT"}, а навантаження у {"sub":"1234567890","name":"John Doe","iat":1516239022}. Введіть your-256-bit-secret у панелі верифікації — перевірка підпису поверне «дійсний». Змініть будь-який символ секрету — і повернеться «недійсний». Нічого з цього не залишає ваш браузер.
Це JWT-декодер, який нам хотілося мати, коли потрібно було налагодити токен у продакшні: з повагою до конфіденційності, швидкий і побудований на тих самих примітивах, що використовує рантайм.