JWT認証とは? Session認証との違いを簡単なイメージでまとめてみた


JWT認証とは

トークンによる認証方式のひとつ。
名称のとおり、JWT(JSON Web Token)形式のトークンを用います。
ちなみに、JWTは「ジョット」と読みます。

JWTの構造

ヘッダー、ペイロード、署名の3つの要素で構成される。
下図のような構造になっている。

ヘッダー

通常、2つの要素で構成される。

header.json
{
    "alg" : "HS256",
    "typ" : "JWT"
}

alg:使用する署名アルゴリズム(HMAC SHA256やRSAなど)を指定する。
typ:トークンの形式を指定する。

上記のJSONをBase64UrlエンコードしたものがJWTの最初の要素です。

ペイロード

認証情報などのクレームを格納します。
(トークン内で保持する任意の情報ををクレームと呼びます。)

payload.json
{
    "id" : "1234567890",
    "name" : "John Doe",
    "exp" : "2020/05/18" 
}

標準で登録済みのクレームがありますが、独自のクレームを使うこともできます。
上記のJSONをBase64URLエンコードしたものがJWTの2番目の要素です。

署名

トークンが途中で改ざんされていないことを確認するためのものです。

署名を生成するには、

  • エンコードされたヘッダー
  • エンコードされたペイロード
  • 秘密鍵

をヘッダーのalgで指定したアルゴリズムでハッシュ化します。
例えば、HMAC SHA256アルゴリズムを使用する場合、以下のように署名が生成されます。

署名
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

以上のようにして生成した署名が、JWTの3番目の要素です。

JWTの注意点

署名付きトークンの場合、この情報は改ざんから保護されていますが、誰でも読み取ることができることに注意してください。暗号化されていない限り、JWTのペイロードまたはヘッダー要素に秘密情報を入れないでください。

Cookie(Session)による認証とJWT認証の違い

JWT認証とCookie(Session)による認証の違いを簡単なイメージにまとめてみました。

Cookie(Session)による認証

セッションの状態(認証情報など)はサーバー側で保持されている。(ステートフル)
Cookieで保存されたセッションIDをリクエストとともに送信することでセッションの状態を取得できる。

JWT認証

サーバーは認証情報などの状態を保持しない。(ステートレス)
サーバー側に保管されている秘密鍵がないと改ざんはできない。

備考

より詳細については、随時追記していきたいと思います。