私のAPIの1つで Django-rest-framework-jwt を使用しています。ご存知かもしれませんが、コンセプトは単純です。ユーザー名とパスワードを送信し、トークンを受け取ります。トークンはサーバーのどこにも保存されません。
後続のリクエストのヘッダーでトークンを送信することにより、トークンに関連付けられているユーザーがデータベースから抽出されます。これがどのように実装されているのか興味があります。サーバーはトークンを取得するだけで、ユーザーとトークンの有効期限をどのように抽出できますか?
私は公開鍵/秘密鍵の概念を知っていますが、これが同じアイデアで実装されている場合、ここでの秘密鍵と公開鍵は何でしょうか?
JWTトークンは、ヘッダー、クレーム、および署名を含むbase64エンコードされた文字列で構成されます。
クレームセクションには、JSONエンコードされた有効期限フィールドexp
が含まれています。
有効期限。 UTC Unix時間が含まれているため、このトークンを受け入れることはできなくなります。それは発行された時間の後でなければなりません。
ユーザー名は、クレームオブジェクトに格納することもできます。
JWTの「署名」に関しては 2つのオプション があります。
JWTは、シークレット(HMACアルゴリズムを使用)またはRSAを使用した公開鍵/秘密鍵のペアを使用して署名できます。
シークレットには秘密キーがありますが、これはHMAC SHA256 を使用してメッセージを認証するために使用されます。暗号化は行われず、認証のみが行われるため、クライアントはトークンに格納されている内容を確認できますが、変更することはできません。 [〜#〜] hmac [〜#〜] は、ハッシュを計算する方法の1つで、ハッシュは length extension attack に対して脆弱ではありません。このメソッドには公開鍵はありません。
RSAでは、秘密鍵を使用して鍵に署名します。これは、クライアントが受信したときに公開鍵を使用して検証できます。したがって、秘密鍵を知る必要があるのは、キーを生成するコンポーネントだけです。
詳細は nderstanding JWT を参照してください。