JSON Web Token(JWT)

Tink は、ウェブで広く使用されている標準である JWT の生成と検証をサポートしています。Tink の JWT 実装は、Tink チームが安全に使用できると判断し、Tink ライブラリに適合する RFC 7519 で定義されている JWT 標準のサブセットを提供します。

Tink は、使用頻度が低いか、正しく使用するのが難しい標準の一部をサポートしていません。制限事項は次のとおりです。

  • Tink は JWS Compact Serialization 形式のみをサポートします。JWS JSON シリアル化JWE はサポートされていません。
  • Tink は alg ヘッダーの None 値をサポートしていません。
  • Tink は、ヘッダー typalgkid のみをサポートしています。他のヘッダーはすべてサポートされていません。
  • Tink では、署名または MAC が検証される前にトークンを解析することはできません。

JWT 署名

トークンが異なるエンティティによって生成および検証される場合は、プリミティブ JwtPublicKeySignJwtPublicKeyVerify を使用して非対称鍵を使用する必要があります。秘密鍵はトークンの生成に使用され、公開鍵はトークンの検証に使用されます。これらのプリミティブでサポートされているアルゴリズムは、ES256ES384ES512RS256RS384RS512PS256PS384PS512 です。

キータイプを選択する

JWT 署名では、Tink の通常のデジタル署名とは異なる鍵タイプが使用されます。一部のメタデータ(algkid など)はキーとともに保存する必要があるため、この処理が必要です。

ほとんどのユースケースでは、JWT_ES256 を使用することをおすすめします。この鍵タイプで生成されたトークンには、常に kid ヘッダーが含まれます。kid ヘッダーのない短いトークンが必要な場合は、キータイプ JWT_ES256_RAW を選択します。サポートされているすべての鍵タイプについては、サポートされている鍵タイプをご覧ください。

公開鍵セットの配布

Tink では、公開鍵セットを RFC 7517 で定義されている JWK セット形式に変換できます。この形式は、ほとんどの JWT ライブラリで理解できます。

Tink は、他の形式での公開 JWT 鍵のエクスポートをサポートしていません。これは、他の形式には検証で使用される alg メタデータと kid メタデータが含まれていないためです。このため、他の形式を使用するとエラーが発生しやすくなり、キーのローテーションが難しくなる可能性があります。

公開鍵セットを一度だけ共有するだけでなく、公開鍵セットを自動的に更新する方法を提供することが望ましいです。(そうでない場合、新しい鍵へのローテーションは非常に困難です)。これは通常、信頼できる安全な URL で公開鍵セットを公開することで行われます。トークンを検証するサーバーは、その URL から公開鍵セットを定期的に(たとえば 1 日に 1 回)再取得する必要があります。鍵をローテーションするには、トークンの署名に使用する少なくとも 1 日前に、新しい公開鍵を公開鍵セットに追加する必要があります。そうしないと、新しい秘密鍵で署名された新しいトークンは、古い公開鍵セットをまだ使用しているサーバーによって拒否されます。

JWT MAC

Tink は、プリミティブ JwtMac を使用した対称鍵による JWT もサポートしています。トークンが同じエンティティによって生成および検証される場合にのみ、このプリミティブを使用します。このプリミティブでサポートされているアルゴリズムは、HS256HS384HS512 です。

キータイプを選択する

JWT MAC 鍵タイプは、通常の MAC 鍵タイプとは異なります。ほとんどのユースケースでは、JWT_HS256 を使用することをおすすめします。

サンプル ユースケース

JWT を作成して検証したいをご覧ください。