JWT を理解する

王林
リリース: 2024-08-08 13:46:24
オリジナル
599 人が閲覧しました

JWT とは何ですか?

JWT は json Web トークンの略で、関係者間で情報を JSON オブジェクトとして送信するためのオープンスタンダードな使用法です。これはコンパクトで URL セーフであり、認証や情報交換のために Web アプリケーションで広く使用されています。

JWT は、キーとシークレットを使用してデジタル署名されます。これらのキーと署名を使用して JWT を検証し、ユーザーを認証します。ほとんどの Web システムは JWT を使用して、ユーザーに特定のリソースへのアクセスを許可します。

トークンコンポーネント

JWT には、ヘッダー、ペイロード、署名という 3 つの主要コンポーネントがあります。トークンを作成するとき、ヘッダーとペイロードを渡し、トークンが署名を生成します。

Headre - JWT のヘッダーには、トークンに関するメタデータが含まれています。これには、alg、typ、および kid の 3 つの値が含まれます。 alg はトークンの署名に使用されるアルゴリズムを指定し、typ はトークンのタイプを示し、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
}
ログイン後にコピー

ペイロード - ペイロードでは、ユーザー ID やロールなどのユーザー固有のデータをペイロードに追加するカスタム データを指定します。

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
ログイン後にコピー

署名 - 署名は、秘密鍵 (HS256 の場合) でヘッダーとペイロードをエンコードするか、秘密鍵 (RSA の場合) で署名し、結果をハッシュすることによって生成されます。この署名はトークンを検証するために使用されます。

トークンの作成方法

先ほど説明したように、JWT にはヘッダー、ペイロード、署名という 3 つのコンポーネントがあります。ヘッダーとペイロードを提供し、それらから署名が生成されます。これらすべてのコンポーネントを組み合わせた後、トークンを作成します。

// 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 を使用するには、jsonwebtoken npm パッケージを利用します。 JWT を操作するには 2 つの方法があります。秘密キーを使用する簡単な方法と、(公開キーと秘密キーを使用する) キー ペアの方法です。

シークレットの使用

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 Web Token (JWT) は、コンパクトな形式を使用して当事者間で情報を安全に送信します。 RSA の署名と検証には、署名に秘密キーを使用し、検証に公開キーを使用することが含まれます。 TypeScript の例では、秘密 RSA キーを使用して JWT を生成し、それを公開 RSA キーで検証して、安全なトークンベースの認証とデータの整合性を確保する方法を示します。

以上がJWT を理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!