🫠
JWTとは?
自己学習でJWT認証を実装する機会があり、JWTって何だと混乱したので、少し調べてまとめてみました。
JWTとは?
JSON Web Tokenの略。
JSONベースのデータを暗号化してつくられる文字列で、認証や認可のための仕組みとしてWebアプリケーションなどで用いられる技術です。
認証と認可の違いは以下の記事がわかりやすく説明されていました。
JWTはトークンベース認証
セッションベース認証
ログインなどでよく想像するのがセッションベース認証です。
これはアプリケーション側でログイン状態を保持することでユーザー別のページを表示したりできます。
トークンベース認証
JWTはトークンベース認証で、アプリケーション側ではログイン状態を保持しません。
ユーザーは、ログイン時や何か情報が欲しい時などに、アプリケーションに対してHTTPリクエストを送信しますが、その時に事前に発行されているJWTを毎回のリクエストに含めて送ります。
そして、アプリケーション側でリクエストが受け取った際に送られてきたJWTが有効かどうか検証することで、
両者の違い
両者の大きな違いはセッションベース認証がサーバーに認証のための情報を持っておくのに対して、
トークンベース認証はトークンが有効化どうかの検証のみによって認証を行う点です。
トークンベース認証ではサーバーに認証のための情報を持たせないため、ユーザーが増えた際などによりスケーラブルなシステムを構築することが可能になるそうです。
JWT認証の流れ
-
ユーザーがログイン情報を送信
- ユーザーが必要な情報(ユーザーIDやパスワード)を入力してサーバーに送信
-
JWTの生成と送信
- ログイン情報を受け取ったサーバーは、情報が正しいかどうかの検証を行い、JWTを生成します。
- このJWTには有効期限やユーザーの識別情報などが含まれています。
- そして、このJWTをブラウザに送信します。
-
JWTの保存
- ブラウザ側で返却されたJWTをCookieなどに保存します。
-
JWTを含めたリクエスト
- ユーザーが、認証が必要なリソースへのアクセスを試みるときや、再度アクサスした際にはリクエストにJWTを含めてサーバーに送信します。
- こちらは、通常HTTPヘッダーの
authorization
フィールドにBearer {token}
の形で追加します。
-
JWTの検証
- サーバーは受け取ったJWTの署名を検証し、トークンが期限内である場合サーバーはリクエスを認証し、要求されたリソースへのアクセスを許可します。
-
セッションの維持とリフレッシュトークン
- JWTには有効期限が設定されているため、セッションを維持するためには、期限が切れる前に新しいトークンに更新する必要があります。
- リフレッシュトークンを利用して新しいJWTを入手することができますが、リフレッシュトークンが無効か存在しない場合には、ユーザーが再度ログイン情報を入力して新しいJWTを発行する必要があります。
参考
Discussion