アンチパターン: OAuth トークンに長い有効期限を設定する

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントを表示する。

Apigee には、OAuth 2.0 トークンベースの認証を実装して API を保護できる一連のツールとポリシーが用意されています。IETF RFC 6749 で説明されている OAuth2 は、API の認証および認可について最も広くサポートされているオープン スタンダードです。OAuth2 は、クライアント アプリケーションが API 実装に送信する標準形式の認証情報として、トークンを確立します。API 実装では、トークンを検証して、クライアントに API へのアクセス権が付与されているかどうかを判断できます。

Apigee では、OAuthv2 ポリシーを使用して、4 つの OAuth2 権限付与タイプ(client credentialspasswordimplicitauthorization code)のいずれか 1 つを実装することで、デベロッパーがアクセス トークンや更新トークンを作成できるようになります。さらに、API デベロッパーは Apigee を使用して、IETF RFC 8693 で説明されているトークン交換パターンに準じた権限付与など、カスタムの権限付与を実装できます。クライアント アプリケーションはアクセス トークンを使用して、安全な API を使用します。各アクセス トークンにはそれぞれの有効期限があり、これらは OAuthv2 ポリシーで設定できます。

Apigee は、一部の権限付与タイプで、アクセス トークンと同時に更新トークンを生成して返すことができます。クライアントは、元のアクセス トークンが取り消されたり、有効期限が切れたりした後に、更新トークンを使用して新しいアクセス トークンを取得します。更新トークンの有効期限は、OAuthv2 ポリシーで設定することもできます。

アンチパターン

OAuthv2 ポリシーでアクセス トークンまたは更新トークンに長い有効期限を設定すると、トークンが漏洩した場合に脆弱性が生じる期間が長くなり、セキュリティ リスクが生じます。また、永続ストアに OAuth トークンが蓄積され、時間の経過とともにパフォーマンスが低下する可能性もあります。

例 1

次の OAuthV2 ポリシーの例では、アクセス トークンの有効期限を 10 日間と長く設定しています。

<OAuthV2 name="OAuth-GenerateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>864000000</ExpiresIn> <!-- 10 days -->
    <RefreshTokenExpiresIn>864000000</RefreshTokenExpiresIn> <!-- 10 days -->
    <SupportedGrantTypes>
      <GrantType>authorization_code</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
</OAuthV2>

上記の例では、次のように設定されています。

  • アクセス トークンの有効期限は 10 日間に設定されています。
  • 更新トークンの有効期限も 10 日間に設定されています。

影響

有効期限の長いアクセス トークンはセキュリティ リスクを生じます。トークンが漏洩または紛失した場合、有効期限の短いトークンは自然に期限切れになり、無効になりますが、有効期限の長いトークンでは長期間 API へのアクセスが許可され、脆弱性が生じる期間が長くなります。

アクセス トークンの有効期限は短くする必要があります(30 分未満が推奨)。有効期限は、更新トークンの有効期限よりも大幅に短くする必要があります。

例 2

次に、更新トークンに長すぎる有効期限(200 日)を設定する OAuthV2 ポリシーの例を示します。

<OAuthV2 name="OAuth-GenerateAccessToken">
  <Operation>GenerateAccessToken</Operation>
  <ExpiresIn>1800000</ExpiresIn> <!-- 30 minutes -->
  <RefreshTokenExpiresIn>17280000000</RefreshTokenExpiresIn> <!-- 200 days -->
  <SupportedGrantTypes>
    <GrantType>authorization_code</GrantType>
  </SupportedGrantTypes>
  <GenerateResponse enabled="true"/>
</OAuthV2>

上記の例では、次のように設定されています。

  • アクセス トークンには、適度に短い有効期限(30 分)が設定されています。
  • 更新トークンには、非常に長い有効期限(200 日)が設定されています。
  • この API へのトラフィックが 10 リクエスト/秒の場合、1 日に 864,000 個ものトークンが生成されます。
  • 更新トークンは 200 日後に期限切れになります。トークンは有効期間全体にわたってデータストアに蓄積されます。

影響

更新トークンの有効期限を延長すると、大量のトークンがデータストアに蓄積されるため、時間の経過とともにパフォーマンスが低下する可能性があります。Apigee ハイブリッドでは、トークンが過剰に蓄積すると、永続レイヤのディスク容量の枯渇につながる場合もあります。

ベスト プラクティス

OAuth アクセス トークンと更新トークンの有効期限は固有のセキュリティ要件に適した期間に設定することで、トークンの漏洩により脆弱性が生じる期間を短縮し、データストアにトークンが蓄積しないようにします。アクセス トークンの有効期限については 30 分、更新トークンの有効期限については 24 時間から始めることをおすすめします。

更新トークンの有効期限は、アクセス トークンの有効期限の倍数となるように設定します。たとえば、アクセス トークンの有効期限を 30 分に設定した場合、更新トークンの有効期間は 24 時間、7 日間、またはサポートが必要なユーザー エクスペリエンスに適した期間に設定します。

関連情報