---
schema_version: "1"
id: d1d95311563095406e38a968b7c2b3b62a26fb0ef2a311148a47ce1a136e6415
title: JWT 検証ポリシー
collection: mulesoft
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/mulesoft/current/ja-jp/mule-gateway/policies-included-jwt-validation.md
canonical_url: https://docs.mulesoft.com/jp/mule-gateway/policies-included-jwt-validation
source_site: docs.mulesoft.com
content_type: documentation
content_hash: cdba20aae70845e7b5025a76a7e6fff6946338a058137e6b0ef08bbfd94e0d82
description: MuleSoft Documentation Site
latest: true
---
# JWT 検証ポリシー

<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-right valign-top"><p class="tableblock"><strong>ポリシー名</strong></p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>JWT 検証</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-right valign-top"><p class="tableblock"><strong>概要</strong></p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>JWT トークンを検証する</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-right valign-top"><p class="tableblock"><strong>カテゴリ</strong></p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>セキュリティ</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-right valign-top"><p class="tableblock"><strong>使用可能な最小 Mule バージョン</strong></p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>v4.1.0</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-right valign-middle" rowspan="4"><p class="tableblock"><strong>返される状況コード</strong></p></td>
<td class="tableblock halign-left valign-top"><div class="content"></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>400 - トークンが要求で提供されなかった。</p>
</div>
<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-right valign-middle" rowspan="3"><div class="content"><div class="paragraph">
<p>401</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>署名が検証されなかった、または無効である。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>必要ないくつかのクレームがない、またはクレームの検証に失敗した。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>トークンの解析に失敗した。</p>
</div></div></td>
</tr>
</tbody>
</table></div></td>
</tr>
</tbody>
</table>

## [](#概要)概要

JSON Web Token (JWT) は、2 者間で転送されるクレームを表す URL セキュアな方法です。JWT のクレームは、JSON Web Signature (JWS) のペイロードまたはプレーンテキストの JSON Web Encryption (JWE) 構造として使用される JSON オブジェクトとしてエンコードされます。これにより、クレームはデジタル署名したり、メッセージ認証コード (MAC) で整合性を保護したりできます。トークンは署名されるので、その情報と情報源を信頼できます。

JWT 検証ポリシーは、トークンの署名を検証し、JWS 形式の JWT を使用してすべての受信要求のクレームの値をアサートします。このポリシーでは、JWE を使用する JWT は検証されません。

## [](#ポリシーのパラメーターの設定)ポリシーのパラメーターの設定

### [](#mule-ゲートウェイ)Mule ゲートウェイ

UI からポリシーを API に適用するときに、環境に Mule アプリケーションがあるか非 Mule アプリケーションがあるかに基づいて、パラメーターのリストが表示されます。

#### [](#mule-アプリケーションのパラメーターの設定)Mule アプリケーションのパラメーターの設定

Mule アプリケーションの場合、環境に Mule アプリケーションがあるかどうかに基づいて、次のパラメーターが表示されます。

