FFFT

主にwebプロダクト開発に関連する話をつらつらと

JWT(Json Web Token)とは。何に使えるか。

JWTとは

JSON Web Tokenを使っていて非常に便利なのでまとめてみます。
JSON Web TokenはJWTと略され、ジョットと読みます。

jwt.io

こんな感じのトークンです。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWTはトークン化されたJSONまたはその仕組みのことです。
ここまでは名前のとおりという感じですね。
一般的に使われているJWTはSigned JWTの意味で使われます。
Signed JWTは電子署名付きのトークン化されたJSONまたはその仕組みのことです。
以降、Signed JWTをJWTと呼びます。

JWTは下記2点の特徴を持ちます。

  • トークン化は暗号化ではないので誰でも元のJSONの状態に戻して中身を知ることができる
  • 一方で電子署名がついているため、発行者は対象のJSONが改ざんされているかどうか、有効性の検証ができる

誰でも中身は見れるけど誰も中身は変えられないというのが一言で言える特徴です。

JWTって何に使えるの?

ユーザー認証に使えます。
JWTをユーザー認証に使うとサーバで認証状態の管理をする必要がなくなります。
従来のWebアプリケーションだと下記のような流れでログイン機能を実現することが多いと思います。

  1. クライアントからIDとパスワードをリクエス
  2. サーバがリクエストを受けてIDとパスワードを検証
  3. 問題なければDBに認証されたユーザー情報を有効期限とともに格納
  4. ユーザー情報を暗号化したキーをCookieに詰めて返却

ここまででログインは完了です。
ログイン以降は下記の流れでしょうか。

  1. クライアントで認証後の画面で認証が必要な操作をする(ECサイトの商品購入など)
  2. サーバはリクエストで渡されるキーの有効性をチェック(DBに格納した情報と照らし合わせ)
  3. 問題なければそのまま処理を継続
  4. 問題があれば認証エラーをレスポンス

という感じでしょうか。
JWTを使った認証だとこんな感じになります。

  1. クライアントからIDとパスワードをリクエス
  2. サーバがリクエストを受けてIDとパスワードを検証
  3. 問題なければ秘密鍵を使ってJWTを発行(認証されたユーザー情報と有効期限でJWTを発行)
  4. 発行したJWTをCookieに詰めて返却

ここまででログインは完了です。
ログイン以降は下記の流れでしょうか。

  1. クライアントで認証後の画面で認証が必要な操作をする(ECサイトの商品購入など)
  2. サーバはリクエストで渡されるJWTの有効性(改ざんされていないか)を秘密鍵を使ってチェック
  3. JWTの中身を確認して有効期限が切れていないかチェック
  4. 問題なければそのまま処理を継続
  5. 問題があれば認証エラーをレスポンス

いかがでしょうか。
JWTにそのまま認証の状態(ユーザー情報と有効期限)を持たせることでDBに認証状態を持つ必要がなくなります。

改めてJWTは誰も中身は変えられない特徴を持ちます。
つまり、改ざんの有無は秘密鍵を持っているサーバのみが知ることができるということですね。

改ざんチェック→中身を見て有効期限が切れていないかチェック→問題なければ認証OK

これで認証機構としての役割を果たすことができます。

他にもパスワード忘れからの再設定機能や一度仮登録してから本登録をするような新規アカウント発行の機能でも使えそうです。

サーバ側で認証状態を管理する必要がなくなることでコードもインフラ構成もシンプルになって良いです。