よろずやIT
用語辞典

JWT(JSON Web Token)とは?構造と仕組み、使う時の注意点を図解

執筆・監修:よろずやIT編集部|編集方針を見る

結論:まずここだけ読めばOK

詳しい手順・原因は、この下で解説しています。

用語辞典のイラスト

結論: JWT(ジェイダブリューティー)は、利用者情報などを、署名つきで表した、文字列のトークンです。ヘッダー・ペイロード・署名の3つを「.」でつないだ形をしています。中身は暗号化されておらず、誰でも読めるため、秘密の情報は入れません。サーバーは、署名と有効期限を確かめてから、リクエストを受け付けます。発行後は取り消しにくいため、有効期限を短くする運用が大切です。

JWTとは

JWTは、JSON Web Token(ジェイソン・ウェブ・トークン)の略です。「この利用者は、ログイン済みで、有効期限はここまで」といった情報を、署名をつけて、1つの文字列にまとめたものです。

APIへのログインや、SSOの仕組みの中で、使われることが多くあります。トークンの基本は、トークンとはをご覧ください。

構造:3つの部分

ヘッダー、ペイロード、署名の3つの部分と、中身は誰でも読めることを示した図解

JWTは、次の3つを、「.」(ドット)でつないだ文字列です。

xxxxx.yyyyy.zzzzz
部分 内容
ヘッダー 署名の方式など(例:HS256)
ペイロード 中身のデータ(利用者ID、有効期限など)
署名 改ざんされていないことを確かめる印

各部分は、JSONのデータを、Base64URLという方式で、文字に変換したものです。

ペイロードの例

{
  "sub": "1234",
  "name": "田中",
  "exp": 1793000000
}

重要:中身は、誰でも読める

**JWTは、暗号化ではありません。**ヘッダーとペイロードは、元に戻して、誰でも読めます。

署名のはたらき

署名は、**サーバーだけが知る秘密(鍵)**を使って、ヘッダーとペイロードから計算されます。

署名の方式には、共通の鍵を使う方式(HS256など)と、公開鍵と秘密鍵を使う方式(RS256など)があります。

使われ方:ログインとAPI

ログインでJWTを発行して、APIのリクエストに付けて送り、サーバーが署名と有効期限を確かめる流れを示した図解

  1. 利用者が、IDとパスワードでログインする
  2. サーバーが、確認できたら、JWTを発行して返す
  3. アプリが、JWTを保管する
  4. APIへのリクエストに、JWTを付けて送る
  5. サーバーが、署名と有効期限を確かめて、結果を返す

セッションとの違い

セッション(Cookie) JWT
ログイン状態 サーバーが覚えておく JWT自体が情報を持つ
利用者が持つもの セッションIDという目印 署名つきの情報そのもの
長所 すぐに無効にできる サーバーが覚えなくてよい(複数のサーバーで使いやすい)
注意点 サーバーに保存が必要 発行後は、取り消しにくい

セッションの仕組みは、セッションとはで解説しています。

使う時の注意点

① 有効期限を短くする

JWTは、有効期限が切れるまで、有効なままです。盗まれると、期限まで悪用されます。

② 保管場所に注意する

保管場所 注意点
localStorage XSSで、スクリプトから読み取られるおそれがある(XSSとは)
HttpOnlyのCookie スクリプトから読めないが、CSRF対策が別に必要(CSRFとは)

どちらにも、一長一短があります。システムの構成に合わせて、対策を組み合わせます。

③ 署名を、必ず検証する

④ 秘密の情報を入れない

ペイロードは読めるため、パスワード、詳細な個人情報は入れません。最小限の情報(利用者のIDなど)にとどめます。

⑤ 鍵を、きちんと守る

署名に使う秘密の鍵が漏れると、偽のJWTを、いくらでも作れます。コードに直接書かず、安全に管理します(APIキーとは、最小権限の原則)。

JWTが使われる場面

まとめ

関連記事:トークンとは、セッションとは、SSOとは、OAuthとは、CSRFとは

PRフロントエンド開発のためのセキュリティ入門 知らなかったでは済まされない脆弱性対策の必須知識 【電子書籍】[ 平野昌士 ]

フロントエンド開発のためのセキュリティ入門 知らなかったでは済まされない脆弱性対策の必須知識 【電子書籍】[ 平野昌士 ]

¥2,970

楽天で見る
SHAREXLINEはてブ

よくある質問

Q.JWTは、暗号化されていますか?

A.されていません。JWTのヘッダーとペイロードは、文字に変換(Base64URLという形式)されているだけで、誰でも元に戻して読めます。守られているのは、改ざんされていないことを確かめる署名です。そのため、パスワードなどの秘密の情報は、JWTの中に入れてはいけません。

Q.JWTと、セッション(Cookie)は、どう違いますか?

A.セッションは、サーバーが、ログイン状態を覚えておき、利用者には、その目印(セッションID)だけを渡す方式です。JWTは、必要な情報そのものを、署名つきで利用者に持たせる方式で、サーバーは、ログイン状態を覚えておかなくて済みます。そのかわり、発行後に取り消しにくいという注意点があります。

Q.JWTは、どこに保管すればいいですか?

A.保管場所には、一長一短があります。ブラウザのlocalStorageは、XSSという攻撃で、スクリプトから読み取られるおそれがあります。HttpOnlyを付けたCookieは、スクリプトから読めませんが、CSRFへの対策が別に必要です。システムの構成に合わせて、組み合わせて対策します。

Q.JWTを無効にしたい時は、どうしますか?

A.JWTは、有効期限が切れるまで、有効なままです。そのため、有効期限(exp)を短くして、期限が来たら、更新用のトークン(リフレッシュトークン)で、新しいものを発行する運用が一般的です。すぐに無効にしたい場合は、サーバー側で、無効なトークンの一覧を管理する仕組みが必要になります。

Q.『署名の検証をしない』とは、どういうことですか?

A.署名を確かめずに、JWTの中身を信用してしまうことです。この場合、攻撃者が、中身を書き換えたJWTを送ると、そのまま受け付けてしまいます。ライブラリの設定で、署名の検証を必ず行い、許可しない署名方式(『なし』など)を、受け付けないようにします。

関連記事

最新のIT関連書籍 トップ10

PR / 楽天市場の売れ筋ランキングを定期的に取得しています。価格は変動する場合があるため、購入前に各ストアでご確認ください。