MSAL.js でのキャッシュ

MSAL は、トークンを取得すると、将来の使用のためにトークンをキャッシュします。 MSAL は、トークンの有効期間の管理と自動更新を行います。 acquireTokenSilent() API は、特定のアカウントのアクセス トークンをキャッシュから取得し、必要に応じて更新します。

キャッシュ ストレージ

キャッシュ ストレージの場所は、MSAL のインスタンス化に使用される構成オブジェクトを使用して構成できます。

import { PublicClientApplication, BrowserCacheLocation } from "@azure/msal-browser";

const pca = new PublicClientApplication({
    auth: {
        clientId: "Enter_the_Application_Id_Here", // e.g. "00001111-aaaa-2222-bbbb-3333cccc4444" (guid)
        authority: "https://login.microsoftonline.com/Enter_the_Tenant_Info_Here", // e.g. "common" or your tenantId (guid),
        redirectUri: "/"
    },
    cache: {
       cacheLocation: BrowserCacheLocation.SessionStorage // "sessionStorage"
    }
});

既定では、MSAL は、すべての最新のブラウザーでサポートされている Web Storage API を使用して、IdP から取得したさまざまな認証成果物をブラウザー ストレージに格納します。 したがって、MSAL には、 sessionStorage (既定) と localStorageの 2 つの永続的ストレージ方法が用意されています。 さらに、MSAL には memoryStorage オプションが用意されており、ブラウザー ストレージへのキャッシュの保存をオプトアウトできます。

キャッシュの場所 クリアされた日時 ウィンドウ/タブ間で共有 サポートされているリダイレクト フロー
sessionStorage ウィンドウ/タブを閉じる No はい
localStorage ブラウザーを閉じる (ユーザーが選択した場合を除き、サインインしたままにする) はい はい
memoryStorage ページの更新/ナビゲーション No No

Note

ウィンドウ/タブの閉じるか、ページの更新/ナビゲーションが原因でセッションとメモリ ストレージの認証状態が失われる可能性があります。ただし、セッション Cookie の有効期限が切れていない限り、ユーザーは IdP とのアクティブなセッションを保持し、プロンプトなしで再認証できる可能性があります。

異なるストレージの場所を選択すると、ユーザー エクスペリエンスの向上とセキュリティの強化のトレードオフが反映されます。 上の表に示すように、ローカル ストレージでは可能な限り最適なユーザー エクスペリエンスが得られますが、メモリ ストレージはブラウザー ストレージに機密情報が格納されないので最高のセキュリティを提供します。 詳細については、 以下のセキュリティキャッシュされたアーティファクトに関する セクションを参照してください。

LocalStorage のメモ

v4 以降では、 localStorage キャッシュの場所を使用している場合、ユーザーがサインイン中に [サインインしたままにする] を選択しない限り、認証アーティファクトは暗号化されます。 使用される暗号化アルゴリズムは、HKDF を使用してキーを派生させる AES-GCM です。 基本キーは、 msal.cache.encryptionというタイトルのセッション Cookie に格納されます。

この Cookie は、ブラウザー インスタンス (タブではない) が閉じられたときに自動的に削除されるため、セッションが終了した後に認証アーティファクトを復号化できなくなります。 これらの有効期限が切れた認証アーティファクトは、次回 MSAL が初期化されるときに削除され、ユーザーは再認証が必要になる場合があります。 localStorageの場所では、引き続きすべてのユーザーにクロスタブ キャッシュ永続化が提供されますが、"サインインしたままにする" (KMSI) を選択したユーザーのブラウザー セッション間でのみ保持されます。

Important

この暗号化の目的は、追加のセキュリティを提供 せず 、認証アーティファクトの永続化を減らすことです。 悪意のあるアクターがブラウザー ストレージにアクセスできる場合は、キーにアクセスすることも、キャッシュをまったく必要とせずに、ユーザーに代わってトークンを要求することもできます。 アプリケーションが XSS 攻撃に対して脆弱でないことを確認するのは、お客様の責任です。 詳細については、 セキュリティ セクションを参照してください。

Note

MSAL.js v4 では、一時的な認証成果物の Cookie ストレージは非推奨です。 このセクションは、MSAL.js v3 以前を引き続き使用しているアプリケーションに対して保持されます。

MSAL Browser は、一時的な認証成果物を格納するために Cookie を使用するように構成できます。 このオプションを使用すると、リダイレクトベースのログイン フロー中にローカル/セッション ストレージをクリアする可能性があるブラウザー (Internet Explorer、プライベート モードの Firefox など) をサポートできます。 このオプションを選択すると、トークン自体は引き続きブラウザーまたはメモリ ストレージに格納されることに注意してください。 詳細については、 構成 を参照してください。

セキュリティ

アプリケーションにクロスサイト スクリプティング (XSS) と関連する脆弱性がない限り、セッション/ローカル ストレージは安全であると考えられます。 XSS に対するアプリケーションのセキュリティ保護については、 OWASP XSS 防止チート シート を参照してください。 それでも問題が解決しない場合は、代わりに memoryStorage オプションを使用することをお勧めします。

キャッシュ済みアーティファクト

