結論: JWT(ジェイダブリューティー)は、利用者情報などを、署名つきで表した、文字列のトークンです。ヘッダー・ペイロード・署名の3つを「.」でつないだ形をしています。中身は暗号化されておらず、誰でも読めるため、秘密の情報は入れません。サーバーは、署名と有効期限を確かめてから、リクエストを受け付けます。発行後は取り消しにくいため、有効期限を短くする運用が大切です。
JWTとは
JWTは、JSON Web Token(ジェイソン・ウェブ・トークン)の略です。「この利用者は、ログイン済みで、有効期限はここまで」といった情報を、署名をつけて、1つの文字列にまとめたものです。
APIへのログインや、SSOの仕組みの中で、使われることが多くあります。トークンの基本は、トークンとはをご覧ください。
構造:3つの部分
JWTは、次の3つを、「.」(ドット)でつないだ文字列です。
xxxxx.yyyyy.zzzzz
| 部分 | 内容 |
|---|---|
| ヘッダー | 署名の方式など(例:HS256) |
| ペイロード | 中身のデータ(利用者ID、有効期限など) |
| 署名 | 改ざんされていないことを確かめる印 |
各部分は、JSONのデータを、Base64URLという方式で、文字に変換したものです。
ペイロードの例
{
"sub": "1234",
"name": "田中",
"exp": 1793000000
}
sub:利用者を示す識別子exp:有効期限(この時刻を過ぎると無効)
重要:中身は、誰でも読める
**JWTは、暗号化ではありません。**ヘッダーとペイロードは、元に戻して、誰でも読めます。
- パスワードや、クレジットカード番号などの秘密の情報は、入れてはいけません
- 守られているのは、「改ざんされていないこと」(署名)
- 「中身を隠す」目的では、使えません
署名のはたらき
署名は、**サーバーだけが知る秘密(鍵)**を使って、ヘッダーとペイロードから計算されます。
- 誰かが、ペイロードを書き換える(たとえば、利用者IDを別人にする)と、署名が合わなくなる
- サーバーが署名を確かめて、一致しなければ、拒否する
署名の方式には、共通の鍵を使う方式(HS256など)と、公開鍵と秘密鍵を使う方式(RS256など)があります。
使われ方:ログインとAPI
- 利用者が、IDとパスワードでログインする
- サーバーが、確認できたら、JWTを発行して返す
- アプリが、JWTを保管する
- APIへのリクエストに、JWTを付けて送る
- サーバーが、署名と有効期限を確かめて、結果を返す
セッションとの違い
| セッション(Cookie) | JWT | |
|---|---|---|
| ログイン状態 | サーバーが覚えておく | JWT自体が情報を持つ |
| 利用者が持つもの | セッションIDという目印 | 署名つきの情報そのもの |
| 長所 | すぐに無効にできる | サーバーが覚えなくてよい(複数のサーバーで使いやすい) |
| 注意点 | サーバーに保存が必要 | 発行後は、取り消しにくい |
セッションの仕組みは、セッションとはで解説しています。
使う時の注意点
① 有効期限を短くする
JWTは、有効期限が切れるまで、有効なままです。盗まれると、期限まで悪用されます。
- 有効期限(
exp)を、短く設定する(数分〜数十分など、用途による) - 期限が来たら、リフレッシュトークン(更新用のトークン)で、新しいものを発行する
② 保管場所に注意する
| 保管場所 | 注意点 |
|---|---|
| localStorage | XSSで、スクリプトから読み取られるおそれがある(XSSとは) |
| HttpOnlyのCookie | スクリプトから読めないが、CSRF対策が別に必要(CSRFとは) |
どちらにも、一長一短があります。システムの構成に合わせて、対策を組み合わせます。
③ 署名を、必ず検証する
- 受け取った時に、署名を必ず確かめる
- 署名なしや、想定外の署名方式を、受け付けないようにする
- 検証は、実績のあるライブラリを使い、自作しない
④ 秘密の情報を入れない
ペイロードは読めるため、パスワード、詳細な個人情報は入れません。最小限の情報(利用者のIDなど)にとどめます。
⑤ 鍵を、きちんと守る
署名に使う秘密の鍵が漏れると、偽のJWTを、いくらでも作れます。コードに直接書かず、安全に管理します(APIキーとは、最小権限の原則)。
JWTが使われる場面
まとめ
- JWTは、情報を署名つきで表した文字列のトークン。ヘッダー・ペイロード・署名を「.」でつなぐ
- 中身は、暗号化されておらず、誰でも読める。秘密の情報は入れない
- サーバーは、署名と有効期限を確かめてから、受け付ける
- 発行後は、取り消しにくい。有効期限を短くし、保管場所と署名の検証に注意する