<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">要素</th>
<th class="tableblock halign-left valign-top">説明</th>
<th class="tableblock halign-left valign-top">例</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">JWT Origin (元の JWT)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">要求のどこから JWT が抽出されるのかを指定します。
* HTTP ベアラー認証ヘッダー
* カスタム式</p>
<p class="tableblock">この項目を ​<code>HTTP Bearer Authentication Header</code>​ に設定すると、JWT はベアラーと想定されます。<br>
この項目を ​<code>Custom Expression</code>​ に設定する場合、トークンを返す DataWeave 式を指定します。</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Token Expression (トークン式)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">[JWT Origin (元の JWT)] を ​<code>Custom Expression</code>​ に設定した場合は、JWT を返す DataWeave 式をここに入力します。</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>#[attributes.headers['jwt']]</code><br>
この式は、​<code>jwt</code>​ というヘッダー内の JWT を検索します。</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">JWT Signing Method (JWT 署名方法)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">受信 JWT に期待される署名方法を指定します。JWT の署名方法が異なっている場合、ポリシーはトークンを拒否します。</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">RSA、HMAC、ES、None</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">JWT Signing Key Length (JWT 署名キーの長さ)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">署名方法で使用されるキーの長さ (HMAC アルゴリズムの場合) またはアルゴリズム (RSA の場合) を指定します。<br>
[JWT Signing Method (JWT 署名方法)] で ​<strong>[None (なし)]</strong>​ を選択した場合は、この項目を無視します。</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">256、384、512。ES メソッドの場合、Flex Gateway は 256 キーの長さのみをサポートします。</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">JWT Key Origin (元の JWT キー)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">署名検証用のキーの取得元を指定します。<br>
<strong>[Text (テキスト)]</strong>​ オプションを選択するか、​<strong>JWKS</strong>​ から取得することで、ポリシーのキーを提供できます。<br>
[JWT Signing Method (JWT 署名方法)] で ​<strong>[None (なし)]</strong>​ を選択した場合は、この項目を無視します。</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">JWT Key (JWT キー)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">この項目は、[JWT Key Origin (元の JWT キー)] で ​<strong>[Text (テキスト)]</strong>​ を選択した場合に表示されます。<br>
この項目を使用して、トークンの署名を確認するために使用するキーを提供します。<br>
[JWT Signing Method (JWT 署名方法)] で ​<strong>[None (なし)]</strong>​ を選択した場合は、この項目を無視します。</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">HMAC の場合は 32、48、または 64 文字の文字列の共有シークレット、ES の場合は 32 文字の文字列の共有シークレット、RSA の場合はヘッダーとフッターのない PEM 公開キーを入力します。</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">JWKS URL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">この項目は、[JWT Key Origin (元の JWT キー)] で ​<strong>[JWKS]</strong>​ を選択した場合に表示されます。<br>
[JWT Signing Method (JWT 署名方法)] で ​<strong>[None (なし)]</strong>​ を選択した場合は、この項目を無視します。</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">JWKS サーバーの URL。</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">JWKS Caching Time To Live (JWKS キャッシュの存続時間)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">JKWS が有効な時間 (分)。JKWS の有効期限が切れると、ポリシーによってもう一度取得されます。デフォルト値は 60 分です。<br>
[JWT Signing Method (JWT 署名方法)] で ​<strong>[None (なし)]</strong>​ を選択した場合は、この項目を無視します。</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">この項目の入力値は、ポリシーで JWKS が有効とみなされる時間 (分) です。</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">JWKS サービス接続タイムアウト (ミリ秒)。</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">アクセストークン検証エンドポイントを認証するときに、応答を待機する最大時間 (ミリ秒単位) を設定します。<br>
デフォルト値は 10 秒です。</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Skip Client ID Validation (クライアント ID 検証をスキップ)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">この項目をオンにすると、JWT から抽出したクライアント ID が API の有効なクライアントアプリケーションと一致することの確認はされません。</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Client ID Expression (クライアント ID 式)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">[Skip Client ID Validation (クライアント ID 検証をスキップ)] を設定しない場合は、クライアント ID をトークンから抽出する必要があります。</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">デフォルトでは、この値は  <a href="https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-16#section-4.3" target="_blank" rel="noopener">Oauth 2.0 トークンエクスチェンジドラフト</a>​で指定されているように、式 ​<code>#[vars.claimSet.client_id]</code>​ を使用して抽出されます。</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Validate Audience Claim (Audience クレームの検証)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Audience クレームの有効性を確認する必要があることを示します。​<strong>[Audience Claim Mandatory (Audience クレーム必須)]</strong>​ を選択して、このクレームを「必須」に設定できます。</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Validate Expiration Claim (Expiration クレームの検証)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expiration クレームの有効性を確認する必要があることを示します。​<strong>[Expiration Claim Mandatory (Expiration クレーム必須)]</strong>​ を選択して、このクレームを「必須」に設定できます。</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Validate Not Before Claim (Not Before クレームの検証)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Not Before クレームの有効性を確認する必要があることを示します。​<strong>[Not Before Claim Mandatory (Not Before クレーム必須)]</strong>​ を選択すると、このクレームを「必須」に設定できます。</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Validate Custom Claim (カスタムクレームの検証)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ポリシーでカスタム検証を使用できるようにします。すべての DataWeave 式が満たされた場合にのみ JWT が有効とみなされます。</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ポリシーは、受信 JWT にあるすべてのクレームを含む ​<em>claimSet</em>​ 変数を提供します。次に例を示します。</p>
<p class="tableblock"><code>foo : #[vars.claimSet.foo == 'fooValue']</code>​</p>
<p class="tableblock">すべての DataWeave 式がブール値を返す必要があります。返さない場合は必ず式が失敗します。</p></td>
</tr>
</tbody>
</table>

#### [](#anypoint-service-mesh-非-mule-アプリケーション-のパラメーターの設定)Anypoint Service Mesh (非 Mule アプリケーション) のパラメーターの設定

Anypoint Service Mesh (非 Mule アプリケーション) の場合、JWT 検証ポリシーを同じ方法で設定しますが、次の違いがあります。

- ポリシーはクレーム検証の DataWeave 式を受け入れません。
- 次の表で説明しているように、トークン取得およびクライアント ID 検証パラメーターは異なります。

<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">要素</th>
<th class="tableblock halign-left valign-top">説明</th>
<th class="tableblock halign-left valign-top">例</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>JWT Origin (元の JWT)</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>要求のどこから JWT を抽出するかを指定します。</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>jwt Header</code>​: そのヘッダーから JWT を抽出する</p>
</li>
<li>
<p><code>HTTP Bearer Authentication Header</code>​: ベアラーであると想定される JWT</p>
</li>
<li>
<p><code>Custom Header</code>​: JWT は入力であると想定されるヘッダーの名前を取得する</p>
</li>
</ul>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Token Header (トークンヘッダー)</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><strong>[JWT Origin (元の JWT)]</strong>​ を ​<code>Custom Header</code>​ に設定した場合は、JWT を含むヘッダーの名前を指定します。</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>myJwtHeader</code>​</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Client ID Claim (クライアント ID クレーム)</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><strong>[Skip Client ID Validation (クライアント ID 検証をスキップ)]</strong>​ を設定しない場合、クライアント ID はトークンから抽出されます。</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>デフォルトでは、この値は ​<code>client_id</code>​ クレームから抽出されます。</p>
</div></div></td>
</tr>
</tbody>
</table>

## [](#ポリシーのしくみ)ポリシーのしくみ

このポリシーは、このセクションで説明しているように、異なる方法でクレームと署名を検証します。

### [](#署名の検証)署名の検証

このポリシーは、ポリシー設定で指定した値に基づいて JWT の署名を検証します。ポリシー設定で指定したアルゴリズムがトークンと一致しない場合や、トークンの署名が無効である場合、すべての JWT がポリシーで拒否されます。アルゴリズムが指定されていない場は、ポリシーは署名済みと未署名のすべてのトークンに一致します。

署名検証がサポートされているアルゴリズムは、次のとおりです。

- **対称アルゴリズム**​ - SHA-256、SHA-384、SHA-512 を使用する HMAC。
- **非対称アルゴリズム**​ - SHA-256、SHA-384、SHA-512 を使用する ES および RSA。
- **なし**​ - 署名検証なし。

JWS 構造内のアルゴリズムについての詳細は、 [JWA RFC 標準](https://tools.ietf.org/html/rfc7518#section-3.1)​を参照してください。

### [](#クレームの検証)クレームの検証

クレーム検証では、ポリシーで受信したトークンを拒否する条件を選択できます。次の登録済みクレーム検証がデフォルトで提供されています。

- **aud:**​: Audience (オーディエンス) 検証。定義された値が少なくとも 1 つトークンに含まれていない場合、トークンを拒否しなければならないことを示す。
- **exp:**​: Expiration (有効期限) 検証。トークンの日付が検証日より後の場合、トークンを拒否しなければならないことを示す。
- **nbf**​: Not before (以降) 検証。検証日時がトークンの日時よりも前の場合、トークンを拒否しなければならないことを示す。

これらの​_提供されたクレーム_​に加え、検証で使用する他のクレームを指定することもできます。すべてのクレーム、​_登録済み_​または​_カスタム_​で、次の詳細を指定する必要があります。

- 検証するクレームの名前。  
    たとえば、トークンの発行者の場合は ​**iss**​。
- テストに使用する値。  
    リテラル値の検証のみが必要な場合は単純なリテラル値を指定し、より複雑な比較の場合は DataWeave 式を指定できます。

各クレーム検証は必須か必須でないかを定義できます。クレームを必須と定義し、そのクレームが受信 JWT に含まれていない場合、ポリシーはこのトークンを拒否します。クレームを必須でないと定義し、そのクレームが受信 JWT に含まれていない場合、ポリシーはその特定の検証ではトークンを拒否しません。  
どちらも、クレームが含まれている場合、ポリシーはトークン値を検証します。検証が失敗すると、JWT は拒否されます。

### [](#クレームの伝播)クレームの伝播

ポリシーが JWT を解析および検証したら、クレームはダウンストリームポリシーに伝播され、認証オブジェクトの ​**claims**​ プロパティを介して移動します。

クレームの値にアクセスするには、次の Dataweave 2.0 式の ​`<claimName>`​ をアクセス対象のクレームの名前に置き換えて使用します。

`#[authentication.properties.claims.<claimName>]`

JWT は下流にも伝播され、次の Dataweave 2.0 式でアクセスできます。

`#[authentication.properties.jwt]`

### [](#再試行メカニズム)再試行メカニズム

\[JWT Key Origin (元の JWT キー)\] として \[JSON Web Key Set (JWKS)\] を選択した場合、ポリシーは再試行メカニズムを使用して、失敗した JWKS フェッチを処理します。キャッシュされた JWKS が期限切れになるか存在せず、新しい要求が開始されるたびに、要求は JWKS サービスに送信されます。要求が失敗した場合、新しい JWKS が取得されて再度キャッシュされるまで、エクスポネンシャルバックオフ遅延のある一連の非同期要求が JWKS サービスに送信されます。

再キャッシュが完了するまで、期限切れの JWKS を使用して要求が処理され、要求が見つからない場合は ​`503`​ エラーが返されます。期限切れの JWKS を使用すると、前の要求が失敗した場合でも、今後の要求にキャッシュされた値を適用できます。

## [](#ポリシーと互換性がある-pem-公開キーを取得する)ポリシーと互換性がある PEM 公開キーを取得する

サポートされていない形式の既存の RSA キーを使用する場合、まずキーを PEM 公開キーに変換します。JWT ポリシーは、PEM 形式の公開 RSA キーを使用します。

**タスクの前提条件**

既存のキーを変換する前に次の作業を行います。

1. `public.pem`​ キーを取得します。
2. キーをポリシー設定に貼り付ける前に、​**\-----BEGIN PUBLIC KEY-----**​ ヘッダーと ​**\-----END PUBLIC KEY-----**​ フッターを削除します。

次の表に、現在の形式に基づいて既存のキーを変換する手順を示します。

<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">開始点</th>
<th class="tableblock halign-left valign-top">手順</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>以前の証明書なし</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="olist arabic">
<ol class="arabic">
<li>
<p>非公開 RSA キーを生成します。
​<code>openssl genrsa -out key.pem 2048</code>​</p>
</li>
<li>
<p>生成された非公開キー ​<strong>key.pem</strong>​ から、公開キーを抽出します。
​<code>openssl rsa -in key.pem -outform PEM -pubout -out public.pem</code>​</p>
</li>
<li>
<p>公開キーはファイル public.pem 内に含まれます。</p>
</li>
</ol>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>PEM 証明書</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="olist arabic">
<ol class="arabic">
<li>
<p>PEM 証明書から公開キーを抽出します。​<code>openssl x509 -inform pem -in cert.pem -pubkey -noout &gt; public.pem</code>​</p>
</li>
<li>
<p>公開キーはファイル public.pem 内に含まれます。</p>
</li>
</ol>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>DER 証明書</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="olist arabic">
<ol class="arabic">
<li>
<p>DER 証明書から公開キーを抽出します。​<code>openssl x509 -inform der -in cert.crt -pubkey -noout &gt; public.pem</code>​</p>
</li>
<li>
<p>公開キーはファイル public.pem 内に含まれます。</p>
</li>
</ol>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>JWKS の x5c 項目</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="olist arabic">
<ol class="arabic">
<li>
<p>チェーンから最初の証明書をコピーしてデコードします。<code>echo &lt;certificateString&gt; | base64 -D &gt; cert.crt​</code> (<code>​&lt;certificateString&gt;</code> をコピーした値に置き換える)</p>
</li>
<li>
<p>DER 証明書から公開キーを抽出します。​<code>openssl x509 -inform der -in cert.crt -pubkey -noout &gt; public.pem</code>​</p>
</li>
<li>
<p>公開キーはファイル public.pem 内に含まれます。</p>
</li>
</ol>
</div></div></td>
</tr>
</tbody>
</table>

## [](#関連情報)関連情報

- [JWT 検証ポリシーリリースノート](https://docs.mulesoft.com/jp/release-notes/policies/jwt-validation-release-notes)