JSON Web Tokenの構造

Auth0が発行したJWTにはすべて、JSON Web Signatures(JWS)が付いています。つまり、JWTは暗号化でなく署名されていることを表します。JWSは、JSON形式の構造を使って、デジタル署名やメッセージ認証コード(MAC:Message Authentication Codes)でセキュリティー保護されたコンテンツを表します。

整形式のJWTは、ドット(.)で区切られた、3つのBase64urlエンコードされた連結文字列から構成されます。

  • JOSEヘッダー:トークンタイプについてのメタデータと、コンテンツの保護に使用される暗号化アルゴリズムが含まれています。

  • JWSペイロードクレームのセット):ユーザーのIDやアクセス許可など、検証可能なセキュリティステートメントが含まれています。

  • JWS署名 :トークンが信頼できるもので、改ざんされていないことを検証するのに使用されます。JWTを使用する際は、署名を保存して使用する前に、署名を確認する必要があります

JWTは一般的に以下のように見えます。

JSON Web Token

JWTの中身を自分で見るには、JWT.io Debuggerを使います。JWTが整形式であることの確認や、各種のクレームの値を手動で検査することができます。

JWT Debugger

JOSEヘッダー

JSONオブジェクトで、暗号化の操作を記述するパラメーターや使用されているパラメーターが含まれています。JOSE(JSON Object Signing and Encryption)ヘッダーは、一般的に名前/値のペアで構成されるヘッダーパラメーターのセットから成り、名前/値は使われるハッシュアルゴリズム(HMAC SHA256やRSAなど)とJWTの種類になります。

{
      "alg": "HS256",
      "typ": "JWT"
    }

Was this helpful?

/

JWTペイロード

ペイロードにはエンティティ(通常はユーザー)についてのステートメントと、エンティティについての追加の属性が含まれ、追加の属性はクレームを呼ばれます。以下の例で、エンティティはユーザーです。

{
      "sub": "1234567890",
      "name": "John Doe",
      "admin": true
    }

Was this helpful?

/

JWTクレームを扱う際には、異なるクレームタイプと命名規則に注意してください。

JWS署名

署名は、JWTの送信者が自称のとおりであることを検証し、メッセージが途中で変更されていないことを保証するために使用されます。

署名を作成するには、Base64エンコードされたヘッダーとペイロードをシークレットと共に取得して、ヘッダーで指定されているアルゴリズムで署名します。

たとえば、HMAC SHA256アルゴリズムを使ってトークンの署名を作成する場合には、以下を行います。

HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret)

Was this helpful?

/

もっと詳しく