JWTとは?初心者でも仕組みとセキュリティ入門ガイド
公開日:
最終更新日:
26 views
はじめに
「JWTって最近よく聞くけど、どういう仕組み?」「セキュリティ的に本当に安全なの?」
WebアプリやAPIの開発に携わる人なら、一度は目にしたことがある「JWT」。しかし、内部構造や使い方、セキュリティの観点まで理解できている方は意外と少ないかもしれません。
JWTは、ユーザーの認証情報などを安全にクライアントとサーバー間でやり取りするためのトークン技術です。この記事では、JWTの基本構成や仕組み、セキュリティ上のメリット・注意点について、初心者にもわかりやすく解説します。
JWTとは?基本概念と誕生の背景
JWTは、Webサービスやアプリケーションで安全かつ効率的にユーザー認証や情報のやり取りを行うために設計された、オープン標準のトークン技術です。
JWTは“トークンの入れ物(フォーマット)”で、署名付き(JWS)または暗号化付き(JWE)として表現できます。
一般的によく使われるのは署名付きJWTで、これは改ざん検知(完全性)を提供しますが、内容の秘匿(機密性)は提供しません。
内容を第三者に読まれたくない場合は、別途設計(例:JWE、もしくはJWTに機密情報を入れない)を行います。
出典:RFC 7519 | JSON ウェブトークン JWT
JWTの最大の特徴は、トークン自体が「誰が」「どんな権限で」「いつまで有効か」といった情報を内包していることです。
たとえば、サーバーは「このユーザーは管理者である」といった情報を含むトークンを発行し、クライアントはそのトークンを提示することで、自身の権限や認証状態を証明できます。
出典:RFC 7518 | JSON Web アルゴリズム (JWA)
出典:Java 用 JSON Web Token | OWASP チートシートシリーズ
JWTが誕生した背景には、Webの進化に伴う認証やセッション管理の課題があります。もともとWebは静的なコンテンツ配信が主流で、ユーザーごとの状態管理は不要でした。
ただし、ショッピングサイトやSNSなど動的なサービスが普及するにつれ、ユーザーごとの認証や権限管理が不可欠になりました。
一方で、即時失効やログアウト、権限変更の反映を重視する場合はサーバー側で状態管理を併用する設計も一般的です。要件(セキュリティ、運用、UX)に応じて選択します。
特に、複数のサーバーやマイクロサービス間で認証情報を共有する場合、JWTのような自己完結型のトークンが有利です。
OpenID Connectでは、ID TokenはJWTとして表現されます。
一方、OAuth 2.0のAccess Tokenは仕様上“クライアントにとって通常は不透明(opaque)”で、JWTである必要はありません(JWT形式のAccess Tokenを採用する実装もあります)。この違いにより、検証方法(署名検証/内省)や失効設計が変わります。
このように、JWTは「安全に・効率よく・柔軟に」認証や情報のやり取りを実現するために生まれ、今やWeb開発に欠かせない存在となっています。
出典:最終版:エラッタ セット2を組み込んだ OpenID Connect Core 1.0
トークン認証の仕組みと従来方式との違い

