JWT 認証

JSON Web Token(JWT)は、 HTTP AuthorizationヘッダーやURIクエリーパラメーターなど、スペースに制約のある環境向けのコンパクトなクレーム表現フォーマットです。 クレームは、クレーム名とクレーム値を含む名前と値のペアとして表されます。

JWT 内のクレームは、JSON Web 署名 (JWS) 構造のペイロードとして、または JSON Web 暗号化 (JWE) 構造のプレーン・テキストとして使用される JSON オブジェクトとしてエンコードされます。 JWT クレームは、メッセージ認証コード (MAC) を使用してデジタル署名または保全性保護することができます。また、暗号化することもできます。

JWT の概要

JWT は、JWS または JWE 構造でエンコードされる JSON オブジェクトとしてクレームのセットを表します。 この JSON オブジェクトは、JWT クレーム・セットです。 JSON オブジェクトは、ゼロ個以上の名前と値のペア (またはメンバー) で構成されます。ここで、名前はストリングで、値は任意の JSON 値です。 これらのメンバーは、JWT によって表されるクレームです。 JWT クレーム・セット内のメンバー名は、クレーム名と呼ばれます。 対応する値は、請求値と呼ばれます。

JWTは、ピリオド('.')文字で区切られた URL部分のシーケンスとして表現される。 各部分には、 base64url-encoded値が含まれます。 JWT 内のパーツの数は、JWS コンパクト・シリアライゼーションを使用した結果の JWS の表現、または JWE コンパクト・シリアライゼーションを使用した結果の JWE の表現によって異なります。

JWT のタイプ

JWT には、主に以下の 2 つのタイプがあります。
  • JSON Web 署名 (JWS) -このタイプの JWT の内容は、送信側と受信側の間で転送中に JWT の内容が改ざんされないようにデジタル署名されます。 JWS の内容またはクレームは、他のパーティーによっても読み取ることができます。 したがって、JWS を使用してコンテンツまたはクレームの整合性を検証することはできますが、パスワードなどの機密データの転送には使用しないでください。 JWSは通常、 HTTPS またはSSL上で使用されるが、これは本質的にデータの読み取りを防ぐことができないためである。
  • JSON Web Encryption (JWE) -このタイプの JWT のコンテンツはデジタル暗号化されています。 これは、整合性を検証し、コンテンツを保護するために使用できることを意味します。 コンテンツを本質的に暗号化するため、プレーンな HTTP 上でも使用できる。
注: Sterling™ Order Managementシステムは JWSのみをサポートします。

JWT の例

典型的なJWSのフォーマットは、<Base 64 URL エンコードされたHeader json>.<Base 64 URKエンコードされたPayload json>.<Base 64 URL エンコードされた署名> である

以下の署名は、Base 64 URLでエンコードされたヘッダーとペイロードの内容に、 RS256 アルゴリズ ムを用いて暗号鍵で署名することで得られる。
Header 
{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "a1"
}

Payload
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "iat": 1516239022,
  "exp": 1531762065
}
次の図は、 RS256 秘密鍵で署名された JWT のサンプル JWS 表現です。
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImExIn0
.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMiwiZXhwIjoxNTMxNzYyMDY1fQ
.z4qfO0leZK2mYp_w-jFNidTx-Ri0PRMHLsOAG1Den7ZR4QntIJhU17U0afgoe5VzISXS6jW61ga3XEk39ey1G7a_-ARIVZLYN11fHDhsPuzN7PPkbT
5uWpHEUhVWRR8dxHqXmNiDaWjNhTnzHCBpfrRHj5pR_dzubbuE_uPuvDk

サンプルに示されているように、JWS には以下の部分があり、「.」で区切られています。 文字。

  • ヘッダー = eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImExIn0
  • ペイロード = G4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMiwiZXhwIjoxNTMxNzYyMDY1fQ
  • 署名 = z4qfO0leZK2mYp_w-jFNidTx-Ri0PRMHLsOAG1Den7ZR4QntIJhU17U0afgoe5VzISXS6jW61ga3XEk39ey1G7a_-ARIVZLYN11fHDhsPuzN7PPkbT5uWpHEUhVWRR8dxHqXmNiDaWjNhTnzHCBpfrRHj5pR_dzubbuE_uPuvDk