JWT認証とは?
はじめに
JWT認証について学習する機会がありましたので、その時に得た知見をまとめておきます。
JWTって何?
JWTは、Json Web Token の略称で認証の中でもAPIの認証機能によく使用されるのがJWT認証です。
JWT は、JSON形式で記述されたトークンの一種です。
JWTには3つの要素が含まれています。
- ヘッダー (Header): トークンのタイプとハッシュアルゴリズムなどのメタデータ
- ペイロード (Payload): トークンに含まれる実際のデータ
- 署名 (Signature): ヘッダーとペイロードを元に計算される電子署名
JWT の特徴として、独自の署名機能によりデータの改ざん検知が可能であることがあげられます。またトークン単体でデータを含むため、サーバーでのデータ参照が不要なステートレスな認証が実現できます。これらの利点から、Web API等での認証・認可によく利用されるようになっています。
JWT認証の流れ
-
ログインリクエスト
- ユーザーがログイン画面でユーザー名とパスワードを入力します。
- この情報はサーバーに送信されます。
-
認証とJWTの発行
- サーバーはユーザーのログイン情報(ユーザー名とパスワード)を検証します。
- 情報が正しい場合、サーバーはJWTを生成します。このトークンには、ユーザー識別情報などのペイロードと、トークンが正しいことを保証する署名が含まれます。
- 生成されたJWTはユーザーに戻されます。
-
JWTのクライアント側保存
- ユーザーは受け取ったJWTをブラウザのローカルストレージやセッションストレージに保存します。
- このトークンは後続のリクエストで使用されます。
-
認証が必要なリクエスト
- ユーザーが認証が必要なリソースへのアクセスを試みるとき、リクエストにJWTを添えてサーバーに送信します。通常、これはHTTPヘッダーの**
Authorization
フィールドにBearer {token}
**として追加されます。
- ユーザーが認証が必要なリソースへのアクセスを試みるとき、リクエストにJWTを添えてサーバーに送信します。通常、これはHTTPヘッダーの**
-
トークンの検証
- サーバーは受け取ったJWTの署名を検証し、ペイロードを解析してユーザーを識別します。
- 署名が有効で、トークンが期限切れでない場合、サーバーはリクエストを認証し、要求されたリソースへのアクセスを許可します。
-
リソースの提供
- 認証が成功すると、サーバーは要求されたリソースをユーザーに提供します。
-
セッションの維持とトークンの更新
- JWTには有効期限があるため、セッションを維持するためには、期限が切れる前に新しいトークンに更新する必要があります。
- これは、新しいログインリクエストを送るか、リフレッシュトークンを使用して新しいJWTを取得することで行われます。
JWT 認証のメリット・デメリット
メリット
-
ステートレス認証
JWTはクライアントサイドで保存されるため、サーバー側でセッションを管理する必要がありません。これにより、アプリケーションはスケールアウトが容易になり、ステートレスなサービスを実現できます。 -
クロスドメイン認証
クロスオリジンリソースシェアリング(CORS)問題に対処する必要がある場合、同一オリジンポリシーの制限を受けずに、異なるドメイン間で安全にトークンを送信できます。 -
パフォーマンス
セッション情報をサーバー側で管理する必要がないため、サーバーの負荷が減り、応答時間が向上します。 -
拡張性:
JWTはJSONベースであるため、拡張が容易です。必要に応じて、トークンに新しいフィールドを追加することができます。
デメリット
-
トークンの盗難リスク
JWTが盗まれると、トークンの有効期限が切れるまで攻撃者はユーザーとして行動できます。HTTPSを使用しても、クライアントサイドでのトークンの取り扱いには注意が必要です。 -
トークンのサイズ
JWTは、多くの情報を含むとトークンのサイズが大きくなり、ネットワークのオーバーヘッドが増加します。 -
セキュリティ
JWTのセキュリティは、トークンの署名と秘密情報の管理に依存するため、不適切なアルゴリズムや鍵管理は、トークンの安全性を損なう可能性があります。 -
デバッグとトラブルシューティングの難しさ
JWTはデバッグが難しいことがあります。トークンのデコードや検証エラーの原因を特定するには、適切なツールやロギングが必要です。
Discussion