JWT
JWT - строка в формате header.payload.signature
.
Используется для защиты данных от неавторизованного доступа.
Header
Header - JSON объект формата:
{
"alg": "HS256", // алгоритм хеширования для создания signature
"typ": "JWT"
}
HS256 - симметричный алгоритм шифрования, вместо него может использоваться ассиметричный RS256
Payload
Payload - JSON объект произвольного формата.
Payload, как и Header, не подвергается шифрованию, поэтому не стоит хранить в нем чувствительные данные.
Signature
Подпись вычисляется как хэш объявленного в header
алгоритма от объединенных
через точку header
и payload
в кодировке base64, а также secret
.
const headerB64 = base64(header)
const payloadB64 = base64(payload)
const signature = HS256(`${headerB64}.${payloadB64}`, secret)
Token
const jwt = `${headerB64}.${payloadB64}.${signature}`
Использование
Сервис авторизации после получения авторизационный данных генерирует jwt токен,
с которым далее клиент производит запрос в сервису приложения.
Сервис приложения, получив токен от клиента и secret
от сервиса авторизации, проверяет подпись
и, если она совпадает, считает данный запрос авторизованным.
Access и Refresh
В современной схеме сервер авторизации отдает клиенту два токена access
- jwt и refresh
- произвольного формата.
refresh
токен имеет продолжительное время жизни (от нескольких часов до нескольких лет)
может содержать цифровой отпечаток клиента, который проверяется при использовании токена.
При попытке обмена токена более одного раза, либо при несовпадении цифрового отпечатка,
и новый и старый токены попадают в blacklist, текущая сессия отзывается и клиенту предлагается
заново пройти просесс аутентификации.
Нигде, кроме как во взаимодействии между клиентом и сервером авторизации refresh
не используется.
Рефреш токен должен храниться в http only cookie.
access
токен короткоживущий (обычно не боллее 15 мин).
Короткое время жизни обусловлено невозможностью отзыва и проверки на скомпроментированность.
Время жизни токена может предоставляться в payload поле iat (issue at time) если оно истекло,
сервер отвечает 401
статус кодом.