トークン認証は、現代のWebサービスやAPIで広く採用されている認証方式です。ユーザーが一度認証されると「トークン」と呼ばれる一時的なアクセス許可証が発行され、以降はそのトークンを提示するだけで認証が成立します。
この仕組みは、従来の「セッションID方式」や「毎回パスワード認証」といった方式と比べて、セキュリティや運用面で多くの利点があります。
従来方式では、ユーザーがサービスにアクセスするたびにメールアドレスやパスワードといった認証情報をサーバーに送信し、サーバーはその都度データベースで照合して認証を行っていました。
この方式は毎回パスワードを送信するため、通信が盗聴された場合に認証情報が漏洩するリスクが高くなります。また、セッションID方式では、サーバー側でユーザーごとのセッション情報を保持し続ける必要があり、サーバーの負荷増加やスケーラビリティの課題が生じます。
一方、トークン認証方式では、初回ログイン時にのみユーザー名やパスワードを送信し、認証に成功するとサーバーからトークンが発行されます。このトークンは、ユーザーの権限や有効期限などの情報を含み、以降のリクエストではトークンのみを送信することで、パスワードの漏洩リスクが大幅に低減します。
出典:JWTとは?トークンベースの認証の仕様とJWTのメリット、デメリット
出典:RFC 6750 - OAuth 2.0 認可フレームワーク|ベアラートークンの使用
出典:Java 用 JSON Web Token - OWASP チートシートシリーズ
JWTの構造:ヘッダー・ペイロード・署名
JWTは、Web認証やAPI連携で広く使われているトークン形式で、その構造は「ヘッダー(Header)」「ペイロード(Payload)」「署名(Signature)」の3つの部分に分かれています。それぞれの役割と仕組みを詳しく見ていきましょう。
出典:初心者向けJWT講座:JSON Web Tokenを使った認証の仕組み
ヘッダー(Header)
ヘッダーは、JWTの基本情報を示す部分です。主に「署名アルゴリズム(alg)」と「トークンの種類(typ)」が記載されます。たとえば、
json
{
"alg": "HS256",
"typ": "JWT"
}
この例では、「HS256」というHMAC-SHA256アルゴリズムを使い、「JWT」トークンであることを示しています。ヘッダーはJSON形式で記述され、Base64URLでエンコードされてJWTの最初の部分となります。
ペイロード(Payload)
ペイロードは、JWTの本体とも言える部分で、ユーザー情報や権限、有効期限などのデータ(クレーム)が含まれます。たとえば、
json
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
「sub」はユーザーID、「name」はユーザー名、「iat」は発行日時を表しています。これらの項目は「クレーム」と呼ばれ、標準クレーム(例:exp, iss, audなど)と独自クレームの両方を含めることができます。ペイロードもJSON形式で記述され、Base64URLでエンコードされてJWTの2番目の部分となります。
出典:初心者向けJWT講座:JSON Web Tokenを使った認証の仕組み
署名(Signature)
署名は、JWTが改ざんされていないことを**検証(改ざん検知)**するために不可欠です。エンコード済みのヘッダーとペイロードを「.(ドット)」で連結し、指定されたアルゴリズムと秘密鍵(または公開鍵)を使って署名を生成します。たとえば、
text
HMACSHA256(
Base64URLEncode(header) + "." +
Base64URLEncode(payload),
secret
)
この結果もBase64URLでエンコードされ、JWTの最後の部分となります。署名により、トークンが発行者によって作成され、途中で改ざんされていないことを検証できます。
JWT全体の構造
これら3つのパートは「.(ドット)」で連結され、
<ヘッダー>.<ペイロード>.<署名>
という1つの文字列となります。たとえば、
text
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
のような形です。
このように、JWTは3つの明確なパートで構成されており、それぞれが役割を持つことで、安全かつ効率的な認証や情報伝達を実現しています。
JWTの生成と流れ
JWTの生成から認証までの流れは、WebサービスやAPIの認証基盤として広く活用されています。ここでは、その一連のプロセスを具体的に解説します。
JWTの生成(発行)
まず、ユーザーがログインフォームなどからIDとパスワードを送信し、サーバーはこれを受け取って認証成功時にJWTを生成します。
JWTの配布
生成されたJWTは、サーバーからクライアント(ブラウザやアプリ)に返されます。クライアントはこのトークンをローカルストレージやCookieなどに安全に保存します。
JWTの利用(認証リクエスト)
認証が必要なAPIやページにアクセスする際、クライアントは保存しておいたJWTをHTTPリクエストのヘッダー(一般的にはAuthorization: Bearer <JWT>)に含めて送信します。
JWTの検証(サーバー側)
最低限、署名(または暗号)検証に加えて、expだけでなくiss(発行者)とaud(想定受信者)を要件に応じて必ず検証し、用途の取り違え(別API向けトークンの流用)を防ぐ必要があります。
まず、JWTをヘッダー・ペイロード・署名に分解し、ヘッダーに記載されたアルゴリズムとサーバーが持つ鍵で署名部分を検証します。
続いて、ペイロード内の有効期限(exp)や発行者(iss)、利用者(sub)などを確認し、トークンが有効かどうかを判定する流れです。
認証の成立とアクセス許可
署名とペイロードの内容が正しければ、リクエストは認証済みとして処理され、必要なリソースへのアクセスが許可されます。もし検証に失敗した場合や有効期限が切れている場合は、認証エラーとなりアクセスが拒否されます。
このように、JWTは「発行→配布→利用→検証」というシンプルな流れで認証を実現します。サーバー側でセッション情報を保持する必要がなく、スケーラブルかつ効率的な認証基盤を構築できるのが大きな特徴です。
出典:JSON Web Token (JWT)の使用を開始する
JWTの主な用途と活用シーン
JWTは、現代のWebサービスやアプリケーションで幅広く利用されているトークン技術です。その主な用途は「ユーザー認証」と「情報交換」に集約されますが、具体的な活用シーンは多岐にわたります。
まず、最も代表的なのが「ユーザー認証」です。JWTはトークン自体に認証情報を含みます。
たとえば、ユーザーがログインに成功するとサーバーがJWTを発行し、以降のリクエストでそのトークンを提示することで、認証状態を維持できます。
また、シングルサインオン(SSO)の仕組みでも活躍しています。SSOとは、一度のログインで複数のサービスを利用できる仕組みで、GoogleやFacebookなどの外部IDプロバイダーによる認証連携にもJWTが使われています。IDプロバイダーが発行したJWTを他のサービスに提示することで、ユーザーは追加のログインなしに複数サービスを利用できるようになります。
さらに、API認証やマイクロサービス間の認証にも有用です。REST APIやGraphQL APIなど、サーバーとクライアントが分離されたアーキテクチャでは、各リクエストにJWTを付与することで、APIごとに認証・認可を効率的に行えます。マイクロサービス間での認証情報の共有にも適しており、トークンの自己完結性がシステム全体のパフォーマンスと柔軟性を高めます。
加えて、情報交換の用途で活用されるケースもあります。
JWT(アクセストークン)の送信には、一般に Authorization: Bearer の使用が推奨されます。URLクエリにトークンを載せる方法はログや履歴に残りやすいためRFC 6750でも非推奨(SHOULD NOT)とされています。
このように、JWTは「認証」「認可」「情報交換」など多様なシーンで利用されており、その軽量性・自己完結性・拡張性が現代のWeb開発やAPI設計において不可欠な存在となっています。特に、クラウドやマイクロサービスの普及に伴い、スケーラブルかつセキュアな認証基盤として今後もますます重要性が高まる技術です。
出典:RFC 6750 - OAuth 2.0 認可フレームワーク| ベアラートークンの使用
JWTのメリット:なぜ選ばれるのか

