はじめに
今回は数ある認証の中でも広く使用されているJWT認証について、初学者が学習した内容をまとめました。
間違いなどもあるかもしれませんので、もしお気づきの点がありましたらご指摘頂ければ幸いです。
JWT認証とは
ログイン機能として必須な機能、システムがユーザーの身元を確認するプロセス。
それが認証です。
具体的には
- ユーザーがログイン
- サーバーでの照合、認証
- 認証後、JWTが生成され、ユーザーのブラウザに保存
- その後、ユーザーが保護されたリソースへのアクセスを要求するたびに、クライアントはリクエストと共にJWTをサーバーに送信し、JWTの検証を行います。
JWT(JSON Web Token)とは、JSONオブジェクトを用いて、二者間で情報を安全に伝達するためのコンパクトで自己完結型の方法です。
認証や情報交換によく使用され、署名されているため、内容が信頼できることが保証されます。
JWTは ' . ' (コンマ)で区切られた3つの部分から構成されており、それぞれ
- ヘッダー(Header)
- ペイロード (Payload)
- シグネチャー(Signature)
の3部分から構成されています。
これら3つの部分をコンマで連結したものが、完全なJWTです。
以下のようになります。
xxxxx.yyyyy.zzzzz
xはヘッダー、yはペイロード、zはシグネチャーをBase64Urlエンコードされた値です。
JWTを使用することで、安全に情報を交換することができ、特にWebアプリケーションやAPI間での認証情報のやり取りに有効です。
各部分の目的と役割
ヘッダー(Header)
ヘッダーは、JWTのどの形式を使用してトークンをエンコードするかを指定する部分です。
ヘッダーは、
- トークンのタイプ(typ)、通常はJWT
- 使用される署名アルゴリズム(alg)、例えばHMAC SHA256やRSAなど
上記の2つの部分から構成されます。
ペイロード(Payload)
ペイロード(荷物)部分には、トークンに関する「クレーム」(主張)が含まれます。
クレームは、エンティティ(例えば、ユーザー情報)や追加のデータに関するステートメントです。
クレームには、
-
登録済みClaims
事前に定義されたクレームで、JWTの処理方法を提供します。
例えば、iss(発行者)、exp(有効期限)、sub(主題)、などがあります。 -
公開Claims
衝突を避けるためにIANA JSON Web Token Registryに登録されるか、URI形式で名前空間を持つクレームです。
これらは、共有情報を伝達するために公開的に使用されます。 -
プライベートClaims
トークンの作成者と消費者の間で合意されたクレームです。
特定のアプリケーション固有の情報を伝達するために使用され、他のどのトークンとも衝突しないために一意な名前を持つべきクレームです。
シグネチャー(Signature)
シグネチャー部分は、メッセージが途中で改ざんされていないことを保証するためのものです。
ヘッダーのエンコードされた値、ペイロードのエンコードされた値、秘密鍵(または公開鍵/秘密鍵ペアの場合は秘密鍵)、およびヘッダーで指定されたアルゴリズムを使用して生成されます。
トークンの最後の部分を形成し、トークンの改ざんを防ぎます。
JWT認証のメリット、デメリット
メリット
-
ステートレス認証
JWTは自己完結型で、トークン自体が必要なすべての情報を持っています。
これにより、サーバー側でユーザーの状態を保持する必要がなくなり、拡張性が向上します。 -
分散システムでの利便性
分散システムやマイクロサービスアーキテクチャでは、異なるサービス間でユーザー認証情報を共有する必要があります。
JWTは簡単に他のサービスと共有でき、各サービスで個別にユーザーを認証する必要をなくします。 -
クロスオリジン認証が容易
JWTはクロスオリジンリクエストに適しており、異なるドメイン間で安全に認証情報を交換できます。 -
パフォーマンスの向上
セッションベースの認証と比較して、JWTはサーバーのリソースを節約でき、より良いパフォーマンスを提供します。
デメリット
-
トークンの盗難リスク
JWTが盗まれると、有効期限が切れるまで攻撃者によって悪用される可能性があります。
これを防ぐために、HTTPSを使用して通信を暗号化する、トークンの有効期限を短くするなどの対策が必要です。 -
トークンのサイズ
JWTはセッションIDよりも大きくなることが多く、特に多くのクレームを含む場合は、ネットワークのオーバーヘッドが増加します。 -
トークンの失効管理
一度発行されたJWTは、有効期限が切れるまで有効です。
即時に無効化する標準的な方法がないため、トークンの悪用を防ぐためには追加の仕組みが必要になることがあります。
まとめ
メリットとして書いたように、JWTの利点はその自己完結性にあり、その汎用性と拡張性から広く利用されています。
しかしその分、悪意ある他者にトークンを利用された場合は容易になりすます事が可能です。
安全性に注意し、対策を講じる必要があります。
JWTの「なりすまし」攻撃対策として、トークンのデコード方法について理解することも重要です。
個人的に JWT.io というサイトがJWT認証の理解を深める手助けになると思います。
JWT.ioでは、エンコードされたJWTを入力することで、そのヘッダー、ペイロード、および署名を可視化することができます。
もしJWT認証に興味を持たれたら、ぜひ触ってみてください。