🖧 Как работает аутентификация JWT (JSON Web Token)?

Статьи

Что такое 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, используя происхождение запроса и специальные заголовки запроса.

 

Добавить комментарий