MSAL Node におけるパフォーマンス

Prerequisites

  • MSAL を使用したトークン取得のパフォーマンスを向上させるためにアプリケーションで使用できる手法の概要については、「 MSAL Browser のパフォーマンス」を参照してください。
  • Node.js

パフォーマンスの測定

MSAL Node の認証フローのパフォーマンスを測定するアプリケーションは、Node の パフォーマンス測定 API などを 使用して手動で行うことができます。 収集できる注目すべきデータ ポイントの一覧を次に示します。

データ Meaning 推奨事項
authType acquireToken* トークン要求に使用される API 使用状況を識別するために使用します。
correlationId トークン要求に使用される関連付け ID。 これはcorrelationId プロパティを使用して取得できます。 使用状況を識別するために使用します。
durationTotalInMs ネットワーク呼び出しとキャッシュ アクセスを含む、MSAL で費やされた合計時間 全体的な待機時間が長い場合のアラーム (> 1 秒)。 値はトークン ソースによって異なります。 キャッシュから: 1 つのキャッシュ アクセス。 ネットワークから: 2 つのキャッシュ アクセスと 2 つの HTTP 呼び出し。
durationInCacheInMs トークン キャッシュの永続化 (Redis など) の読み込みまたは保存に費やされた時間。 スパイク時のアラーム。
durationInHttpInMs IdP への HTTP 呼び出しの実行に費やされた時間 (例: Microsoft Entra ID)。 より詳細な監視には、カスタム ネットワーク クライアントを使用できます。 詳細については、 構成カスタム ネットワークのサンプル を参照してください スパイク時のアラーム。
tokenSource トークンのソース (つまり、キャッシュとネットワーク)。 これはfromCache プロパティを使用して取得できます。 トークンはキャッシュからはるかに高速に取得されます (たとえば、約 100 ミリ秒と約 700 ミリ秒)。 キャッシュヒット率の監視とアラートに使用できます。 durationTotalInMsと一緒に使用します。

例えば次が挙げられます。

    const { PerformanceObserver, performance } = require('node:perf_hooks');

    const perfObserver = new PerformanceObserver((items) => {
        items.getEntries().forEach((entry) => {
            console.log(entry);
        })
    });

    perfObserver.observe({ entryTypes: ["measure"], buffered: true });

    // ...

    performance.mark("acquireTokenByClientCredential-start");

    const tokenResponse = await msalInstance.acquireTokenByClientCredential({
        scopes: ["User.Read.All"],
    });

    performance.mark("acquireTokenByClientCredential-end");

    performance.measure("acquireTokenByClientCredential", {
        start: "acquireTokenByClientCredential-start"
        end: "acquireTokenByClientCredential-end"
        detail: {
            tokenSource: tokenResponse.fromCache
            correlationId: tokenResponse.correlationId
        }
    });

機密クライアント アプリケーションのパフォーマンスに関する考慮事項

機密クライアント アプリケーションは主に、要求の同時処理を伴うサーバー側のシナリオで使用されるため、MSAL ConfidenticalClientApplication (CCA) インスタンスのスコープを各ユーザー、要求、またはセッションにすることをお勧めします。

各要求の新しい CCA インスタンスは、既定のメモリ内キャッシュに、トークンの取得方法に関するトークンやメタデータが最初に含まれていないことを意味します。 そのため、パフォーマンスが低下しないように、作成する CCA インスタンスはトークン要求の前に準備する必要があります。

import {
    ConfidentialClientApplication,
    AuthenticationResult,
    CryptoProvider,
    OnBehalfOfRequest
} from "@azure/msal-node";

function getMsalInstance(partitionKey: string): ConfidentialClientApplication {
    return new ConfidentialClientApplication({
        auth: {
            clientId: "ENTER_CLIENT_ID",
            authority: "http://login.microsoftonline.com/ENTER_TENANT_ID"
            cloudDiscoveryMetadata: "PROVIDE_STRINGIFIED_DISCOVERY_METADATA"
            authorityMetadata: "PROVIDE_STRINGIFIED_AUTHORITY_METADATA"
        },
        cache: {
            cachePlugin: new CustomCachePlugin(
                this.cacheClientWrapper,
                partitionKey
            )
        }
    });
};

async function getToken(tokenRequest: OnBehalfOfRequest): Promise<AuthenticationResult | null> {
    const partitionKey = await this.cryptoProvider.hashString(tokenRequest.oboAssertion);

    const cca = getMsalInstance(partitionKey);

    let tokenResponse = null;

    try {
        await cca.getTokenCache().getAllAccounts(); // required for cache read
        tokenResponse = await cca.acquireTokenOnBehalfOf(tokenRequest);
    } catch (error) {
        throw error;
    }

    return tokenResponse;
};

詳細については、 カスタム分散キャッシュ プラグインを使用した (CCA) Web API を参照してください。

こちらも参照ください