IAP 세션 관리

이 페이지에서는 IAP(Identity-Aware Proxy)에서 만료된 세션의 요청을 처리하는 방법과 AJAX 앱 요청 및 WebSocket 요청이 성공하는지 확인하는 방법을 설명합니다.

IAP 세션 흐름

표준 IAP 로그인 흐름을 사용하는 경우 사용자는 Google 로그인 세션을 참조하는 세션 쿠키를 받습니다. IAP는 이 쿠키를 사용하여 사용자가 아직 로그인되어 있는지 확인합니다. IAP를 사용하려면 사용자가 IAP 보안 앱에 액세스하기 전에 로그인해야 합니다.

IAP 세션은 주기적으로 새로고침됩니다. 그러나 사용자가 Google 계정을 사용하여 로그인하는 경우 IAP 세션도 사용자의 Google 로그인 세션에 연결됩니다. 이 경우 IAP는 다음 상황 중 하나에서만 사용자가 다시 로그인하도록 요구합니다.

  • 사용자가 자신의 계정에서 로그아웃한 경우
  • 계정이 정지된 경우
  • 계정에 비밀번호 재설정이 필요한 경우

사용자가 로그아웃한 경우 IAP는 몇 분 내에 Google 계정 상태 변경을 감지합니다. IAP가 계정 상태 변경을 감지하면 세션을 무효화합니다.

IAP는 유효 세션 중 모든 요청에 대해 Identity and Access Management(IAM) 승인을 다시 확인합니다. IAP 보안 앱의 IAM 액세스 정책 업데이트가 적용되려면 몇 분이 걸릴 수 있습니다.

IAP 세션 만료

Google 계정을 사용하는 로그인 흐름의 경우 IAP 세션이 기본 Google 로그인 세션에 연결되어 있으며 승인 헤더에서 전송된 JWT의 exp 클레임과 관계없이 세션이 만료되는 경우에만 만료됩니다.

프로그래매틱 인증의 경우 IAP는 승인 헤더에서 전송된 JWT의 exp 클레임을 준수합니다.

Identity Platform 로그인 흐름의 경우 사용자가 로그아웃한 후 최대 1시간 동안 IAP 세션이 유효합니다.

WebSocket 요청

IAP는 초기 요청에 대한 WebSocket만 지원하며 승인을 지속적으로 확인하지 않습니다. WebSocket 요청이 수신되면 HTTP Upgrade 요청으로 시작합니다. IAP는 이를 표준 HTTP GET 요청으로 평가합니다. 요청이 승인되면 IAP에서 요청을 서버로 전달하여 영구 연결을 엽니다. 그런 다음 IAP에서 요청을 모니터링하거나 세션을 새로고침하지 않습니다.

만료된 세션 응답

IAP는 요청 유형에 따라 만료된 세션에 대해 다른 응답을 반환합니다.

비AJAX 요청

비AJAX 요청의 경우 사용자는 세션을 새로고침하기 위해 로그인 흐름으로 리디렉션됩니다. 사용자가 아직 로그인되어 있는 경우 리디렉션이 투명하게 수행됩니다.

AJAX 요청

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

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

IAP는 쿠키를 사용하여 사용자 세션을 관리합니다. 또한 리디렉션 시퀀스를 사용하여 로그인 흐름의 일부로 세션을 설정합니다. 애플리케이션이 교차 출처 리소스 공유(CORS)를 사용하여 IAP 보호 애플리케이션에 AJAX 요청을 하는 경우 세션 설정이 항상 가능한 것은 아닙니다.

IAP로 보호되는 애플리케이션에 CORS 요청을 성공적으로 수행하려면 IAP 세션을 대역 외로 설정해야 합니다. target_domain이 IAP 보호 애플리케이션을 호스팅하는 source_domain->target_domain에서 CORS 요청을 보내는 AJAX 요청의 경우 target_domain에 세션이 설정되어 있어야 합니다. source_domaintarget_domain 간에는 쿠키를 공유할 수 있는 방법이 없습니다.

target_domain의 세션이 설정되면 개발자는 요청에서 사용자 인증 정보를 전송하도록 사용 설정해야 합니다. 기본적으로 자바스크립트 메서드는 요청에 쿠키를 연결하지 않습니다. 요청에서 사용자 인증 정보를 사용 설정하려면 XMLHttpRequest 객체로 전송된 요청은 withCredentials 속성이 true로 설정되어야 하지만 Fetch API로 전송된 요청은 credentials 옵션을 include 또는 same-origin로 설정되어야 합니다.

다음 가이드에서는 웹 개발자가 IAP 세션을 성공적으로 설정하고 새로고침할 수 있는 패턴을 권장합니다.

IAP 응답 이해

AJAX 요청의 경우 IAP는 HTTP 401: Unauthorized 상태 코드를 반환합니다. AJAX 요청 감지는 완벽하게 수행될 수 없다는 것에 주의하세요. AJAX 요청에 401 상태 코드 대신 302 상태 코드 응답이 표시되는 경우 값이 "XMLHttpRequest"X-Requested-With 헤더를 AJAX 요청에 추가할 수 있습니다. 이는 요청이 자바스크립트에서 시작된다는 것을 IAP에 알려줍니다.

HTTP 401 AJAX 응답 처리

애플리케이션이 HTTP 401을 수신한 후 IAP 세션을 설정하기 위해 애플리케이션은 URL target_domain + ?gcp-iap-mode=DO_SESSION_REFRESH의 새 창을 열 수 있습니다. 이는 target_domain에서 IAP 세션만 설정하는 특수 핸들러입니다. 창이 열린 상태로 유지되는 경우 세션을 주기적으로 새로고침하고 필요에 따라 사용자 입력을 요청합니다. 선택적으로 사용자는 창을 닫도록 선택할 수 있으며 개발자 코드의 HTTP 401 상태의 핸들러는 필요에 따라 세션 새로고침을 위해 창을 다시 팝업해야 합니다.

1단계: 앱 코드 수정

다음 예시에서는 HTTP 401 상태 코드를 처리하고 사용자에게 세션 새로고침 링크를 제공하도록 앱 코드를 수정하는 방법을 보여줍니다.

if (response.status === 401) {
  statusElm.innerHTML = 'Login stale. <input type="button" value="Refresh" onclick="sessionRefreshClicked();"/>';
}
2단계: onclick 핸들러 설치

아래 샘플 코드는 세션이 새로고침된 후 창을 닫는 onclick 핸들러를 설치합니다.

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;
  }
}