🤔

JWT認証とは?

2024/03/07に公開

はじめに

JWT認証について学習する機会がありましたので、その時に得た知見をまとめておきます。

JWTって何?

JWTは、Json Web Token の略称で認証の中でもAPIの認証機能によく使用されるのがJWT認証です。
JWT は、JSON形式で記述されたトークンの一種です。
JWTには3つの要素が含まれています。

  • ヘッダー (Header): トークンのタイプとハッシュアルゴリズムなどのメタデータ
  • ペイロード (Payload): トークンに含まれる実際のデータ
  • 署名 (Signature): ヘッダーとペイロードを元に計算される電子署名

JWT の特徴として、独自の署名機能によりデータの改ざん検知が可能であることがあげられます。またトークン単体でデータを含むため、サーバーでのデータ参照が不要なステートレスな認証が実現できます。これらの利点から、Web API等での認証・認可によく利用されるようになっています。

JWT認証の流れ

  1. ログインリクエスト

    • ユーザーがログイン画面でユーザー名とパスワードを入力します。
    • この情報はサーバーに送信されます。
  2. 認証とJWTの発行

    • サーバーはユーザーのログイン情報(ユーザー名とパスワード)を検証します。
    • 情報が正しい場合、サーバーはJWTを生成します。このトークンには、ユーザー識別情報などのペイロードと、トークンが正しいことを保証する署名が含まれます。
    • 生成されたJWTはユーザーに戻されます。
  3. JWTのクライアント側保存

    • ユーザーは受け取ったJWTをブラウザのローカルストレージやセッションストレージに保存します。
    • このトークンは後続のリクエストで使用されます。
  4. 認証が必要なリクエスト

    • ユーザーが認証が必要なリソースへのアクセスを試みるとき、リクエストにJWTを添えてサーバーに送信します。通常、これはHTTPヘッダーの**AuthorizationフィールドにBearer {token}**として追加されます。
  5. トークンの検証

    • サーバーは受け取ったJWTの署名を検証し、ペイロードを解析してユーザーを識別します。
    • 署名が有効で、トークンが期限切れでない場合、サーバーはリクエストを認証し、要求されたリソースへのアクセスを許可します。
  6. リソースの提供

    • 認証が成功すると、サーバーは要求されたリソースをユーザーに提供します。
  7. セッションの維持とトークンの更新

    • JWTには有効期限があるため、セッションを維持するためには、期限が切れる前に新しいトークンに更新する必要があります。
    • これは、新しいログインリクエストを送るか、リフレッシュトークンを使用して新しいJWTを取得することで行われます。

JWT 認証のメリット・デメリット

メリット

  • ステートレス認証
    JWTはクライアントサイドで保存されるため、サーバー側でセッションを管理する必要がありません。これにより、アプリケーションはスケールアウトが容易になり、ステートレスなサービスを実現できます。

  • クロスドメイン認証
    クロスオリジンリソースシェアリング(CORS)問題に対処する必要がある場合、同一オリジンポリシーの制限を受けずに、異なるドメイン間で安全にトークンを送信できます。

  • パフォーマンス
    セッション情報をサーバー側で管理する必要がないため、サーバーの負荷が減り、応答時間が向上します。

  • 拡張性:
    JWTはJSONベースであるため、拡張が容易です。必要に応じて、トークンに新しいフィールドを追加することができます。

デメリット

  • トークンの盗難リスク
    JWTが盗まれると、トークンの有効期限が切れるまで攻撃者はユーザーとして行動できます。HTTPSを使用しても、クライアントサイドでのトークンの取り扱いには注意が必要です。

  • トークンのサイズ
    JWTは、多くの情報を含むとトークンのサイズが大きくなり、ネットワークのオーバーヘッドが増加します。

  • セキュリティ
    JWTのセキュリティは、トークンの署名と秘密情報の管理に依存するため、不適切なアルゴリズムや鍵管理は、トークンの安全性を損なう可能性があります。

  • デバッグとトラブルシューティングの難しさ
    JWTはデバッグが難しいことがあります。トークンのデコードや検証エラーの原因を特定するには、適切なツールやロギングが必要です。

Discussion