概要
WEB アプリケーションの認証に JWT 利用を検討してるなかで、JWT について調査した内容をまとめます。
JWT とは
JWT(ジョット)とは JSON Web Token の略で、電子署名付きの URL-safe(URLとして利用出来る文字だけ構成される)な JSONのことです。
電子署名により、JSON の改ざんをチェックできるようになっています。
ざっくり言うと、改ざんできない JSON ということになります。
利用ケース
- クライアントは、認証情報 (ログインID + パスワード) を送信する。
- サーバは、認証情報を確認して
user_id
とexp
(有効期限) を含む JSONを 秘密鍵で暗号化して JWT として返却する。 - 以降クライアントは、認証済みリクエストとして JWT を利用して通信をおこなう。
クライアントからの送信される JWT はサーバで秘密鍵を利用して改ざん検証をおこなうため
user_id
や exp
の改ざんを検知することができます。
JWT の中身
JWT の文字列ははピリオド区切りで3つの役割にそれぞれ分かれています。
{Base64エンコードされたヘッダ}.{Base64エンコードされた JSON の中身}.{電子署名}
ヘッダ情報(1つ目)
ヘッダ情報には、署名アルゴリズムの種類やメタ情報が記載されています。
予約済項目名 | 役割 |
---|---|
alg | 署名アルゴリズム。HS256 など |
typ | トークのタイプ。JWT 指定が推奨 |
※ なお、必須項目は alg
のみとなっています。
ヘッダの中身が次の例の場合、"typ": "JWT"
これは JWT であり、alg": "HS256
HMAC SHA-256アルゴリズムを使ってMACが付与されていることを表しています。
{
"typ": "JWT",
"alg": "HS256"
}
alg
に none
や HMAC-SHA*
を指定して署名検証を回避する脆弱性があるため
ホワイトリスト形式で alg
を検索する必要があります。
クレーム情報(2つ目)
JSON 本体で、Base64デコードするだけで 通常の JSON と同様に内容を確認できます。
予約項目名 | 役割 |
---|---|
exp | 期限切れ日時 |
ndf | 期間開始日時 |
iat | JWT発行日時 |
iss | 発行者(サーバ側)の識別子 |
aud | 利用する側(クライアント側)の識別子 |
電子署名(3つ目)
3つ目の署名情報については検証にしか利用されないため、特に意識する必要はありません。
注意点
ヘッダ情報の脆弱性
ヘッダ情報の説明でも触れましたが、alg
の脆弱性が存在するため、必ず中身のチェックをしましょう。
重要な情報は設定しない
JWT の中身は Base64 エンコードされただけなので中身が簡単に確認できるので、クライアント側に見えてはいけない内容は回避しましょう。
一度発行した JWT の無効化は難しい
一度認可した JWT を無効化扱いすることはできません。
有効期限を短くしたり、即時無効化する必要がある場合は別途仕組みを用意するなどで対策しましょう。