Веб-токен JSON

редактировать

JSON Web Token
СтатусInternet Standard
Впервые опубликовано28 декабря 2010 г. (2010-12-28)
Последняя версияRFC 7519. Май 2015
ОрганизацияIETF
АббревиатураJWT

Веб-токен JSON (JWT, иногда произносится как, то же, что английское слово «jot») - это Интернет-стандарт для создания данных с дополнительной подписью и / или дополнительным шифрованием, полезная нагрузка которых содержит JSON, который утверждает некоторое количество утверждений. Токен подписываются с использованием личного секрета или открытого / закрытого ключа. Например, сервер может сгенерировать токен с утверждением «зарегистрирован как администратор» и предоставить его клиенту. Затем клиент может использовать этот токен, чтобы доказать, что он вошел в систему как администратор. Токены могут быть подписаны закрытым ключом одной стороны (обычно сервером), чтобы эта сторона могла впоследствии проверить, является ли токен законным. Если другая сторона каким-либо подходящим и заслуживающим доверия способом владеет соответствующим открытым ключом, она также может проверить легитимность токена. Маркеры спроектированы так, чтобы быть компактными, URL -безопасными и особенно удобными для использования в веб-браузере единой регистрации ( SSO) контекст. Утверждения JWT обычно могут использоваться для передачи удостоверений аутентифицированных пользователей между поставщиком удостоверений и поставщиком услуг или любого другого типа утверждений в соответствии с требованиями бизнес-процессов.

JWT опирается на другие стандарты на основе JSON: JSON Web Signature и JSON Web Encryption.

Содержание
  • 1 Структура
  • 2 Используйте
  • 3 Стандартные поля
  • 4 Реализации
  • 5 Уязвимости
  • 6 Ссылки
  • 7 Внешние ссылки
Структура
Заголовок
{"alg": "HS256", "typ": "JWT"}
Определяет, какие алгоритм используется для генерации подписи

HS256указывает, что этот токен подписан с использованием HMAC-SHA256.

Типичными используемыми криптографическими алгоритмами являются HMAC с SHA-256 (HS256) и подпись RSA с SHA-256 (RS256). JWA (веб-алгоритмы JSON) RFC 7518 вводит гораздо больше как для аутентификации, так и для шифрования.

Полезная нагрузка
{"loggedInAs": "admin", "iat": 1422779638}
Содержит набор претензий. Спецификация JWT определяет семь зарегистрированных имен утверждений, которые являются стандартными полями, обычно включаемыми в токены. Пользовательские утверждения обычно также включаются в зависимости от назначения токена.

В этом примере есть стандартное утверждение "Выпущено во время" (iat) и настраиваемое утверждение (loggedInAs).

Подпись
HMAC-SHA256 (секрет, base64urlEncoding (заголовок) + '.' + Base64urlEncoding (полезная нагрузка))
Надежно проверяет токен. Подпись вычисляется путем кодирования заголовка и полезной нагрузки с использованием Base64url Encoding и объединения их вместе с разделителем периодов. Эта строка затем проходит через криптографический алгоритм, указанный в заголовке, в данном случае HMAC-SHA256. Кодировка Base64url аналогична кодировке base64, но использует другие не буквенно-цифровые символы и пропускает заполнение.

Три части кодируются отдельно с использованием Base64url Encoding и объединяются с использованием точек для создания JWT:

const token = base64urlEncoding (header) + '.' + base64urlEncoding (полезная нагрузка) + '.' + Base64urlEncoding (подпись)

Приведенные выше данные и секрет "SecretKey" создает маркер:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

Этот полученный маркер может быть легко передается в HTML и HTTP.

Используйте

При аутентификации, когда пользователь успешно входит в систему, используя свои учетные данные, будет возвращен веб-токен JSON, который должен быть сохранен локально (обычно в локальное хранилище или хранилище сеанса, но также можно использовать файлы cookie ) вместо традиционного подхода создания сеанса на сервере и возврата файла cookie. Для автоматических процессов клиент также может аутентифицироваться напрямую, создавая и подписывая свой собственный JWT с предварительно общим секретом и передавая его в службу, совместимую с oAuth, например:

POST / oautdiv class="ht" / token? Content-type: application / x-www-form-urlencoded grant_type = urn: ietf: params: oauth: grant-type: jwt-bearer assertion = eyJhb...

Если клиент передает действительное утверждение JWT, сервер сгенерирует токен доступа, действительный для вызова приложения и передачи его клиенту:

{"access_token": "eyJhb...", "token_type": "Bearer", "expires_in": 3600}

