외부 ID로 세션 관리

이 문서에서는 인증에 외부 ID를 사용하는 경우 IAP(Identity-Aware Proxy)를 사용하여 세션을 관리하는 방법에 대해 설명합니다.

세션 새로고침

Identity Platform 세션은 1시간 동안 유효합니다. 세션이 만료되면 앱이 인증 페이지로 리디렉션되어야 합니다. 인증 페이지에는 Identity Platform 새로고침 토큰이 포함되어 있습니다. 사용자의 사용자 인증 정보가 여전히 유효하면 UI를 표시하지 않고 재인증에 사용할 수 있습니다.

사용자가 최근에 이메일 또는 비밀번호를 변경했거나 토큰을 취소한 다른 조치가 발생한 경우 인증 흐름을 다시 완료해야 합니다.

비AJAX 요청 처리

비AJAX 요청은 인증 페이지가 올바르게 구성되었다고 가정하여 애플리케이션 리디렉션을 사용하여 자동으로 처리됩니다.

AJAX 요청 처리

Chrome 및 다른 브라우저는 서드 파티 쿠키를 단계적으로 줄여가고 있습니다. 서드 파티 쿠키가 사용 중지되어 있으면 이 페이지에서 AJAX 요청을 실행하기 위한 권장사항이 작동하지 않습니다. 그러나 제공된 권장사항은 AJAX 요청의 출처와 대상이 모두 동일한 사이트에서 온 경우 계속 작동합니다.

Chrome에서 서드 파티 쿠키 관리에 대한 자세한 내용은 Chrome에서 쿠키 삭제, 허용, 관리를 참조하세요.

만료된 토큰으로 AJAX 요청을 보내면 요청은 401: Unauthorized 상태 코드를 반환합니다. 이를 처리하기 위해 다음 솔루션 중 하나를 구현하세요.

  • HTTP 401 상태 코드를 처리하도록 애플리케이션 코드를 수정합니다.
  • 세션 새로고침을 가리키도록 iframe을 애플리케이션에 추가합니다.
  • 사용자가 세션 새로고침을 개별 탭으로 수동 로드하도록 지시합니다.

AJAX 요청에 대한 응답으로 401 대신 302 상태 코드를 수신하는 경우 값이 XMLHttpRequestX-Requested-With 헤더를 추가합니다. 이것은 요청이 자바스크립트에서 시작된다는 것을 IAP에 알려줍니다.

프로그래매틱 방식으로 HTTP 401 처리

프로그래매틱 방식으로 HTTP 401 상태 코드를 처리하는 것이 AJAX 세션을 새로 고치는 데 권장되는 방법입니다. 방법은 다음과 같습니다.

  1. 오류를 처리하도록 애플리케이션 코드를 업데이트합니다.

    if (response.status === 401) {
      statusElm.innerHTML = 'Login stale. <input type="button" value="Refresh" onclick="sessionRefreshClicked();"/>';
    }

  2. 창을 열어서 사용자를 재인증하는 핸들러를 추가한 다음 프로세스가 완료되면 닫습니다.

    var iapSessionRefreshWindow = null;
    
    function sessionRefreshClicked() {
      if (iapSessionRefreshWindow == null) {
        iapSessionRefreshWindow = window.open("/?gcp-iap-mode=DO_SESSION_REFRESH");
        window.setTimeout(checkSessionRefresh, 500);
      }
      return false;
    }
    
    function checkSessionRefresh() {
      if (iapSessionRefreshWindow != null && !iapSessionRefreshWindow.closed) {
        fetch('/favicon.ico').then(function(response) {
          if (response.status === 401) {
            window.setTimeout(checkSessionRefresh, 500);
          } else {
            iapSessionRefreshWindow.close();
            iapSessionRefreshWindow = null;
          }
        });
      } else {
        iapSessionRefreshWindow = null;
      }
    }

iframe 사용

프로그래매틱 방식으로 HTTP 401을 처리할 수 없는 경우 다음으로 좋은 해결 방법은 세션 새로고침을 가리키는 iframe을 애플리케이션에 추가하는 것입니다. 예를 들면 다음과 같습니다.

<iframe src="https://example.com/some/path?gcp-iap-mode=SESSION_REFRESHER" style="width:0;height:0;border:0; border:none;"></iframe>

세션 새로고침 로드

최후의 수단으로 사용자에게 세션 새로고침을 수동으로 로드하도록 지시할 수 있습니다. 사용자가 별도의 탭에서 다음 URL을 열도록 지시하는 지침을 애플리케이션 또는 설명서에 추가합니다.

https://example.com/some/path?gcp-iap-mode=SESSION_REFRESHER

사용자 로그아웃

IAP 리소스에서 사용자를 로그아웃시키려면 쿼리 매개변수 ?gcp-iap-mode=GCIP_SIGNOUT을 사용합니다. 예를 들어 App Engine 앱에서 URL은 다음과 같습니다.

https://example.com/some/path?gcp-iap-mode=GCIP_SIGNOUT

사용자는 로그아웃한 후 다시 로그인 페이지로 리디렉션됩니다.

모든 리소스와 세션에서 사용자를 로그아웃시키려면 API 키와 매개변수로 추가된 mode=signout을 사용하여 인증 URL로 리디렉션합니다. 예를 들면 다음과 같습니다.

https://auth.example.com/?apiKey=API-KEY&mode=signout

로그아웃이 완료된 후에도 사용자는 페이지에 남아 있습니다. 사용자에게 로그아웃했다는 피드백을 제공하려면 AuthenticationHandler 객체에서 completeSignOut() 콜백을 구현합니다.

테넌트 간 전환

경우에 따라 사용자는 동일한 IAP 리소스에 여러 테넌트로 인증하려고 할 수 있습니다. 예를 들어, 서로 다른 수준의 액세스 권한을 부여하는 멀티 테넌트에 속할 수 있으며 더 적거나 더 큰 권한이 있는 테넌트로 변경해야 하는 경우도 있습니다.

테넌트 선택 프로세스를 강제로 다시 시작하려면 ?gcp-iap-mode=CLEAR_LOGIN_COOKIE를 사용하세요. 예를 들어 App Engine 앱에서 URL은 다음과 같이 표시됩니다.

https://PROJECT-ID.appspot.com/some/path?gcp-iap-mode=CLEAR_LOGIN_COOKIE

다음 단계