Что такое JWT (JSON Web Token)?
JSON Web Token (JWT) – это открытый стандарт (RFC 7519) для безопасной передачи информации между сторонами в виде объекта JSON.
Он компактен, доступен для чтения и подписан цифровой подписью с использованием закрытого ключа или пары открытых ключей провайдера идентификации (IdP). Таким образом, целостность и подлинность токена может быть проверена другими сторонами.
Цель использования JWT заключается не в сокрытии данных, а в обеспечении их подлинности. JWT подписывается и кодируется, а не шифруется.
JWT – это механизм безэталонной аутентификации на основе маркера. Поскольку это безэталонная сессия на стороне клиента, серверу не нужно полностью полагаться на хранилище данных (базу данных) для сохранения информации о сессии.
Структура JWT
JSON Web Token состоит из 3 частей, разделенных точкой.
header.payload.signature
Заголовок
Заголовок JWT состоит из типа токена и алгоритма, используемого для подписания и кодирования.
Алгоритмы могут быть HMAC, SHA256, RSA, HS256 или RS256.
{
"typ": "JWT",
"alg": "HS256"
}
Полезная нагрузка
Полезная нагрузка состоит из данных сессии, называемых утверждениями.
Ниже приведены некоторые из стандартных утверждений, которые мы можем использовать,
- Эмитент (iss)
- Субъект (sub)
- Аудитория (aud)
- Время действия (exp)
- Выдано в (iat)
{
"sub": "user10001",
"iat": 1569302116
}
Пользовательские требования также могут быть включены.
При использовании пользовательских наборов требований,
- Не помещайте в наборы формул большие данные. Наборы утверждений должны быть компактными.
- Не размещайте конфиденциальную информацию, так как JWT может быть легко декодирован.
{
"sub": "user10001",
"iat": 1569302116,
"role": "admin",
"user_id": "user10001"
}
Подпись
Подпись является наиболее важной частью JSON Web Token (JWT).
Подпись вычисляется путем кодирования заголовка и полезной нагрузки с помощью кодировки Base64url и объединения их с разделителем точка.
Затем они передаются криптографическому алгоритму.
// signature algorithm
data = base64urlEncode( header ) + "." + base64urlEncode( payload )
signature = HMAC-SHA256( data, secret_salt )
Поэтому при изменении заголовка или полезной нагрузки подпись должна быть рассчитана заново.
Только поставщик идентификационных данных (IdP) имеет закрытый ключ для вычисления подписи, что предотвращает подделку токена.
Как это работает?
В основном провайдер идентификации (IdP) генерирует JWT, удостоверяющий личность пользователя, а сервер ресурсов декодирует и проверяет подлинность токена, используя секретную соль / открытый ключ.
JWT
- Пользователь входит в систему, используя имя пользователя и пароль или google/facebook.
- Сервер аутентификации проверяет учетные данные и выдает JWT, подписанный либо секретной солью, либо закрытым ключом.
- Клиент пользователя использует JWT для доступа к защищенным ресурсам, передавая JWT в заголовке HTTP Authorization.
- Затем сервер ресурсов проверяет подлинность маркера с помощью секретной соли/ открытого ключа.
Безопасность
Как и любой другой механизм аутентификации, JWT также имеет свои плюсы и минусы.
- Необходимо использовать HTTPS для защиты заголовков авторизации.
- Проверяйте имя алгоритма в явном виде. Не стоит полностью полагаться на алгоритм, указанный в заголовке JWT. Существует несколько известных атак на основе заголовка, таких как атака “algo none”, зачистка заголовка.
- Отозвать сессию пользователя с внутреннего сервера довольно сложно. Поскольку срок действия JWT автоматически истекает, если злоумышленник получит токен до истечения срока его действия, это приведет к различным эксплойтам. Создание списка отзыва токенов на вашем сервере для аннулирования токенов может быть лучшим способом защиты.
- Если JWT сохраняется в cookies, необходимо создать HttpOnly cookie. Это ограничит сторонние javascript’ы от чтения jwt-токена из cookie.
- XSS – бэкенд-серверы должны всегда санировать генерируемые пользователем данные.
- CSRF – если JWT хранится в куках, возможны атаки CSRF. Мы можем смягчить CSRF, используя происхождение запроса и специальные заголовки запроса.
Для чего нужна подпись и что она вообще делает, как устроена, – не объяснено. Дизлайк вам !