JWTが多くのWebサービスやAPI認証で選ばれる理由は、その「ステートレス性」「改ざん検知」「スケーラビリティ」「パフォーマンス」「拡張性」など、現代の開発ニーズに合致した数多くのメリットがあるからです。
まず最大の特徴は「ステートレス認証」が実現できる点です。JWTはトークン自体にユーザー情報や権限、有効期限などの必要なデータをすべて含んでいるため、サーバー側でセッション情報を保持する必要がありません。
この仕組みにより、サーバーの負荷を大幅に軽減でき、分散システムやクラウド環境、マイクロサービス構成など、スケールアウトが求められるシステムに最適です。
次に「改ざん検知」の強さも大きなメリットです。JWTには独自の署名機能があり、トークンの内容が改ざんされていないかをサーバー側で容易に検証できます。署名にはHMACやRSAなどの暗号アルゴリズムが使われるため、トークンが第三者によって不正に書き換えられるリスクを大幅に低減できます。
「パフォーマンス向上」も見逃せません。サーバー側でセッション管理を行わず、トークンの検証だけで認証が完結するため、応答速度が向上し、リクエストごとの負荷も最小限に抑えられます。
また、JWTはコンパクトであり、HTTPヘッダー等で送ることができます。ただしアクセストークンをBearerとして運用する場合、URLクエリに載せるのは避け、Authorizationヘッダーを優先します。
さらに「拡張性」に優れている点も魅力です。JWTはJSONベースの構造を持つため、必要に応じて新しいフィールドやクレームを簡単に追加できます。これにより、認証だけでなく、ユーザー属性や権限情報などを柔軟に管理・拡張することができます。
このように、JWTはサーバーレスでスケーラブルな認証基盤を実現しつつ、改ざん検知やパフォーマンス、拡張性といった現代のWeb開発に欠かせない要素を高いレベルで満たしています。これらの理由から、多くの開発者や企業に選ばれているのです。
JWTのデメリットと注意点
JWTは多くのメリットがある一方で、導入時にはいくつかのデメリットや注意点も存在します。まず大きな課題として挙げられるのが「トークンの無効化が困難」という点です。
JWTはステートレスな仕組みのため、サーバー側でトークンの状態を管理しません。そのため、一度発行されたトークンは有効期限が切れるまで有効であり、万が一トークンが漏洩した場合でも即座に無効化することができません。
強制ログアウト機能などを実装するには、ブラックリスト(Redis等)を用いるなどの追加設計が必要です。
また、「トークンの盗難リスク」も重要な注意点です。JWTはクライアント側で保存されるため、何らかの方法でトークンが盗まれると、攻撃者はそのトークンを使って正規ユーザーになりすませてしまいます。
特に有効期限が長いトークンの場合、被害が拡大するリスクが高まります。クライアントサイドでの安全なトークン管理が不可欠です。
「トークンサイズが大きくなる可能性」もデメリットの一つです。JWTは必要な情報をすべてトークン内に持たせるため、トークンが肥大化しやすく、HTTPヘッダーやCookieで送信する際にネットワーク負荷やパフォーマンス低下を招く場合があります。
さらにJWTの署名には秘密鍵(または共通鍵)が使われますが、この秘密鍵が漏洩した場合、システム全体が危険にさらされる恐れがあります。鍵管理の徹底が求められます。
alg: noneは、署名が必須の運用(例:認証・認可)では原則として受け入れるべきではありません。一方で、RFC 8725では『JWTがTLSなど他の手段でエンドツーエンドで暗号論的に保護されており、かつアプリケーションが明示的に許可する場合』にはnoneが成立し得るケースも示されています。重要なのは、受信側が“受け入れるアルゴリズムを固定し、意図しないnoneを絶対に通さない”ことです。
これらのデメリットや注意点を理解し、適切な運用・実装を行うことが、JWTを安全に活用するための鍵となります。
出典:RFC 8725: JSON Web Token の現在のベストプラクティス
セキュリティ対策:安全なJWT運用のポイント
JWTを安全に運用するためには、いくつかの重要なセキュリティ対策を徹底する必要があります。以下に、実践的なポイントをまとめます。
強力な署名アルゴリズムの選定と固定
JWTの署名アルゴリズムは、HMAC(HS256など)やRSA(RS256など)のような強力なものを選び、実装時にアルゴリズムを固定してください。「none」アルゴリズムや弱い署名方式を許可すると、なりすましや改ざんのリスクが高まります。
秘密鍵(シークレットキー)の厳重管理
署名や検証に使う秘密鍵は、環境変数など安全な場所で管理し、コードやリポジトリに直接書かないようにします。鍵が漏洩するとトークン偽造や不正アクセスにつながるため、定期的なキーローテーションも有効です。
トークンの有効期限を適切に設定
有効期限が長すぎると、トークンが盗まれた際に長期間悪用されるリスクがあります。システムの用途やリスクレベルに応じて、短めの有効期限を設定し、必要に応じてリフレッシュトークン方式を併用してください。
トークンの保存方法に注意
クライアント側でのトークン保存はXSSやCSRF攻撃に注意が必要です。Cookieで保存する場合は「HttpOnly」「Secure」属性を付与し、ローカルストレージ利用時はXSS対策を徹底しましょう。
トークンに機密情報を含めない
JWTのペイロードはBase64URLでエンコードされているだけで暗号化されていません。つまり、誰でもデコードして中身を読める状態です。
ユーザー名やパスワードなどの機密情報は絶対に含めず、必要最小限の情報のみを格納しましょう。
署名の正当性検証を必ず行う
サーバー側でJWTを受信した際は、必ず署名の正当性を検証してください。これにより、改ざんやなりすましを防止できます。
アルゴリズムのハードコーディングに注意
受信したJWTのアルゴリズムを信用せず、サーバー側で許可するアルゴリズムを明示的に指定しましょう。悪意のある攻撃者によるアルゴリズム変更を防ぎます。
HTTPS通信の徹底
トークンの送受信は必ずHTTPSで行い、盗聴や中間者攻撃を防ぎます。
ライブラリとアプリケーションの最新化
JWT関連の脆弱性はライブラリやアプリのアップデートで修正されることが多いため、常に最新のバージョンを利用しましょう。
その他のセキュリティ施策と併用
JWT単体での対策に頼らず、WAFやIDS、アクセス制御など他のセキュリティ対策と組み合わせて運用することが重要です。
これらのポイントを守ることで、JWTの強みを活かしつつ、安全な認証・認可システムを構築できます。
実践!JWTの実装手順と検証方法

