다음을 통해 공유


단일 페이지 애플리케이션: API를 호출하도록 토큰 획득

MSAL.js를 사용하여 API의 토큰을 획득하는 패턴은 먼저 acquireTokenSilent 메서드를 사용하여 자동 토큰 요청을 시도하는 것입니다. 이 메서드가 호출되면 라이브러리는 먼저 브라우저 스토리지의 캐시를 확인하여 만료되지 않는 액세스 토큰이 있는지 확인하고 반환합니다. 액세스 토큰을 찾을 수 없거나 액세스 토큰이 만료된 경우 새로 고침 토큰을 사용하여 새 액세스 토큰을 가져옵니다. 새로 고침 토큰의 24시간 수명도 만료된 경우 MSAL.js는 숨겨진 iframe을 열어 Microsoft Entra ID(있는 경우)의 기존 활성 세션을 사용하여 새 인증 코드를 자동으로 요청합니다. 그런 다음 이 세션은 새로운 토큰 집합(액세스 새로 고침 토큰)으로 교환됩니다. Microsoft Entra ID의 Single Sign-On(SSO) 세션과 토큰 수명 값에 대한 자세한 내용은 토큰 수명을 참조하세요. MSAL.js 캐시 조회 정책에 대한 자세한 내용은 액세스 토큰 획득을 참조하세요.

Microsoft Entra ID에 대한 자동 토큰 요청은 암호 변경 또는 업데이트된 조건부 액세스 정책과 같은 이유로 실패할 수 있습니다. 대개 이러한 실패는 새로 고침 토큰의 24시간 수명이 만료되고 브라우저에서 타사 쿠키를 차단하기 때문입니다. 이로 인해 숨겨진 iframe을 사용하여 사용자를 계속 인증할 수 없습니다. 이러한 경우에는 토큰을 얻기 위해 대화형 메서드(사용자에게 메시지가 표시될 수 있음) 중 하나를 호출해야 합니다.

팝업 또는 리디렉션 환경에서 선택

팝업이나 리디렉션 환경 중 선택은 애플리케이션 흐름에 따라 다릅니다.

  • 인증 중에 사용자가 기본 애플리케이션 페이지에서 이동하는 것을 원하지 않는 경우 팝업 방법을 권장합니다. 인증 리디렉션은 팝업 창에서 발생하기 때문에 기본 애플리케이션의 상태가 유지됩니다.

  • 사용자에게 팝업 창을 사용하지 않게 설정하는 브라우저 제약 조건이나 정책이 있으면 리디렉션 메서드를 사용할 수 있습니다. Internet Explorer의 팝업 창에 알려진 이슈가 있으므로 Internet Explorer 브라우저에서 리디렉션 메서드를 사용합니다.

액세스 토큰 요청을 빌드할 때 액세스 토큰에 포함하려는 API 범위를 설정할 수 있습니다. 모든 요청 범위가 액세스 토큰에 부여되지 않을 수 있습니다. 사용자 동의에 따라 다릅니다.

팝업 창을 사용하여 토큰 획득

다음 코드에서는 앞에서 설명한 패턴과 팝업 환경의 메서드를 결합합니다.

// MSAL.js v2 exposes several account APIs, logic to determine which account to use is the responsibility of the developer
const account = publicClientApplication.getAllAccounts()[0];

const accessTokenRequest = {
  scopes: ["user.read"],
  account: account,
};

publicClientApplication
  .acquireTokenSilent(accessTokenRequest)
  .then(function (accessTokenResponse) {
    // Acquire token silent success
    let accessToken = accessTokenResponse.accessToken;
    // Call your API with token
    callApi(accessToken);
  })
  .catch(function (error) {
    //Acquire token silent failure, and send an interactive request
    if (error instanceof InteractionRequiredAuthError) {
      publicClientApplication
        .acquireTokenPopup(accessTokenRequest)
        .then(function (accessTokenResponse) {
          // Acquire token interactive success
          let accessToken = accessTokenResponse.accessToken;
          // Call your API with token
          callApi(accessToken);
        })
        .catch(function (error) {
          // Acquire token interactive failure
          console.log(error);
        });
    }
    console.log(error);
  });

리디렉션을 사용하여 토큰 획득

다음 패턴은 앞에서 설명되었지만 대화형으로 토큰을 획득하도록 리디렉션 메서드로 표시됩니다. 페이지 로드 시 handleRedirectPromise를 호출하고 기다려야 합니다.

const redirectResponse = await publicClientApplication.handleRedirectPromise();
if (redirectResponse !== null) {
  // Acquire token silent success
  let accessToken = redirectResponse.accessToken;
  // Call your API with token
  callApi(accessToken);
} else {
  // MSAL.js v2 exposes several account APIs, logic to determine which account to use is the responsibility of the developer
  const account = publicClientApplication.getAllAccounts()[0];

  const accessTokenRequest = {
    scopes: ["user.read"],
    account: account,
  };

  publicClientApplication
    .acquireTokenSilent(accessTokenRequest)
    .then(function (accessTokenResponse) {
      // Acquire token silent success
      // Call API with token
      let accessToken = accessTokenResponse.accessToken;
      // Call your API with token
      callApi(accessToken);
    })
    .catch(function (error) {
      //Acquire token silent failure, and send an interactive request
      console.log(error);
      if (error instanceof InteractionRequiredAuthError) {
        publicClientApplication.acquireTokenRedirect(accessTokenRequest);
      }
    });
}

다음 단계

이 시나리오의 다음 문서인 웹 API 호출로 이동합니다.