Оригинальная ссылка:medium.com/van полный - да о вице...
В этой статье я объясню основы веб-токенов JSON (JWT) и почему они используются. JWT являются важной частью обеспечения доверия и безопасности приложений. JWT позволяет безопасно представлять утверждения, такие как пользовательские данные.
Чтобы объяснить, как работает JWT, давайте начнем с абстрактного определения.
Веб-токен JSON (JWT) — этоJSON-объект,существуетRFC 7519определяется как безопасный способ представления набора информации между двумя сторонами. JWT состоит из заголовка, полезной нагрузки и подписи.
Проще говоря, JWT — это просто строка следующего формата:
header.payload.signature
Следует отметить, что строки в двойных кавычках считаются допустимыми объектами JSON.
Чтобы проиллюстрировать, как и почему на самом деле используются JWT, мы воспользуемся простым примером (см. изображение ниже). Три разных объекта в этом примере — это пользователь, сервер приложений и сервер аутентификации. Сервер аутентификации предоставит пользователю JWT. Используя JWT, пользователи могут безопасно взаимодействовать с приложениями.
Как приложение использует JWT для проверки подлинности пользователя
В этом примере пользователь сначала регистрируется на сервере аутентификации, используя систему входа в систему сервера аутентификации (например, имя пользователя и пароль, логин Facebook, логин Google и т. д.). Затем сервер аутентификации создает JWT и отправляет его пользователю. Когда пользователь выполняет вызов API к приложению, он передает JWT вместе с вызовом API. В этом случае сервер приложений сможет проверить, что входящий JWT был создан сервером аутентификации (процесс проверки будет объяснен более подробно позже). Когда пользователь выполняет вызов API с подключенным JWT, приложение может использовать JWT для проверки того, что вызов API исходит от пользователя, прошедшего проверку подлинности.
Теперь мы более подробно рассмотрим сам JWT и то, как он создается и проверяется.
Шаг 1. Создайте заголовок
Раздел заголовка JWT содержит информацию о том, как вычислить подпись JWT, и представляет собой объект JSON в форме:
{
"typ": "JWT",
"alg": "HS256"
}
В приведенном выше JSON значение ключа «typ» указывает, что объект является JWT, а значение ключа «alg» указывает алгоритм, используемый для создания подписи JWT. В примере мы используем алгоритм HMAC-SHA256 (алгоритм хеширования, использующий секретный ключ) для вычисления подписи (подробнее об этом в шаге 3).
Шаг 2. Создайте ПОЛЕЗНУЮ НАГРУЗКУ
Полезная часть JWT — это данные, хранящиеся в JWT. В нашем примере сервер аутентификации создает JWT, в котором хранится информация о пользователе, в частности идентификатор пользователя.
{
"userId": "b08f86af-35da-48f2-8fab-cef3904660bd"
}
Данные внутри полезной нагрузки называются «требованиями» токена.
В нашем примере мы помещаем только одно утверждение в полезную нагрузку. Вы можете добавить столько объявлений, сколько хотите. JWT указывает 7 официальных полей для выбора.
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
В дополнение к официальным полям в этом разделе вы также можете определить частные поля. Имейте в виду, что размер данных повлияет на общий размер JWT, что обычно не является проблемой, но слишком большой JWT может негативно сказаться на производительности и вызвать задержки.
Шаг 3. Создайте ПОДПИСЬ
Подпись вычисляется с использованием следующего псевдокода:
// signature algorithm
data = base64urlEncode( header ) + “.” + base64urlEncode( payload )
hashedData = hash( data, secret )
signature = base64urlEncode( hashedData )
Что делает алгоритм, так это то, что base64url кодирует заголовок и полезную нагрузку, созданную на шагах 1 и 2. Затем алгоритм соединяет полученные закодированные строки точками (.).
В примере заголовок и полезная нагрузка закодированы в base64url следующим образом:
// header
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
// payload
eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ
Затем, применяя указанный алгоритм подписи с ключом к закодированному заголовку и закодированной полезной нагрузкой цикла соединения, мы получаем хешированные данные, необходимые для подписи. В нашем случае это означает применение алгоритма HS256 к строке данных и установку ключа на строку «secret», чтобы получить строку hashedData. После этого, кодируя base64url строку hashedData, мы получаем следующую подпись JWT:
// signature
-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM
Шаг 4. Объедините три части JWT
Теперь, когда у нас созданы все три компонента, мы можем создать JWT. Помня о структуре header.payload.signature JWT, нам просто нужно объединить три части выше, разделив их точкой (.).
// JWT Token
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM
вы можете попробоватьjwt.ioСоздайте свой собственный JWT.
Возвращаясь к нашему примеру, сервер аутентификации теперь может отправить этот JWT пользователю.
Как JWT защищает наши данные?
Поймите, что цель использования JWT состоит не в том, чтобы каким-либо образом скрыть или скрыть данные, а в том, чтобы доказать, что отправляемые данные были созданы подлинным источником.
Как показано на предыдущих шагах, данные в JWT кодируются и подписываются, а не шифруются. Целью кодирования данных является преобразование структуры данных. Подписанные данные позволяют приемникам данных проверять подлинность источника данных. Следовательно, кодирование и подписание данных не защищает данные. С другой стороны, основной целью шифрования является защита данных и предотвращение несанкционированного доступа. Для более подробного объяснения различий между кодированием и шифрованием см.эта статья.
Поскольку JWT только подписан и закодирован и поскольку JWT не зашифрован, JWT не может гарантировать безопасность конфиденциальных данных.
Шаг 5. Проверьте JWT
В нашем примере мы используем алгоритм HS256, подписанный JWT, который только серверы аутентификации и серверы приложений знают ключ. При условии, что когда процесс аутентификации приложения сервер приложений получает ключ от сервера аутентификации. Поскольку приложение знает ключ, когда пользователь приложения с JWT дополнительные вызовы API приложение может выполнять одинаковые шаги на JWT. 3 алгоритма подписи. Затем приложение может проверить подпись, полученную из собственного хеширования и подписи, сопоставив на сам jwt (то есть, она соответствует подписи JWT, созданную сервером аутентификации). Если подписи совпадают, то эффективный jwt, представляет собой вызов API из доверенного источника. В противном случае, если подпись не соответствует, это означает, что JWT недействителен получен, это может быть указание потенциальной атаки на приложение. Таким образом, JWT проверил, приложение и пользователь между собой добавляют слой доверия.
В заключение
Мы узнали, что такое JWT, как их создавать и проверять и как использовать для обеспечения доверия между приложением и его пользователями. Это отправная точка для понимания основ JWT и того, чем он может быть полезен. JWT — это лишь часть головоломки в обеспечении доверия и безопасности в приложении. Следует отметить, что настройка аутентификации JWT, описанная в этой статье, использует алгоритм симметричного ключа (HS256). Вы также можете настроить JWT-аутентификацию аналогичным образом, за исключением использования асимметричного алгоритма (например, RS256), где сервер аутентификации имеет секретный ключ, а сервер приложений — открытый ключ. Проверь этоВопрос о переполнении стекадля подробного анализа различий между использованием симметричных и асимметричных алгоритмов. Следует также отметить, что JWT следует отправлять через соединение HTTPS. Наличие HTTPS помогает предотвратить его использование неавторизованными пользователями для кражи отправленного JWT, что делает невозможным перехват связи между сервером и пользователем. Кроме того, важно установить короткое время истечения срока действия в JWT, чтобы в случае компрометации старых JWT они считались недействительными и больше не могли использоваться.
Технологический еженедельник IVWEBШок в сети, обратите внимание на публичный номер: сообщество IVWEB, регулярно каждую неделю публикуйте качественные статьи.