JSON Web Token(ジェイソンウェブトークン)とは | 意味や読み方など丁寧でわかりやすい用語解説
JSON Web Token(ジェイソンウェブトークン)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
ジェイソンウェブトークン (ジェイソンウェブトークン)
英語表記
JSON Web Token (ジェイソンウェブトークン)
用語解説
JSON Web Token、通称JWT(ジェイ・ダブリュー・ティー)は、WebアプリケーションやAPIにおいて、当事者間で情報を安全に伝達するためのオープンスタンダード(RFC 7519)である。主に認証や認可の文脈で利用され、ユーザーがログインに成功すると、サーバーは認証情報を含むJWTを生成してクライアントに発行する。クライアントはこのJWTを保存し、以降サーバーの保護されたリソースへアクセスする際に、HTTPリクエストのヘッダーに含めて送信する。サーバーは受け取ったJWTの正当性を検証することで、リクエスト元のユーザーを識別し、適切なアクセス権限を判断する。JWTの大きな特徴は、トークン自体が署名によって検証可能な情報を含んでいる「自己完結型」である点にある。これにより、サーバー側でセッション情報を保持する必要がないステートレスな認証システムを構築できる。この特性は、特に複数のサーバーで構成される分散システムやマイクロサービスアーキテクチャにおいて、システムの拡張性を高める上で非常に有効である。
JWTの構造は、「ヘッダー」「ペイロード」「署名」という3つの部分から成り立っており、これらはそれぞれピリオド(.)で連結された一つの文字列として表現される。各部分はBase64URLエンコードという、URLで安全に使用できる文字セットに変換する方式でエンコードされる。
最初の部分であるヘッダーは、トークンのメタデータを格納するJSONオブジェクトである。主に二つの情報を含み、一つはトークンの種類を示す「typ」(通常は"JWT")、もう一つは署名の生成に使用されるアルゴリズムを指定する「alg」(例: "HS256"や"RS256")である。HS256はHMAC-SHA256という共通鍵暗号方式を、RS256はRSA-SHA256という公開鍵暗号方式を指す。このJSONオブジェクトをBase64URLエンコードしたものが、JWTのヘッダー部分となる。
2番目の部分であるペイロードは、トークンが実際に伝達したい情報、すなわち「クレーム」を格納するJSONオブジェクトである。クレームは、エンティティ(通常はユーザー)に関する情報や追加のメタデータを表現する。クレームには、「登録済みクレーム」「パブリッククレーム」「プライベートクレーム」の3種類がある。登録済みクレームは、仕様で予め定義された推奨クレームであり、iss(発行者)、sub(主題、一般的にユーザーID)、aud(受信者)、exp(有効期限)、iat(発行日時)などが含まれる。これらのクレームを用いることで、異なるシステム間での相互運用性が向上する。パブリッククレームは利用者が自由に定義できるが、名前の衝突を避けるためにURI形式などで一意性を確保することが推奨される。プライベートクレームは、特定のアプリケーション内で当事者間の合意に基づいて使用される独自のクレームである。ペイロードもヘッダーと同様にBase64URLエンコードされるが、これは暗号化ではないため、誰でもデコードして内容を閲覧できる。したがって、パスワードのような機密情報をペイロードに含めてはならない。
最後の部分である署名は、トークンが送信中に改ざんされていないこと、そして信頼できる発行者によって作成されたことを保証するためのものである。署名は、エンコードされたヘッダーとペイロードをピリオドで連結した文字列に対し、ヘッダーで指定されたアルゴリズムと秘密鍵を用いて生成される。例えば、algがHS256の場合、サーバーのみが知る一つの秘密鍵でハッシュ値を計算する。algがRS256の場合、発行者が持つ秘密鍵で署名を作成し、検証側は対となる公開鍵を用いて署名を検証する。サーバーはクライアントからJWTを受け取ると、同じ方法で署名を再計算し、受け取ったJWTの署名部分と比較する。両者が一致すれば、トークンは正当であると判断される。
JWTの利点として、サーバーがステートレスになることで負荷分散が容易になり、スケーラビリティが向上する点が挙げられる。また、自己完結型であるため、リクエストごとにデータベースへユーザー情報を問い合わせる必要がなく、パフォーマンス向上に寄与する。一方で、一度発行したトークンは有効期限が切れるまで基本的に有効であり続けるため、即時無効化が難しいという課題がある。強制的にログアウトさせたい場合などには、無効なトークンを管理するブラックリストのような仕組みを別途実装する必要がある。これらの特性を正しく理解し、システムの要件に合わせて適切に利用することが重要である。