«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Понимание JWT

Понимание JWT

Опубликовано 24 августа 2024 г.
Просматривать:929

Что такое JWT?

JWT означает веб-токен json, это открытый стандарт, используемый для передачи информации между сторонами в виде объекта JSON. Он компактен, безопасен для URL-адресов и широко используется в веб-приложениях для аутентификации и обмена информацией.

JWT имеют цифровую подпись с использованием ключей и секретов. Мы проверяем JWT с помощью этих ключей и подписи для аутентификации пользователя. Большинство веб-систем используют JWT для авторизации пользователей для доступа к определенным ресурсам.

Компоненты токена

JWT состоит из трех основных компонентов: заголовка, полезных данных и подписи. Когда мы создаем токен, мы передаем заголовок и полезную нагрузку, а затем токен генерирует подпись.

Headre — заголовок JWT содержит метаданные о токене. Он включает три значения: alg, typ и kid. Alg указывает алгоритм, используемый для подписи токена, type указывает тип токена, а kid — необязательный параметр, используемый для идентификации ключа. Включать ли ребенка, зависит от вашего варианта использования.

{
  "alg": "RS256", // allow [HS256,RS256,ES256]
  "typ": "JWT", // Specific Type Of token
  "kid": "12345" // Used to indicate which key was used to sign 
the JWT. This is particularly useful when multiple keys are in use
}

Полезная нагрузка. В разделе «Полезная нагрузка» мы указываем некоторые пользовательские данные, в основном добавляем в полезную нагрузку специфичные для пользователя данные, такие как идентификатор пользователя и роль.

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

Подпись. Подпись генерируется путем кодирования заголовка и полезных данных с помощью секретного ключа (для HS256) или их подписи с помощью закрытого ключа (для RSA), а затем хеширования результата. Эта подпись используется для проверки токена.

Как создается токен

Как мы уже говорили, JWT состоит из трех компонентов: заголовка, полезных данных и подписи. Мы предоставляем заголовок и полезную нагрузку, и на их основе генерируется подпись. Объединив все эти компоненты, мы создаем токен.

// Header Encoding
Base64Url Encode({
  "alg": "RS256",
  "typ": "JWT"
}) → eyJhbGciOiAiUlMyNTYiLCAidHlwIjogIkpXVCJ9


// Payload Encoding
Base64Url Encode({
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}) → eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MTYyMzkwMjJ9


// Concatenate Encoded header and payload
ConcatenatedHash =  Base64Url Encode(Header)   "."   Base64Url Encode(Payload)

//Create Signature
Hash = SHA-256(ConcatenatedHash)
Signature = RSA Sign(Hash with Private Key) or HS256 Sign(Hash with secrate)

// Create Token
Token = Base64UrlEncode(Header)  "."  Base64UrlEncode(Payload)  "."  Signature

Итак, процесс создания JWT выглядит следующим образом: мы кодируем полезную нагрузку и заголовки, затем генерируем на их основе подпись.

Understanding the JWT

Проверка токенов JWT

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

// Token we recive in this formate
Token = Base64UrlEncode(Header)  "."  Base64UrlEncode(Payload)  "."  Signature

// Decrypt Signature
TokenHash = RSA Decrypt(Hash with Public Key) or HS256 Sign(Hash with secrate)

// Generate Hash From Encoded Header and Payload
Hash = SHA-256(Base64UrlEncode(Header)  "."  Base64UrlEncode(Payload))

// Compare Hash
if(TokenHash == Hash) "Valid"
else "Not Valid"

Преимущества использования JWT

  1. Безопасность. JWT имеют цифровую подпись, что обеспечивает целостность и подлинность данных.
  2. Компактность — JWT имеют небольшой размер, что делает их эффективными для передачи по сети.
  3. Автономность — JWT содержат всю необходимую информацию о пользователе, что снижает необходимость многократного запроса к базе данных.

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

Как использовать JWT в своем коде

Чтобы использовать JWT в коде, мы используем пакет npm jsonwebtoken. Существует два метода работы с JWT: простой метод с использованием секретного ключа и метод пары ключей (с использованием открытого и закрытого ключей).

Использование секрета

import jwt from 'jsonwebtoken';

// Define the type for the payload
interface Payload {
  userId: number;
  username: string;
}

// Secret key for signing the JWT
const secretKey: string = 'your-very-secure-secret';

// Payload to be included in the JWT
const payload: Payload = {
  userId: 123,
  username: 'exampleUser'
};

// Sign the JWT
const token: string = jwt.sign(payload, secretKey, { expiresIn: '1h' });
console.log('Generated Token:', token);
import jwt from 'jsonwebtoken';

// Secret key for signing the JWT
const secretKey: string = 'your-very-secure-secret';

// Verify the JWT
try {
  const decoded = jwt.verify(token, secretKey) as Payload;
  console.log('Decoded Payload:', decoded);
} catch (err) {
  console.error('Token verification failed:', (err as Error).message);
}

Использование метода KeyPair

import * as jwt from 'jsonwebtoken';
import { readFileSync } from 'fs';

// Load your RSA private key
const privateKey = readFileSync('private_key.pem', 'utf8');

// Define your payload
const payload = {
  sub: '1234567890',
  name: 'John Doe',
  iat: Math.floor(Date.now() / 1000) // Issued at
};

// Define JWT sign options
const signOptions: jwt.SignOptions = {
  algorithm: 'RS256',
  expiresIn: '1h' // Token expiration time
};

// Generate the JWT
const token = jwt.sign(payload, privateKey, signOptions);
console.log('Generated JWT:', token);
import * as jwt from 'jsonwebtoken';
import { readFileSync } from 'fs';

// Load your RSA public key
const publicKey = readFileSync('public_key.pem', 'utf8');

// Define JWT verify options
const verifyOptions: jwt.VerifyOptions = {
  algorithms: ['RS256'] // Specify the algorithm used
};

try {
  // Verify the JWT
  const decoded = jwt.verify(token, publicKey, verifyOptions) as jwt.JwtPayload;

  console.log('Decoded Payload:', decoded);
} catch (error) {
  console.error('Error verifying token:', error);
}

Заключение

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

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/dkmen/understanding-the-jwt-3pl5?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3