優れた UX を維持しながら効率的なトークンの取得を簡単にするために、MSAL は API 呼び出しに起因するさまざまな成果物をキャッシュします。 MSAL キャッシュ内のエンティティの概要を次に示します。

  • 永続的なアーティファクト(要求の後も存続する - 関連項目: トークンの有効期間
    • アクセス トークン
    • id トークン
    • 更新トークン
    • accounts
  • 一時的なアーティファクト(リクエストの存続期間に限定)
    • リクエスト メタデータ(例: state、nonce、authority)
    • エラー
    • 相互作用の状態
  • テレメトリ
    • 以前の失敗した要求
    • パフォーマンス データ

Note

一時キャッシュ エントリは、常にセッション ストレージまたはメモリに格納されます。 セッション ストレージが使用できない場合、MSAL はメモリ ストレージにフォールバックします。

Note

承認コードはメモリにのみ格納され、トークンに引き換えた後に破棄されます。

temporaryCacheLocation のオーバーライド

Note

temporaryCacheLocation構成オプションは、MSAL.js v4 では非推奨です。 このセクションは、MSAL.js v3 以前を引き続き使用しているアプリケーションに対して保持されます。

Warning

temporaryCacheLocationのオーバーライドは、特にlocalStorageを選択する場合は注意して行う必要があります。 複数のタブ/ウィンドウでの操作はサポートされておらず、予期せず interaction_in_progress エラーが発生する可能性があります。 これはエスケープ ハッチであり、完全にサポートされている機能ではありません。

新しいウィンドウまたはタブで認証が成功した後にユーザーがリダイレクトされるシナリオで既定の構成で MSAL.js を使用すると、PKCE フローを使用した OAuth 2.0 承認コードが中断されます。 この場合、認証状態 (コード検証ツールとチャレンジ) が格納されている元のウィンドウまたはタブは失われ、認証フローは失敗します。

このシナリオを処理するには、localStorage構成プロパティをオーバーライドすることで、temporaryCacheLocationをキャッシュの場所として使用するように MSAL を構成します。 これにより、コード検証ツールとチャレンジをブラウザーの localStorageに格納できます。これは、複数のタブとウィンドウに保持されます。

MSAL.js のアップグレードとロールバック中のキャッシュの永続化

新しい要件、機能、バグ修正をサポートするために、MSAL.js キャッシュされた成果物の形状を変更する必要がある場合があります。 多くの場合、これらの変更は、アプリケーションが新しいバージョンにアップグレードされたときや古いバージョンにロールバックしたときに、ユーザーのブラウザーに存在するキャッシュを引き続き使用できるように、下位互換性のある方法で行われます。 ただし、これは常に可能であるとは限らないので、キャッシュの複数のコピーが同時に存在する状態になる可能性があります。1 つは現在のバージョンの MSAL.js 実行で使用され、もう 1 つはアップグレード前に使用されたバージョンによって書き込まれたものになります。 これは、必要に応じてアプリケーションが正常にロールバックできるようにするために行われます。 アップグレードの大部分では、MSAL.js は既存のキャッシュを新しい形式に移行し、シームレスなアップグレード エクスペリエンスを実現します。 v3 から v4 へのアップグレードなど、まれなケースでは、セキュリティまたはプライバシーの要件が原因でこれが不可能になる可能性があり、これにより常にメジャー バージョンのバンプが発生します。

重大なキャッシュ変更が行われると、古いキャッシュは、必要に応じてロールバックできるように、既定で 5 日間保持されます。 古いキャッシュが保持される時間の長さは、cacheRetentionDaysPublicClientApplication キャッシュ構成を使用して構成できます。 キャッシュがその時間内にアクティブに使用されていない場合は、次回 MSAL.js が初期化されるときにクリアされます。 さらに、ロールバックする必要がない場合は、この値を 0 に設定して、新しいバージョンの MSAL.jsにアップグレードすると、古いキャッシュを常にすぐに削除する必要があることを示します。 逆に、アップグレードのロールアウト期間が長い場合は、これを長い値に設定することもできます。

Note

アクセス トークンと更新トークンは、構成された cacheRetentionDays にまだ到達していない場合でも、有効期限が切れると削除されます。 ブラウザー ストレージがストレージ クォータに達した場合、有効なアクセス トークンはいつでも削除される可能性があります。 ストレージ クォータに達すると、アクセス トークンは最初に削除されます。最初に、以前のバージョンの MSAL.js によって書き込まれたエントリから始まり、現在のバージョンの MSAL.jsによって書き込まれたエントリに移動します。

const config = {
    auth: {
        clientId: "<your-client-id>"
    },
    cache: {
        cacheLocation: "localStorage",
        cacheRetentionDays: 0 // Set this to the number of days you want old cache to be preserved in the event a rollback is needed (Default 5 days)
    }
}

const pca = new PublicClientApplication(config);
await pca.initialize();

注釈

  • キャッシュ内のエンティティの直接使用に依存するビジネス ロジックを持つアプリはお勧めしません。 代わりに、トークンを取得したりアカウントを取得したりする必要がある場合は、適切な MSAL API を使用してください。
  • 所有証明 (PoP) トークンの暗号化に使用されるキーは、 IndexedDB API とメモリ ストレージの組み合わせを使用して格納されます。 詳細については、 アクセス トークンの所有証明に関するページを参照してください。

詳細情報