JSON Web Token(JWT)

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

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 を使用すると、ほとんどの JWT ライブラリが理解している RFC 7517 で定義されている JWK セット形式との間で公開鍵セットを変換できます。

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

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

JWT MAC

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

鍵タイプの選択

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