トップ OSS紹介 Java JWT

Java JWT

サポート対象

NRIのOpenStandiaが提供するJava JWT最新情報

バージョンアップ情報

Java JWT情報

JJWTとは

JJWT(Java JWT)は、Java 言語で、JSON Web Token(JWT) と JSON Web Keys(JWK)の生成、検証を行うために、使いやすく理解しやすいことを目指してLes Hazlewood 氏によって作成された、オープンソースの Java ライブラリです。
JJWTは、現在も Les Hazlewood 氏とコミュニティによりサポートとメンテナンスが続けられています。

主な特徴

JJWTは、便利で分かり易いインタフェースになっており、IDEの自動補完に最適なコードを記述することが可能です。

JJWTは、以下のJOSE WG(JSON Object Signing and Encryption Working Group) RFC 仕様に遵守しており、RFC指定のテストでテストされています。

  • RFC 7519: JSON Web Token (JWT)
  • RFC 7515: JSON Web Signature (JWS)
  • RFC 7516: JSON Web Encryption (JWE)
  • RFC 7517: JSON Web Key (JWK)
  • RFC 7518: JSON Web Algorithms (JWA)
  • RFC 7638: JSON Web Key Thumbprint
  • RFC 9278: JSON Web Key Thumbprint URI
  • RFC 7797: JWS Unencoded Payload Option
  • RFC 8037: Edwards Curve algorithms and JWKs

JWTとは

JSON Web Token (JWT) は、転送される情報をコンパクトにまとめられたURLセーフなトークン(メッセージ)です。
JWTは、ドット(.) で連結された3つの要素、ヘッダー(Header)、ペイロード(Payload)、署名(Signature)で構成されます。

ヘッダー:キー識別子、署名アルゴリズムなど、JWT に関するメタデータが含まれています。
ペイロード:メッセージ本文にあたります。JSON 形式で表現されたユーザー情報(クレーム)などが含まれます。
署名:トークンが改ざんされていないことを確認するためのデジタル署名です。

以下は、JSONヘッダーと単純なテキスト形式のペイロードを含むJWTの例です。
(https://github.com/jwtk/jjwt?tab=readme-ov-file#jwt-example より)

1. データ内容

ヘッダー

{
"alg": "none"
}

ペイロード

本当の知性は知識ではなく想像力です。

2. 不要な空白をすべて削除します。

String header = "{"alg":"none"}";
String payload = "本当の知性は知識ではなく想像力です。";

3.UTF-8 バイト配列を取得し、Base64URL エンコードします。

String encodedHeader = base64URLEncode( header.getBytes("UTF-8") );
String encodedPayload = base64URLEncode( payload.getBytes("UTF-8") );

4. Base64エンコードされたヘッダーとペイロードをピリオドで結合します。

String compact = encodedHeader + '.' + encodedPayload + '.';

作成されたJWTは以下のようになります。

eyJhbGciOiJub25lIn0.5pys5b2T44Gu55+l5oCn44Gv55+l6K2Y44Gn44Gv44Gq44GP5oOz5YOP5Yqb44Gn44GZ44CC.

ただし、この例は署名が付与されていないため「保護されていない」JWT となります。

JWSとは

JWS(JSON Web Signature)は、デジタル署名またはメッセージ認証コード(MAC)で保護されたJWTです。以下の例では、ペイロード部はプレーンテキストではなく一般的なタイプのペイロードである JSON クレームを使用しています。

1.データ内容

ヘッダー
SHA-256 を使用した HMAC アルゴリズムを利用して暗号化することを示しています。

{
"alg": "HS256"
}

ペイロード
JSON形式の一つのクレーム(sub)が含まれています。

{
"sub": "Joe"
}

2. 不要な空白をすべて削除します。

String header = '{"alg":"HS256"}'
String claims = '{"sub":"Joe"}'

3.UTF-8 バイト配列を取得し、Base64URL エンコードします。

String encodedHeader = base64URLEncode( header.getBytes("UTF-8") );
String encodedClaims = base64URLEncode( claims.getBytes("UTF-8") );

4. Base64エンコードされたヘッダーとペイロードをピリオドで結合します。

String concatenated = encodedHeader + '.' + encodedClaims;

5. 秘密鍵とアルゴリズム(例では HMAC-SHA-256)を使用してデジタル署名を生成します。

SecretKey key = getMySecretKey();
byte[] signature = hmacSha256( concatenated, key );

6. 生成した署名をBase64URL エンコードし、ピリオドで文字列を結合します。

String compact = concatenated + '.' + base64URLEncode( signature );

作成されたJWSは以下のようになります。

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.1KP0SsvENi7Uz1oQc07aXTL7kpQG5jBNIybqr60AlD4

JWEとは

JWT、JWS(保護されたJWT)は、ヘッダーおよびペイロードは誰でも参照することができてしまいます。個人情報などの機密情報を送る場合は、改ざんすることも見ることも出来ない完全に暗号化された JWT である JWE(JSON Web Encryption)を使用する必要があります。

メリット・デメリット

JJWTは、java で書かれたJWTのライブラリですが、JWTには以下のようなメリット、デメリットがあります。

メリット・必要性

  • JWT は、サーバがセッション状態を維持する必要がないため、負荷分散が可能でありスケーラビリティに優れています。
  • RFC 7519 に定められた標準規格であり Java 以外の開発言語向けライブラリも豊富に存在しているため、他システムとの連携が容易です。
  • ユーザーの役割や権限を含めることが可能であるため、きめ細かい認証が可能です。

デメリット・注意点・課題

  • 秘密鍵の管理を適切に行わないとシステム全体が危険にさらされる可能性があります。
  • 一度発行したトークンは、取り消すことができないため、有効期限を適切に設定するなどの考慮が必要です。
  • トークンに大量のデータを格納するとサイズが大きくなり、ネットワークトラフィックの増加に繋がる可能性があります。

類似プロダクト

JJWTと同様の機能を持つJavaライブラリは、java-jwt、jose.4.j、Nimbus-JOSE-JWT、FusionAuth JWTなどがあります。

動作環境

JJWTは、Java7 以降、およびAndroid上で動作します。

JJWTのライセンス

JJWTのライセンスは、Apache 2.0ライセンスに基づいて公開され、営利、非営利を問わず、誰でも自由かつ無償で利用・改変・再配布できるようになっています。

参考情報

オープンソース年間サポートサービス

OpenStandiaではOSSを安心してご利用いただけるように、オープンソース年間サポートサービスをご提供しております。
サポートしているOSSは下記ページをご参照ください。

お気軽にお問い合わせください

関連OSS

  • Java

    Java

    ジャバ。サンマイクロシステムズ社(2010年にオラクル社に吸収合併)により開発されたプログラミング言語、及びその動作環境である Java VM(ジャバ仮想マシン) です。

オープンソースに関するさまざまな課題、OpenStandiaがまるごと解決します。
下記コンテンツも
あわせてご確認ください。