Когда клиент хочет получить доступ к защищенному маршруту или ресурсу, пользовательский агент должен отправить JWT, обычно в заголовке Authorization, используя схему Bearer. Содержимое заголовка может выглядеть следующим образом:

Авторизация: носитель eyJhbGci... ... yu5CSpyHI

Это механизм аутентификации без сохранения состояния, поскольку состояние пользователя никогда не сохраняется. в памяти сервера. Защищенные маршруты сервера будут проверять наличие действительного JWT в заголовке авторизации, и если он присутствует, пользователю будет разрешен доступ к защищенным ресурсам. Поскольку JWT являются самодостаточными, вся необходимая информация имеется, что снижает необходимость многократного запроса базы данных.

Стандартные поля

Интернет-черновики определяют следующие стандартные поля («заявки»), которые можно использовать внутри набора заявок JWT:

кодимяописание
issIssuerОпределяет принципала, выдавшего JWT.
subSubjectОпределяет тему JWT.
audАудиторияОпределяет получателей, для которых предназначен JWT. Каждый принципал, предназначенный для обработки JWT, должен идентифицировать себя со значением в заявлении аудитории. Если принципал, обрабатывающий утверждение, не идентифицирует себя со значением в утверждении aud, когда это утверждение присутствует, то JWT должен быть отклонен.
expExpiration TimeОпределяет время истечения, по истечении которого JWT не должен приниматься для обработки. Значение должно быть NumericDate: целым или десятичным, представляющим секунды после 1970-01-01 00: 00: 00Z.
nbfNot BeforeОпределяет время, в которое JWT начнет приниматься в обработку. Значение должно быть NumericDate.
iatВыпущено вОпределяет время, в которое был выдан JWT. Значение должно быть NumericDate.
jtiJWT IDУникальный идентификатор токена с учетом регистра, даже среди разных эмитентов.

В заголовке JWT обычно используются следующие поля:

кодимяописание
типТип токенаЕсли присутствует, рекомендуется установить его на JWT.
ctyТип содержимогоЕсли используется вложенная подпись или шифрование, рекомендуется установить это на JWT; в противном случае опустите это поле.
algАлгоритм кода аутентификации сообщенияЭмитент может свободно установить алгоритм для проверки подписи на токене. Однако некоторые поддерживаемые алгоритмы небезопасны.
kidKey IDПодсказка, указывающая, какой ключ клиент использовал для генерации подписи токена. Сервер сопоставит это значение с ключом в файле, чтобы убедиться, что подпись действительна и токен подлинен.
x5cцепочка сертификатов x.509Цепочка сертификатов в формате RFC4945, соответствующая закрытому ключу, используемому для генерации подписи токена. Сервер будет использовать эту информацию для проверки того, что подпись действительна, а токен подлинен.
x5uURL цепочки сертификатов x.509URL-адрес, по которому сервер может получить цепочку сертификатов, соответствующую закрытому ключу, используемому для генерации подписи токена. Сервер получит и использует эту информацию для проверки подлинности подписи.
critCriticalСписок заголовков, которые должны быть поняты сервером, чтобы принять токен как допустимый

.

Реализации

Существуют реализации JWT для многих языков и фреймворки, включая, помимо прочего:

Уязвимости

веб-токены JSON могут содержать состояние сеанса. Но если требования проекта допускают аннулирование сеанса до истечения срока действия JWT, службы больше не могут доверять утверждениям токена только по токену. Чтобы убедиться, что сеанс, хранящийся в токене, не отменен, утверждения токена должны быть проверены по хранилищу данных . Это делает токены более не безгражданскими, что подрывает основное преимущество JWT.

Консультант по безопасности Тим Маклин сообщил об уязвимостях в некоторых библиотеках JWT, которые использовали поле algдля неправильной проверки токенов. Хотя эти уязвимости были исправлены, Маклин предложил полностью отказаться от поля alg, чтобы предотвратить подобную путаницу при реализации.

При правильном проектировании разработчики могут устранить уязвимости алгоритмов, приняв меры предосторожности:

  1. Проверка диска только заголовком JWT
  2. Знать алгоритмы
  3. Использовать соответствующий размер ключа

Архитектор безопасности программного обеспечения Курт Родармер указывает на дополнительные уязвимости конструкции JWT, связанные с ключами криптографической подписи, и на значительную уязвимость, которая обнаруживает парсер JSON библиотеки для открытия атаки. Это прямой результат выбора JSON для выражения заголовка токена, и его труднее смягчить.

Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-24 10:19:37
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте