Cloudflare Access は、認証済みのリクエストすべてにアプリケーショントークンを付けてオリジンへ送ります。典型的な JWT は次のとおりです。
eyJhbGciOiJSUzI1NiIsImtpZCI6IjkzMzhhYmUxYmFmMmZlNDkyZjY0.eyJhdWQiOlsiOTdlMmFhZ TEyMDEyMWY5MDJkZjhiYzk5ZmMzNDU5MTNh.zLYsHmLEginAQUXdygQo08gLTExWNXsN4jBc6PKdB
上記のとおり、JWT はドットで区切られた 3 つの Base64-URL 値で構成されます。
アプリケーションが Cloudflare Tunnel 経由で Access に接続されていない場合は、オリジンのセキュリティを確保するために トークンを検証 する必要があります。ヘッダーだけの検証では不十分です。なりすましを防ぐには、JWT と署名の両方を確認します。
{
"alg": "RS256",
"kid": "9338abe1baf2fe492f646a736f25afbf7b025e35c627be4f60c414d4c73069b8",
"typ": "JWT"
}algはエンコードアルゴリズムを示します。kidはトークンの署名に使った鍵を示します。typはトークン形式を示します。
ペイロードには、アプリケーションへ渡す実際のクレームとユーザー情報が入ります。内容は、ID プロバイダーで認証したか、サービストークン で認証したかによって変わります。
{
"aud": ["32eafc7626e974616deaf0dc3ce63d7bcbed58a2731e84d06bc3cdf1b53c4228"],
"email": "user@example.com",
"exp": 1659474457,
"iat": 1659474397,
"nbf": 1659474397,
"iss": "https://yourteam.cloudflareaccess.com",
"type": "app",
"identity_nonce": "6ei69kawdKzMIAPF",
"sub": "7335d417-61da-459d-899c-0a01c76a2f94",
"country": "US"
}| フィールド | 説明 |
|---|---|
| aud | Access アプリケーションの アプリケーション audience(AUD)タグ です。 |
| 認証済みユーザーのメールアドレスです。ID プロバイダーが検証します。 | |
| exp | トークンの有効期限タイムスタンプです(Unix 時間)。 |
| iat | トークンの発行タイムスタンプです(Unix 時間)。 |
| nbf | トークンの not-before タイムスタンプです(Unix 時間)。この時刻より前にトークンを受け取っていないかを確認します。 |
| iss | アプリケーションの Cloudflare Access ドメイン URL です。 |
| type | Access トークンの種類です(アプリケーショントークンは app、グローバルセッショントークンは org)。 |
| identity_nonce | ユーザー ID を取得するためのキャッシュキーです。 |
| sub | ユーザーの ID です。アカウント内のメールアドレスごとに一意です。Zero Trust 組織から 削除 して再追加した場合や、別の組織にログインした場合は、別の sub になります。 |
| country | ユーザーが認証した国です。 |
Access では、ID プロバイダーが対応している場合、検証を強化するためにカスタム SAML 属性と OIDC クレームを JWT に追加できます。設定は SAML または OIDC プロバイダーのセットアップ時に行います。ID プロバイダーのグループがトークンに含まれるのは、groups をカスタム SAML 属性または OIDC クレームとして明示的に設定した場合だけです。Access が自動で追加することはありません。
ユーザー ID は、アプリケーションの権限確認に役立ちます。たとえば、あるユーザーが Finance-Team のような Okta または Microsoft Entra ID のグループに所属しているかを検証できます。
Cookie サイズ制限と帯域の都合で、アプリケーショントークンにはユーザー ID の一部だけが入ります。完全な ID を取得するには、CF_Authorization Cookie を https://<your-team-name>.cloudflareaccess.com/cdn-cgi/access/get-identity に送ります。リクエストは次の形にします。
curl -H 'cookie: CF_Authorization=<user-token>' https://<your-team-name>.cloudflareaccess.com/cdn-cgi/access/get-identityAccess は、次のデータを含む JSON を返します。
| フィールド | 説明 |
|---|---|
| ユーザーのメールアドレスです。 | |
| idp | ID プロバイダーからのデータです。 |
| geo | ユーザーが認証した国です。 |
| user_uuid | ユーザーの ID です。 |
| devicePosture | デバイスポスチャの属性です。 |
| account_id | 組織のアカウント ID です。 |
| iat | ユーザーがログインした時刻のタイムスタンプです。 |
| ip | ユーザーの IP アドレスです。 |
| auth_status | mTLS で認証している場合のステータスです。 |
| common_name | mTLS クライアント証明書の Common Name です。 |
| service_token_id | 認証に使ったサービストークンの Client ID です。 |
| service_token_status | ID プロバイダーではなくサービストークンで認証した場合は True です。 |
| is_warp | ユーザーが WARP を有効にしている場合は True です。 |
| is_gateway | ユーザーが Cloudflare One Client を有効にし、Zero Trust チームで認証している場合は True です。 |
| gateway_account_id | Cloudflare One Client が Zero Trust チームで認証したときに生成する ID です。 |
| device_id | 認証に使ったデバイスの ID です。 |
| version | get-identity オブジェクトのバージョンです。 |
| device_sessions | ユーザーが開始したセッションの一覧です。 |
{
"type": "app",
"aud": ["32eafc7626e974616deaf0dc3ce63d7bcbed58a2731e84d06bc3cdf1b53c4228"],
"exp": 1659474457,
"iss": "https://yourteam.cloudflareaccess.com",
"common_name": "e367826f93b8d71185e03fe518aff3b4.access",
"iat": 1659474397,
"sub": ""
}| フィールド | 説明 |
|---|---|
| type | Access トークンの種類です(アプリケーショントークンは app、グローバルセッショントークンは org)。 |
| aud | Access アプリケーションの アプリケーション audience(AUD)タグ です。 |
| exp | JWT の有効期限タイムスタンプです(Unix 時間)。 |
| iss | アプリケーションの Cloudflare Access ドメイン URL です。 |
| common_name | サービストークンの Client ID(CF-Access-Client-Id)です。 |
| iat | JWT の発行タイムスタンプです(Unix 時間)。 |
| sub | サービストークンで認証した場合は空文字列です。 |
Cloudflare は、エンコードしたヘッダーとペイロードを SHA-256 アルゴリズム(RS256)で署名して署名値を生成します。RS256 では、秘密鍵が JWT に署名し、別の 公開鍵 が署名を検証します。
JWT の詳細は jwt.io ↗ を参照してください。