「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JWT を理解する

JWT を理解する

2024 年 8 月 24 日に公開
ブラウズ:405

JWT とは?

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

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

トークンコンポーネント

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

Headre - JWT のヘッダーには、トークンに関するメタデータが含まれています。これには、alg、typ、および kid の 3 つの値が含まれます。 alg はトークンの署名に使用されるアルゴリズムを指定し、typ はトークンのタイプを示し、kid はキーを識別するために使用されるオプションのパラメーターです。 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 トークン (JWT) は、コンパクトな形式を使用して当事者間で情報を安全に送信します。 RSA の署名と検証には、署名に秘密キーを使用し、検証に公開キーを使用することが含まれます。 TypeScript の例では、秘密 RSA キーを使用して JWT を生成し、それを公開 RSA キーで検証して、安全なトークンベースの認証とデータの整合性を確保する方法を示します。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/dkmen/ Understanding-the-jwt-3pl5?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3