![translation](https://cdn.durumis.com/common/trans.png)
これはAIが翻訳した投稿です。
言語を選択
durumis AIが要約した文章
- JSON Web Token(JWT)は、情報を安全に送信するための暗号化されたトークンです。
- JWTは、ヘッダー、ペイロード、署名で構成され、署名によりデータの完全性が保証されます。
- JWTは、状態情報を別途管理する必要がないため、分散環境で拡張性が高いです。
JWTとは?
JSON Web Token (JWT) は、JSON オブジェクトを使用して情報を安全に送信する方法の一種であり、公開された標準 (RFC 7519) です。文字通り、必要な情報をトークンに詰め込み、暗号化して使用します。
JWT は、署名されたトークン (signed token) であると強調されています。公開鍵/秘密鍵のペアを使用して署名する場合、この署名は秘密鍵を保持している当事者のみがそのトークンに署名したことを保証します。つまり、鍵を保持しているサーバーはこのトークンが正規のものであるかどうかを知ることができます。
JWT 構造
JWT は、ヘッダー (Header)、ペイロード (Payload)、署名 (Signature) で構成されています。
各部分は Base64 でエンコードされ、点 (.) を区切り文字として使用します。
ヘッダー
{
"alg": "HS256",
"typ": "JWT"
ヘッダーには、トークンのタイプ (typ) と使用されている署名アルゴリズム (alg) の 2 つの主要な情報が含まれています。署名アルゴリズムは、署名を作成および検証する際に使用されます。
typ は "JWT" に設定され、alg は HMAC、SHA256 などのように記述されます。上記の例では、秘密鍵で HS256 アルゴリズムを使用することを意味します。
ペイロード
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
ペイロードには、トークンに渡す Claim が含まれています。ユーザー識別情報またはトークンのプロパティをキーと値の形式で保存します。つまり、開発者は自由に挿入できます!
標準仕様では、キーの名前はコンパクトに 3 文字で定義されています。
登録された Claim は次のとおりです。
- iss (Issuer) : トークンの発行者 (トークンの発行者の固有識別情報を含む)
- sub (Subject) : トークンの対象となる主体
- aud (Audience) : トークンの受信者
- exp (Expiration Time) : トークンの有効期限 (この時間が過ぎると有効ではなくなります)
- nbf (Not Before) : トークンの有効化日時 (この時間まではトークンを使用できません)
- iat (Issued At) : トークンの発行日時
- jti (JWT Id) : JWT トークンの識別子 (発行者が複数の場合、これらを区別するための値)
それ以外の値の中で必要な値がある場合は、追加して使用しても問題ありません。
ただし、ペイロードは暗号化されていない署名された値ではないため、機密情報を格納しません。
デコードすると、誰でも閲覧できます。jwt.io サイトでもすぐに確認できます。
署名
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
ヘッダーとペイロードを Base64 でエンコードした値を区切り文字の点 (.) で連結し、サーバーが保持している秘密鍵 your-256-bit-secret を使用して署名します。
そのため、署名 (Signature) は、トークンを発行したサーバーのみが秘密鍵を使用して復号化できます。
復号化を考えてみると、秘密鍵を使用して署名を復号化し、base64UrlEncode(header) が JWT のヘッダー値と一致するかどうか、base64UrlEncode(payload) が一致するかどうかを確認することでわかります。
署名を除くヘッダーとペイロードはエンコードされているだけであり、本文の情報を確認できますが、署名によって情報の整合性とセキュリティが維持されます。
JWT は、必要なすべての情報を自己完結型として保持しており、ステートフルである必要があるセッションの欠点を補うために作成された JWT は、別々のストレージは必須ではありません。
サーバー側でセッションを維持する必要がないため、ステートレスであり、分散システムやマイクロサービスアーキテクチャにおける拡張性が高くなります。
署名、デジタル署名によって保護され、データの整合性を保証できます。