JSON Web Token
JSON Web Token (JWT, МФА: [dʒɒt]) це стандарт токена доступу на основі JSON, стандартизованого в RFC 7519. Використовується для верифікації тверджень.
Структура
JWT складається з трьох частин: заголовка, вмісту і підпису.
Заголовок
Заголовок (Header) це JSON елемент, який описує до якого типу токену належить даний і які методи шифрування використовувались.
Поле | Назва | Значення |
---|---|---|
typ | Type | Описує медіатип IANA Medientyp токену. В даному випадку JWT завжди мають медітипapplication/jwt .
|
cty | Content Type | Це поле потрібне, коли JWT вміщає в себе інший JWT. Тоді воно встановлюється в JWT. В інших випадках це поле пропускається. |
alg | Algorithm | Описує використаний алгоритм шифрування. Зазвичай використовують HMAC з SHA-256 (HS256 ) або RSA з SHA-256 (RS256 ). Можна також не використовувати жодного шифрування, вказавши none , але це не рекомендується. Можливі значення вказуються в стандарті JSON Web Encryption (JWE) RFC 7516.
|
Заголовок може наприклад виглядати так:
{
"alg": "HS256",
"typ": "JWT"
}
Вміст
Вміст (Payload) складається з елемента JSON який описує твердження.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Деякі твердженя зарезервовані:
Поле | Назва | Значення |
---|---|---|
iss | Issuer | Той хто видав токен |
sub | Subject | Визначає якого суб'єкта стосуються твердження, тобто щодо кого або чого робляться твердження. |
aud | Audience | Цільова аудиторія токена. |
exp | Expiration Time | Час закінчення терміну дії токена в форматі Unix (кількість секунд що пройшли від 1970-01-01T00:00:00Z ).
|
nbf | Not Before | Час в форматі Unix до настання якого токен не дійсний. |
iat | Issued At | Коли токен був виданий (в форматі Unix) |
jti | JWT ID | Унікальна, чутлива до регістру послідовність символів, яка однозначно ідентифікує токен. Може застосовуватись для запобігання повторному використанню токена. Це можуть бути порядкові числа, GUID або Хеш. |
![]() | Цей розділ потребує доповнення. |
Підпис
![]() | Цей розділ потребує доповнення. |
Кодування
Заголовок вміст і підпис кожен кодуються в Base64 і розділяються в токені крапкою. JWT Token може виглядати так:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzY290Y2guaW8iLCJleHAiOjEzMDA4MTkzdHJ1ZX0.03f329983b86f7d9a9f5fef85305880101d5e302afafa20154d094b229f75773
Передача за допомогою HTTP
JWT передається в заголовках HTTP, зазвичай двома способами:
- в полі Authorization як Bearer-Token:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
- в полі Cookie:
Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Обидва методи мають різні переваги і недоліки:
Bearer-Token | Cookie | |
---|---|---|
Заголовок | Authorization: Bearer <JWT>
|
Cookie: token=<JWT>
|
CORS | Працює з CORS, проте необхідна реалізація на JavaScript. | Кукі зберігаються в браузері лише для конкретного домену, CORS неможливий. |
Зберігання | Можливі всі способи зберігання доступні для JavaScript, як наприклад WebStorage чи Cookie-Store. |
Cookie розміщуються в Cookie-Store. |
Захист від MITM | Наявність TLS повинна перевірятись в JavaScript. | Коли на кукі встановлюється прапорець secure , тоді примусово застосовується TLS.
|
Захист від XSS | Повинен реалізовуватись в JavaScript. | Неявний, якщо для кукі встановлено прапорець HttpOnly , для запобігання доступу через JavaScript]].
|
Захист від CSRF | Неможливий. Необхідні інші заходи. | Повинен реалізовуватись в JavaScript |
Реалізації
Див. також
- Security Assertion Markup Language (SAML)
- Simple Web Token (SWT)
- OAuth та OpenID
Посилання
Зноски
Помилка цитування: Тег <ref>
з назвою "implementations", визначений у <references>
, не використовується в попередньому тексті.
Помилка цитування: Тег <ref>
з назвою "public", визначений у <references>
, не використовується в попередньому тексті.
Помилка цитування: Тег <ref>
з назвою "selfissued", визначений у <references>
, не використовується в попередньому тексті.