JWTの実装は、ユーザー認証の自動化やAPIセキュリティ強化のために多くの現場で採用されています。ここでは、一般的なWebアプリケーション(Node.js + Expressなど)を例に、JWTの実装手順と検証方法をわかりやすく解説します。
必要なパッケージのインストール
まず、JWTの生成・検証には専用ライブラリが必要です。Node.jsの場合は以下のようにインストールします。
text
npm install express jsonwebtoken body-parser
ユーザー認証とJWTの発行
ログインAPIでユーザー名とパスワードを受け取り、認証に成功したらJWTを生成します。JWTにはユーザー名やIDなどの情報をペイロードとして含めます。また署名には、共通鍵方式(HS256など)の場合はサーバーのみが知るシークレットキーを、公開鍵方式(RS256など)の場合は秘密鍵を使用します。
javascript
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: "1h" });
res.json({ token });
クライアントへのトークン送信と保存
発行したJWTは、クライアント(ブラウザやアプリ)に返します。クライアント側はトークンをローカルストレージやCookieなどに安全に保存します。
JWTを含めたリクエスト送信
認証が必要なAPIにアクセスする際、クライアントはHTTPリクエストのヘッダー(例:Authorization: Bearer <JWT>)にトークンを付加して送信します。
JWTの検証(サーバー側)
サーバーは受信したリクエストからJWTを取得し、署名の正当性や有効期限を検証します。Node.jsの場合は以下のように行います。
javascript
const decoded = jwt.verify(token.split(" ")[1], SECRET_KEY);
認証後の処理
検証に成功すれば、ペイロードからユーザー情報を取得し、リクエストを認証済みとして処理します。失敗した場合は401などのエラーを返します。
まとめ
JWTは、デジタル署名による改ざん防止とステートレスな運用を両立させ、現代のWeb認証における新たな常識を確立しました。サーバー側でセッション状態を保持する必要がないため、負荷軽減やスケーラビリティの向上に寄与し、マイクロサービスやクラウド環境といった分散システムにおいて不可欠な存在となっています。
しかし、その利便性の反面、トークンの即時失効が難しいことや、盗難時のリスクといった固有の課題も併せ持っています。安全な運用を実現するためには、有効期限を短く設定し、HTTPS通信を徹底することはもちろん、機密情報をペイロードに含めないといった適切な設計指針が欠かせません。
JWTは、効率性と拡張性を兼ね備えた極めて強力な技術です。その特性と限界を正しく理解し、セキュリティ対策と運用設計を両立させることで、今後もWebアプリケーション開発を支える信頼性の高い認証基盤として、その活用はさらに広がっていくでしょう。
監修者
横浜国立大学理工学部卒。
株式会社DYMに新卒一期生として2011年に入社し、WEBプロモーションなどのデジタルマーケティング領域で業務に従事し、その後新規事業立ち上げを経験。
2015年よりDYMの人事部へ異動し人事領域を統括、毎年多くの就活生や求職者との面接・面談を実施。
内定チャンネルなどの採用関連メディアへの出演や記事監修を通して人事・人材関連の情報を発信中。
関連コラム
人気のコラム
カテゴリー
タグ
- #事務職
- #派遣社員
- #正社員
- #未経験
- #給与
- #転職
- #総務
- #キャリアアップ
- #営業事務
- #医療事務
- #経理事務
- #人事事務
- #総務事務
- #貿易事務
- #秘書事務
- #特許事務
- #受付事務
- #不動産事務
- #法務事務
- #学校事務
- #外勤事務
- #一般事務
- #広報事務
- #自由業
- #ホワイトハッカー
- #委託
- #委任
- #フリーランス
- #個人事業主
- #エンジニア
- #プログラマー
- #イラストレーター
- #資格
- #報酬
- #セキュリティエンジニア
- #インフラエンジニア
- #JAVA
- #Qiita
- #NET Framework
- #CCNA
- #Oracle
- #AWS
- #自営業
- #日商
- #mos
- #勉強時間
- #アルゴリズム
- #SNS
- #プログラミング
- #OSPF
- #プロトコル
- #Word
- #WEBアプリケーション
- #ルーティング
- #高卒
- #ボーナス
- #Linux
- #OS
- #履歴書
- #職務経歴書
- #第二新卒
- #新卒
- #中途
- #アプリ
- #ネットワーク
- #ソフトウェア
- #オープンソース
- #クラウド
- #ファイアウォール
- #サイバー攻撃
- #セキュリティ
- #API
- #AI
- #オープンソースソフトウェア

