Веб-токен JSON ( JWT , предлагаемое произношение / dʒ ɒ t / , то же, что и слово «jot» [1] ) — это предложенный Интернет-стандарт для создания данных с необязательной подписью и/или необязательным шифрованием , полезная нагрузка которого содержит JSON , утверждающий некоторое количество претензии . Токены подписываются либо с использованием закрытого секрета , либо с использованием открытого/закрытого ключа .
Например, сервер может сгенерировать токен с утверждением «вошел в систему как администратор» и предоставить его клиенту. Затем клиент может использовать этот токен, чтобы доказать, что он вошел в систему как администратор. Токены могут быть подписаны закрытым ключом одной стороны (обычно сервера), чтобы любая сторона могла впоследствии проверить, является ли токен законным. Если другая сторона каким-либо подходящим и заслуживающим доверия способом владеет соответствующим открытым ключом, она также может проверить легитимность токена. Токены разработаны так, чтобы быть компактными, [2] URL -безопасными, [3] и удобными для использования, особенно в контексте единого входа ( SSO) веб-браузера . Утверждения JWT обычно могут использоваться для передачи удостоверений прошедших проверку подлинности пользователей между поставщиком удостоверений и поставщиком услуг или утверждений любого другого типа, как того требуют бизнес-процессы. [4] [5]
JWT опирается на другие стандарты на основе JSON: JSON Web Signature и JSON Web Encryption . [1] [6] [7]
HS256
указывает, что этот токен подписан с использованием HMAC-SHA256.{ "alg" : "HS256" , "typ" : "JWT" }
iat
) и пользовательское утверждение ( loggedInAs
).{ "loggedInAs" : "admin" , "iat" : 1422779638 }
HMAC_SHA256 ( секрет , base64urlEncoding ( заголовок ) + '.' + base64urlEncoding ( полезная нагрузка ) )
Эти три части кодируются отдельно с использованием кодировки Base64url RFC 4648 и объединяются с использованием точек для создания JWT:
const token = base64urlEncoding ( заголовок ) + '.' + base64urlEncoding ( полезная нагрузка ) + '.' + base64urlEncoding ( подпись )
Приведенные выше данные и секрет «секретного ключа» создают токен:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
Полученный токен можно легко передать в HTML и HTTP . [3]
При аутентификации, когда пользователь успешно входит в систему, используя свои учетные данные, возвращается веб-токен JSON, который необходимо сохранить локально (обычно в локальном или сеансовом хранилище , но также можно использовать файлы cookie ) вместо традиционного подхода к созданию сеанса. на сервере и возвращает файл cookie. Для автоматических процессов клиент также может пройти аутентификацию напрямую, создав и подписав свой собственный JWT с предварительно общим секретом и передав его в службу, совместимую с OAuth , следующим образом:
POST /oauth2/token Тип контента: приложение / x-www-form-urlencoded Grant_type = urn:ietf:params:oauth:grant-type:jwt-bearer & Assertion = eyJhb...
Если клиент передает допустимое утверждение JWT, сервер сгенерирует access_token, действительный для вызовов приложения, и передаст его обратно клиенту:
{ "access_token" : "eyJhb..." , "token_type" : "Носитель" , "expires_in" : 3600 }
Когда клиент хочет получить доступ к защищенному маршруту или ресурсу, пользовательский агент должен отправить JWT, обычно в Authorization
заголовке HTTP, используя Bearer
схему. Содержимое заголовка может выглядеть следующим образом:
Авторизация: Носитель eyJhbGci ...<snip>... yu5CSpyHI
Это механизм аутентификации без сохранения состояния, поскольку состояние пользователя никогда не сохраняется в памяти сервера. Защищенные маршруты сервера проверят наличие допустимого JWT в заголовке авторизации, и если он присутствует, пользователю будет разрешен доступ к защищенным ресурсам. Поскольку JWT являются автономными, вся необходимая информация находится там, что снижает необходимость многократного запроса к базе данных.
Реализации JWT существуют для многих языков и платформ, включая, помимо прочего:
Веб-токены JSON могут содержать состояние сеанса. Но если требования проекта допускают аннулирование сеанса до истечения срока действия JWT, службы больше не могут доверять утверждениям токена только по этому токену. Чтобы убедиться, что сеанс, сохраненный в токене, не отозван, утверждения токена должны быть проверены по хранилищу данных . Это делает токены больше не апатридами, что подрывает основное преимущество JWT. [36]
Консультант по безопасности Тим Маклин сообщил об уязвимостях в некоторых библиотеках JWT, которые использовали это alg
поле для неправильной проверки токенов, чаще всего путем принятия alg=none
токена. Хотя эти уязвимости были исправлены, Маклин предложил alg
вообще исключить это поле из употребления, чтобы избежать подобной путаницы в реализации. [10] Тем не менее, новые alg=none
уязвимости все еще обнаруживаются: четыре CVE, зарегистрированные в период 2018–2021 годов, имеют эту причину. [37] [ нужен лучший источник ]
При правильном проектировании разработчики могут устранить уязвимости алгоритма, приняв меры предосторожности: [38] [39]
alg
только от области)В 2017 году было обнаружено, что несколько библиотек JWT уязвимы для недействительной атаки с использованием эллиптической кривой. [40]
Некоторые утверждают, что веб-токены JSON сложно использовать безопасно из-за множества различных алгоритмов и опций шифрования, доступных в стандарте, и что вместо этого следует использовать альтернативные стандарты как для веб-интерфейсов [41] , так и для серверов. [42]