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 を作成するプロセスは次のとおりです。ペイロードとヘッダーをエンコードし、それらから署名を生成します。
前に、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 は上記のすべての利点を提供するため、ユーザーを承認するためのほとんどの認証メカニズムで一般的な選択肢となっています。さらに、JWT は、DPoP などのさまざまな認証技術とともに使用できます。
コードで 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); }
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 キーで検証して、安全なトークンベースの認証とデータの整合性を確保する方法を示します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3