Memahami JWT

王林
王林asal
2024-08-08 13:46:24725semak imbas

Apakah itu JWT?

JWT adalah singkatan kepada json web token, ia adalah penggunaan stander terbuka untuk menghantar maklumat antara pihak sebagai objek JSON. Ia padat, selamat URL dan digunakan secara meluas dalam aplikasi web untuk pengesahan dan pertukaran maklumat.

JWT ditandatangani secara digital menggunakan kunci dan rahsia. Kami mengesahkan JWT dengan kunci ini dan tandatangan untuk mengesahkan pengguna. Kebanyakan sistem web menggunakan JWT untuk membenarkan pengguna mengakses sumber tertentu.

Komponen Token

JWT mempunyai tiga komponen utama: pengepala, muatan dan tandatangan. Apabila kami mencipta token, kami melepasi pengepala dan muatan, dan kemudian token menjana tandatangan.

Tajuk - Tajuk JWT mengandungi metadata tentang token. Ia termasuk tiga nilai: alg, typ dan kid. Alg menentukan algoritma yang digunakan untuk menandatangani token, taip menunjukkan jenis token, dan kid ialah parameter pilihan yang digunakan untuk mengenal pasti kunci. Sama ada untuk memasukkan kanak-kanak bergantung pada kes penggunaan anda.

{
  "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
}

Payload - Dalam Payload kami menentukan beberapa data tersuai kebanyakannya menambah data khusus pengguna ke dalam muatan seperti id dan peranan pengguna.

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

Tandatangan - Tandatangan dijana dengan mengekodkan pengepala dan muatan dengan kunci rahsia (untuk HS256) atau menandatanganinya dengan kunci peribadi (untuk RSA), dan kemudian mencincang hasilnya. Tandatangan ini digunakan untuk mengesahkan token.

Cara Token Dicipta

Seperti yang kita bincangkan, JWT mempunyai tiga komponen: pengepala, muatan dan tandatangan. Kami menyediakan pengepala dan muatan, dan tandatangan dihasilkan daripadanya. Selepas menggabungkan semua komponen ini, kami mencipta token.

// 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

Jadi, proses untuk mencipta JWT adalah seperti berikut: kami mengekod muatan dan pengepala, kemudian menjana tandatangan daripadanya.

Understanding the JWT

Mengesahkan Token JWT

Terdahulu, kami membincangkan cara membuat JWT. Sekarang, mari kita bincangkan cara mengesahkan JWT. Proses pengesahan pada asasnya adalah kebalikan daripada penciptaan token. Pertama, kami menyahsulit token menggunakan kunci rahsia atau awam. Kemudian, kami menggabungkan pengepala dan muatan untuk menghasilkan tandatangan. Jika cincang yang dihasilkan sepadan dengan tandatangan, token itu sah; jika tidak, ia tidak sah.

// 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"

Kebaikan Menggunakan JWT

  1. Keselamatan - JWT ditandatangani secara digital, memastikan integriti dan ketulenan data
  2. Kompak - JWT bersaiz kecil, menjadikannya cekap untuk dihantar melalui rangkaian.
  3. Sendiri - JWT mengandungi semua maklumat yang diperlukan tentang pengguna, mengurangkan keperluan untuk menanyakan pangkalan data beberapa kali.

JWT menyediakan semua faedah di atas, menjadikannya pilihan popular untuk kebanyakan mekanisme pengesahan untuk membenarkan pengguna. Selain itu, JWT boleh digunakan dengan pelbagai teknik pengesahan, seperti DPoP dan lain-lain.

Cara Menggunakan JWT dalam Kod Anda

Untuk menggunakan JWT dalam kod, kami menggunakan pakej npm jsonwebtoken. Terdapat dua kaedah untuk bekerja dengan JWT: kaedah mudah menggunakan kunci rahsia dan kaedah pasangan kunci (menggunakan kunci awam dan peribadi).

Menggunakan Rahsia

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);
}

Menggunakan Kaedah 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);
}

Kesimpulan

Ringkasnya, JSON Web Token (JWT) menghantar maklumat dengan selamat antara pihak menggunakan format padat. Penandatanganan dan pengesahan RSA melibatkan penggunaan kunci persendirian untuk menandatangani dan kunci awam untuk pengesahan. Contoh TypeScript menggambarkan penjanaan JWT dengan kunci RSA peribadi dan mengesahkannya dengan kunci RSA awam, memastikan pengesahan berasaskan token yang selamat dan integriti data.

Atas ialah kandungan terperinci Memahami JWT. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn