NewIntroducing QODEX QA Services — platform-powered QA for API-driven teams.Learn more →
QA Learning1 min read

JWT解説: 構造、セキュリティ、ベストプラクティス

S
Shreya Srivastava
Content Team

JWTとは?

JSON Web Tokens (JWT)は、2者間でデータを安全に送受信するための標準化された方法です。JWTにはJSONフォーマットでエンコードされた情報(クレーム)が含まれています。これらのクレームは関係する当事者間で特定の詳細を共有するのに役立ちます。

JWTの本質は、JSONデータの真正性を検証するメカニズムです。各JWTは暗号技術を使用してデジタル署名されており、送受信中や保存中にその内容が改ざんされていないことを保証します。

JWTはデータの所有権を保証しますが、暗号化は保証しない点に注意が必要です。JWTはシリアライズされていますが暗号化されていないため、トークンを傍受した人誰でも内容を確認できます。

JWTはHTTPSと組み合わせて使用することが強く推奨されており、これは一般的なWebセキュリティの実践にも通じます。HTTPSは送受信中のJWTの内容の機密性を保護するだけでなく、転送中のデータに対してより広い保護層を提供します。

JWTは次のような文字列です:
xxxxx.yyyyy.zzzzz

3つの部分で構成されています:

  1. Header: トークンの種類(JWT)と使用されるアルゴリズム(HS256など)を示します。

  2. Payload: 実際のデータ(ユーザーID、ロール、権限など)を含みます。

  3. Signature: トークンが誰かによって変更されていないことを確認します。

JWTはどのように機能しますか?

JWT認証の仕組み

1. ユーザーがログインする

  • ユーザーがユーザー名とパスワードを入力します。

  • サーバーが認証情報を確認します。

  • 正しい場合、サーバーはユーザー情報(例: userId: 123, role: "admin")を含むJWTを作成し、秘密鍵で署名します。

2. トークンがクライアントに送信される

  • JWTはクライアントに返送されます(通常はログインレスポンス内)。

  • クライアントはそれを安全に保存します(localStorage、sessionStorage、またはCookie)。

3. クライアントがリクエストにJWTを添付する

  • 保護されたAPIへのすべてのリクエストで、クライアントはAuthorizationヘッダーにJWTを次のように添付します:
    Authorization: Bearer <JWT>

  1. サーバーがJWTを検証する

  • サーバーがトークンを受信します。

  • 秘密鍵を使用して署名を確認します:

    • 有効な場合: 内部のデータ(ユーザーロールなど)を信頼します。

    • 無効な場合: リクエストを拒否します(401 Unauthorized)。

5. アクセスの許可または拒否

  • トークンが有効でユーザーが適切な権限を持っている場合: サーバーはアクセスを許可します。

  • そうでない場合: サーバーはアクセスを拒否します。

JWT

例:

  1. ユーザーがログインすると、JWTを取得します:
    { "userId": 123, "role": "admin" }

  2. ユーザーがトークンを使って /admin/dashboard にアクセスします。

  3. サーバーが role = "admin" を確認します。

  4. アクセスが許可されます。

マイクロサービス、サーバーレス、分散アーキテクチャにおけるJWT

モダンな分散システムやサーバーレスシステムでは、JWTは共有セッション状態を不要にするため非常に有効です。トークンを一度発行すれば、中央集権的なセッションストレージなしに複数のサービス間で検証できます。

分散コンテキストにおけるベストプラクティス:

  • マイクロサービスが対称秘密鍵を共有せずに検証できるよう、非対称署名(RS256/ES256)を使用します。

  • リプレイ攻撃と悪用を防ぐため、audience(audissuer(issjti(JWT ID)nbf(not before)クレームを含めます。

  • 有効期間の短いアクセストークンとリフレッシュトークンのローテーションを組み合わせて露出リスクを最小化します。

このセクションはJWTの分散システムにおける現実的なスケーラビリティとセキュリティを理解するのに役立ちます。

トークンのリフレッシュと失効に関するガイダンスは、APIセキュリティチェックリストをご参照ください。

JWTの構造

JWT(JSON Web Token)の構造は、ドット(.)で区切られた3つの主要な部分で構成されています:

  1. Header

    • トークンのメタデータ(トークンの種類(JWT)や使用される署名アルゴリズム(例: HS256RS256)など)を含みます。

    • 例:

  2. Payload

    • トークンが持つ実際のデータ(クレームと呼ばれる)を含みます。

    • クレームはユーザーに関するもの(user_idroleなど)またはトークンのメタデータ(有効期限など)の場合があります。

    • 例:

  3. Signature

  • エンコードされたHeaderとエンコードされたPayloadを取得し、指定されたアルゴリズムで秘密鍵を適用して作成されます。

  • トークンが改ざんされていないことを確認します。

  • 計算式:

最終的なJWTは次のようになります:

  • xxxxx: エンコードされたHeader

  • yyyyy: エンコードされたPayload

  • zzzzz: Signature

JWTの構造

JWTの例(ステップごと):

  1. Header(エンコード前)

Base64Urlエンコード後: Base64エンコーダーでBase64エンコードを試したり、Base64デコーダーで既存のトークンをデコードすることができます。

  1. Payload(エンコード前)

Base64Urlエンコード後:

  1. Signature

次の組み合わせを使用します:

Base64UrlEncode(Header) + "." + Base64UrlEncode(Payload)

次にHMACSHA256と秘密鍵(例: mysecretkey)でハッシュ化します。

例の結果:

最終的なJWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImV4cCI6MTcxNjAwMDAwMH0.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

JWT

{最初の2つの部分はJSONにデコードできますが(Header + Payload)、Signatureは秘密鍵を持っていないと検証できません。これがJWTが整合性と信頼性を保証する仕組みです。}

一般的な攻撃シナリオとその対策

一般的なJWTの攻撃ベクトルと具体的な対策を示します:

攻撃/リスク

説明

対策

トークン盗難(XSS/localStorage経由)

攻撃者がクライアントサイドのJSに保存されたJWTを盗みます。

HTTP-onlyのCookieを使用し、SameSiteフラグを設定し、SecureCookieを優先します。

アルゴリズム改ざん("none"攻撃)

攻撃者が algnone に変更して署名検証をバイパスします。

alg: noneのトークンを拒否します。承認されたアルゴリズムのみをホワイトリスト化します。

鍵の混乱/鍵インジェクション

弱いまたは不一致の署名鍵の使用。

強力な暗号鍵を使用し、定期的にローテーションし、JWTヘッダーの kid(鍵ID)を検証します。

リプレイ攻撃

トークンが傍受されて悪意を持って再利用されます。

一意の jti を含め、nbfexp クレームを検証し、失効した jti 値のブラックリストまたはストアを維持します。

リフレッシュトークン、ローテーション、失効戦略

JWTは本質的に失効をサポートしていないため、トークンの更新と無効化が重要です。安全なトークンのリフレッシュと失効ワークフローを実装するための戦略を示します:

  • リフレッシュトークンのローテーション: リクエストごとに新しいリフレッシュトークンを発行し、前のものを無効化してリプレイリスクを低減します。

  • 有効期間の短いアクセストークン: 短い有効期限(例: 5から15分)を使用し、継続的なアクセスにはリフレッシュを必要とします。

  • ブラックリスト/トークンストア: 侵害されたトークンを拒否するために、失効した jti 識別子の軽量ストアを維持します。

  • 猶予ウィンドウと再利用検出: リフレッシュのための狭い重複ウィンドウを許可しますが、古いリフレッシュトークンの再利用をブロックします。

これにより、開発者が安全なトークンライフサイクル管理のための明確な設計指針を得ることができます。

例: Python/Go/JavaでのJWT作成とバリデーション

JWTのメリット

JWT(JSON Web Token)使用の主なメリット:

  1. ステートレス認証

    • JWTはサーバー上にセッションデータを保存する必要がありません。

    • サーバーはトークンを検証するだけでよく、スケーラブルで効率的です。

  2. コンパクトで高速

    • JWTはサイズが小さく(JSONフォーマット)、ヘッダー、URL、またはCookieで簡単に送信できます。

    • クライアントとサーバー間での送受信が高速です。

  3. 安全(正しく使用した場合)

    • JWTはHMACやRSAなどのアルゴリズムを使用して署名されており、データの整合性を確保します。

    • 秘密鍵/秘密鍵ペアが知られていない限り改ざんできません。

  4. クロスドメイン/クロスプラットフォームのサポート

    • JWTは分散システム、マイクロサービス、APIで適切に機能します。

    • モバイルアプリ、Webアプリ、さまざまなドメインにわたって使用できます。

  5. 自己完結型

    • JWTはトークン内に必要なすべてのユーザー情報(クレーム)を持ちます。

    • 認証のためのデータベース検索の繰り返しが削減されます。

  6. 柔軟性

    • JWTはカスタムデータ(ロール、権限、有効期限)を格納できます。

    • アクセス制御ときめ細かいセキュリティに有用です。

  7. 広く採用されている

    • JWTは標準規格(RFC 7519)であり、多くのライブラリ、フレームワーク、プログラミング言語でサポートされています。

まとめると: JWTは現代のWebおよびモバイルアプリケーションにおける認証をよりシンプルで、高速で、スケーラブルにします。

まとめ

適切なAPIインベントリを構築・維持し、JWTのような安全な認証方法を使用することは、現代の組織にとってもはや選択肢ではなく必須となっています。更新されたAPIインベントリにより、ビジネスは可視性を高め、コンプライアンスを改善し、見落とされるAPIがないようにすることでセキュリティを強化できます。同時に、JWTは認証を処理するためのスケーラブルで安全な方法を提供し、アプリケーションをより高速で管理しやすくします。

強力なAPI管理と信頼性の高い認証を組み合わせることで、組織はデジタル資産を保護し、リスクを低減し、効率を向上させることができます。Qodex.aiでは、セキュリティとシンプルさは両立すべきであり、ビジネスが安全性を損なうことなくイノベーションを推進できると考えています。


よくある質問

JSON Web Token (JWT)とは何ですか?なぜ使用されるのですか?

JSON Web Token(JWT)は、2者間で情報を安全に送受信するために使用されるコンパクトなデジタル署名付きトークンです。セッションデータを保存せずにユーザーのアイデンティティを検証できるため、Webアプリケーションでの認証と認可に広く使用されています。JWTにはユーザーのロールや権限などのエンコードされたクレームが含まれており、ステートレスな通信を維持しながらシステムがアクセスリクエストを効率的に検証できます。

現代のアプリケーションにおけるJWT認証の仕組みは?

JWT認証は、ユーザーが正常にログインした後にトークンを発行することで機能します。サーバーは重要なユーザーデータをエンコードし、クライアントに送信する前に秘密鍵で署名します。クライアントがリクエストを行うたびにトークンを含め、サーバーがその真正性を検証します。このステートレスなプロセスはデータベース検索を削減し、スケーラビリティを向上させ、マイクロサービスとAPI間の安全な通信を簡素化します。

JWTの主要な構成要素は何ですか?

JSON Web Tokenは、ドットで区切られたHeader、Payload、Signatureの3つの部分で構成されています。Headerはアルゴリズムを定義し、Payloadはユーザーデータやクレームを保持し、Signatureは暗号ハッシュを使用してトークンの整合性を確保します。これらの要素が組み合わさることで、JWTは分散システムでの安全で高性能な認証に最適な、軽量で改ざん耐性のある形式になります。

JWTをlocalStorageやCookieに保存するかどうかはセキュリティモデルによって異なります。localStorageはトークン管理をシンプルにしますが、サイトが適切にサニタイズされていない場合はXSS攻撃にトークンが露出します。一般的に、セキュアでHTTP-onlyのCookieの方が安全です。クライアントサイドからのアクセスを防ぐことができるためです。機密性の高いアプリケーションでは、Cookieとトークンのライフタイムとリフレッシュトークンのペアリングによって、ユーザーエクスペリエンスに影響を与えることなくJWTセキュリティを向上できます。

JWTとOAuthトークンの違いは何ですか?

JWTとOAuthトークンはしばしば一緒に機能しますが、異なる役割を持ちます。OAuthはクライアントがトークンを取得する方法を定義する認可フレームワークであり、JWTはそのプロセス内で使用されるトークン形式です。本質的に、OAuthがルールを提供し、JWTが構造を提供します。JWTベースのOAuth実装はオーバーヘッドを削減し、シームレスなステートレス認証をサポートするため、現代のAPIで好まれています。

JSON Web Tokenを安全に保護するためのベストプラクティスは何ですか?

JWTを効果的に保護するには、常に強力な秘密鍵または非対称暗号化を使用し、すべてのリクエストで署名を検証し、短い有効期限を設定します。JWTはBase64エンコードされているだけで暗号化されていないため、Payload内に機密データを保存することは避けます。傍受を防ぐためにトークン失効メカニズムとHTTPSを実装します。これらのプラクティスに従うことで、JWTベースの認証が現代のAPIセキュリティ標準に準拠した、スケーラブルで安全な状態を維持できます。