이 페이지에서는 사용자 계정 또는 서비스 계정에서 IAP(Identity-Aware Proxy) 보안 리소스를 인증하는 방법에 대해 설명합니다.
- 사용자 계정은 개별 사용자에 속합니다. 애플리케이션에서 사용자를 대신하여 IAP 보안 리소스에 액세스해야 하는 경우 사용자 계정을 인증합니다. 사용자 계정 사용자 인증 정보를 읽어보세요.
- 서비스 계정은 개별 사용자 대신 애플리케이션에 속합니다. 애플리케이션이 IAP 보안 리소스에 액세스하도록 허용하려는 경우 서비스 계정을 인증합니다. 서비스 계정 이해 방법을 알아보세요.
시작하기 전에
시작하기 전에 다음이 필요합니다.
- 개발자 계정, 서비스 계정 또는 모바일 앱 사용자 인증 정보를 사용하여 프로그래매틱 방식으로 연결하려는 IAP 보안 애플리케이션입니다.
사용자 계정 인증
데스크톱 또는 모바일 앱에서 사용자가 앱에 액세스하여 프로그램이 IAP 보안 리소스와 상호작용하도록 할 수 있습니다.
모바일 앱에서 인증
- IAP 보안 리소스와 동일한 프로젝트에서 모바일 앱에 대한 OAuth 2.0 클라이언트 ID를 만듭니다.
- 사용자 인증 정보 페이지로 이동합니다.
사용자 인증 정보 페이지로 이동 - IAP 보안 리소스가 포함된 프로젝트를 선택합니다.
- 사용자 인증 정보 만들기를 클릭하고 OAuth 클라이언트 ID를 선택합니다.
- 사용자 인증 정보를 만들려는 애플리케이션 유형을 선택합니다.
- 필요에 따라 이름 및 제한사항을 추가한 후 만들기를 클릭합니다.
- 사용자 인증 정보 페이지로 이동합니다.
- 표시되는 OAuth 클라이언트 창에서 연결하려는 IAP 보안 리소스의 클라이언트 ID를 확인합니다.
- Cloud IAP 보안 클라이언트 ID에 대한 ID 토큰을 가져옵니다.
- Android: Google 로그인 API를 사용하여 OIDC(OpenID Connect) 토큰을 요청합니다.
requestIdToken
클라이언트 ID를 연결 중인 리소스의 클라이언트 ID로 설정합니다. - iOS: Google 로그인을 사용하여 ID 토큰을 가져옵니다. 연결하려는 리소스의 클라이언트 ID로
serverClientID
를 설정합니다.
- Android: Google 로그인 API를 사용하여 OIDC(OpenID Connect) 토큰을 요청합니다.
- IAP 보안 리소스에 인증된 요청을 하려면
Authorization: Bearer
헤더에 ID 토큰을 포함합니다.
데스크톱 앱에서 인증
이 섹션에서는 데스크톱 명령줄에서 사용자 계정을 인증하는 방법을 설명합니다.
클라이언트 ID 설정
개발자가 명령줄에서 애플리케이션에 액세스하도록 허용하려면 먼저 데스크톱 앱 유형의 OAuth 클라이언트 ID 사용자 인증 정보를 만들어야 합니다.
- 사용자 인증 정보 페이지로 이동합니다.
사용자 인증 정보 페이지로 이동 - IAP 보안 리소스가 포함된 프로젝트를 선택합니다.
- 사용자 인증 정보 만들기를 클릭하고 OAuth 클라이언트 ID를 선택합니다.
- 애플리케이션 유형에서 데스크톱 앱을 선택하고 이름을 추가한 다음 만들기를 클릭합니다.
- 표시된 OAuth 클라이언트 창에서 클라이언트 ID 및 클라이언트 보안 비밀을 기록해둡니다. 사용자 인증 정보를 관리하거나 개발자들과 공유하기 위해 스크립트에서 이를 사용해야 합니다.
- 사용자 인증 정보 창에서 새로운 데스크톱 앱 사용자 인증 정보가 애플리케이션에 액세스하기 위해 사용되는 기본 클라이언트 ID와 함께 표시됩니다.
애플리케이션에 로그인
IAP 보안 앱에 액세스하려는 각 개발자는 먼저 로그인해야 합니다. gcloud CLI 등을 사용하여 프로세스를 스크립트로 패키징할 수 있습니다. 다음은 curl을 사용하여 로그인하고 애플리케이션에 액세스하기 위해 사용할 수 있는 토큰을 만드는 예시입니다.
- Google Cloud 리소스에 액세스할 수 있는 계정에 로그인합니다.
-
수신 요청을 에코할 수 있는 로컬 서버를 시작합니다.
$ nc -k -l 4444
참고: 이 명령어는 NetCat 유틸리티를 사용합니다. 원하는 유틸리티를 사용할 수 있습니다. -
다음 URI로 이동합니다. 여기서
DESKTOP_CLIENT_ID
는 위에서 만든 데스크톱 앱 클라이언트 ID입니다.https://accounts.google.com/o/oauth2/v2/auth?client_id=DESKTOP_CLIENT_ID&response_type=code&scope=openid%20email&access_type=offline&redirect_uri=http://localhost:4444&cred_ref=true
-
로컬 서버 출력에서 요청 매개변수를 찾습니다. 다음과 같이 표시됩니다.
GET /?code=$CODE&scope=email%20openid%20https://www.googleapis.com/auth/userinfo.email&hd=google.com&prompt=consent HTTP/1.1
CODE를 복사하여 아래에서AUTH_CODE
를 데스크톱 앱 클라이언트 ID 및 위에서 만든 보안 비밀로 바꿉니다.IAP_CLIENT_ID
는 애플리케이션에 액세스하는 데 사용되는 기본 클라이언트 ID입니다.curl --verbose \ --data client_id=DESKTOP_CLIENT_ID \ --data client_secret=DESKTOP_CLIENT_SECRET \ --data code=AUTH_CODE \ --data audience=IAP_CLIENT_ID \ --data redirect_uri=http://localhost:4444 \ --data grant_type=authorization_code \ https://oauth2.googleapis.com/token
이 코드는 애플리케이션에 액세스하는 데 사용할 수 있는
id_token
필드가 있는 JSON 객체를 반환합니다.
애플리케이션 액세스
앱에 액세스하려면 다음과 같이 id_token
을 사용합니다.
curl --verbose --header 'Authorization: Bearer ID_TOKEN' URL
토큰 갱신
로그인 과정 중에 생성된 갱신 토큰을 사용하여 새 ID 토큰을 가져올 수 있습니다. 원본 ID 토큰이 만료될 때 유용합니다. 각 ID 토큰은 약 1시간 동안 유효하며, 이 시간 동안 특정 앱에 여러 번 요청을 수행할 수 있습니다.
다음은 curl을 통해 갱신 토큰을 사용하여 새 ID 토큰을 가져오는 예시입니다. 다음 예시에서 REFRESH_TOKEN
은 로그인 과정의 토큰입니다.
IAP_CLIENT_ID
, DESKTOP_CLIENT_ID
, DESKTOP_CLIENT_SECRET
은 로그인 과정에서 사용되는 것과 동일합니다.
curl --verbose \ --data client_id=DESKTOP_CLIENT_ID \ --data client_secret=DESKTOP_CLIENT_SECRET \ --data refresh_token=REFRESH_TOKEN \ --data grant_type=refresh_token \ --data audience=IAP_CLIENT_ID \ https://oauth2.googleapis.com/token
이 코드는 앱에 액세스하는 데 사용할 수 있는 새 id_token
필드가 있는 JSON 객체를 반환합니다.
서비스 계정에서 인증
OIDC(OpenID Connect) 토큰을 사용하여 IAP 보안 리소스에 대한 서비스 계정을 인증합니다. 클라이언트 ID를 찾으려면 다음 단계를 따르세요.
- IAP 페이지로 이동합니다.
액세스하려는 리소스를 찾은 후 > OAuth 구성으로 이동을 클릭합니다.
표시된 페이지에서 클라이언트 ID를 기록해둡니다.
또한 IAP 보안 프로젝트의 액세스 목록에 서비스 계정을 추가해야 합니다. 다음 코드 샘플은 OIDC 토큰을 받는 방법을 보여줍니다. 어떤 방법을 선택하든 Authorization: Bearer
헤더에 토큰을 포함하여 IAP 보안 리소스에 대해 인증 요청을 수행해야 합니다.
기본 서비스 계정의 OIDC 토큰 가져오기
Compute Engine, App Engine 또는 Cloud Run의 기본 서비스 계정용 OIDC 토큰을 가져오려는 경우 다음 코드 샘플을 사용하여 IAP 보안 리소스에 액세스할 수 있는 토큰을 생성할 수 있습니다.
C#
Go
Java
Node.js
PHP
Python
Ruby
로컬 서비스 계정 키 파일에서 OIDC 토큰 가져오기
서비스 계정 키 파일이 있는 경우 위의 코드 샘플을 조정하여 서비스 계정 키 파일을 제공할 수 있습니다.
Bash
#!/usr/bin/env bash
set -euo pipefail
get_token() {
# Get the bearer token in exchange for the service account credentials.
local service_account_key_file_path="${1}"
local iap_client_id="${2}"
local iam_scope="https://www.googleapis.com/auth/iam"
local oauth_token_uri="https://www.googleapis.com/oauth2/v4/token"
local private_key_id="$(cat "${service_account_key_file_path}" | jq -r '.private_key_id')"
local client_email="$(cat "${service_account_key_file_path}" | jq -r '.client_email')"
local private_key="$(cat "${service_account_key_file_path}" | jq -r '.private_key')"
local issued_at="$(date +%s)"
local expires_at="$((issued_at + 3600))"
local header="{'alg':'RS256','typ':'JWT','kid':'${private_key_id}'}"
local header_base64="$(echo "${header}" | base64)"
local payload="{'iss':'${client_email}','aud':'${oauth_token_uri}','exp':${expires_at},'iat':${issued_at},'sub':'${client_email}','target_audience':'${iap_client_id}'}"
local payload_base64="$(echo "${payload}" | base64)"
local signature_base64="$(printf %s "${header_base64}.${payload_base64}" | openssl dgst -binary -sha256 -sign <(printf '%s\n' "${private_key}") | base64)"
local assertion="${header_base64}.${payload_base64}.${signature_base64}"
local token_payload="$(curl -s \
--data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
--data-urlencode "assertion=${assertion}" \
https://www.googleapis.com/oauth2/v4/token)"
local bearer_id_token="$(echo "${token_payload}" | jq -r '.id_token')"
echo "${bearer_id_token}"
}
main(){
# TODO: Replace the following variables:
SERVICE_ACCOUNT_KEY="service_account_key_file_path"
IAP_CLIENT_ID="iap_client_id"
URL="application_url"
# Obtain the Bearer ID token.
ID_TOKEN=$(get_token "${SERVICE_ACCOUNT_KEY}" "${IAP_CLIENT_ID}")
# Access the application with the Bearer ID token.
curl --header "Authorization: Bearer ${ID_TOKEN}" "${URL}"
}
main "$@"
그 외 모든 경우에 OIDC 토큰 가져오기
그 외 모든 경우에는 IAM Credentials API를 사용하여 다른 서비스 계정의 액세스 토큰을 기반으로 IAP 보안 리소스에 액세스하기 직전에 OIDC 토큰을 생성합니다.
service account token creator
역할이 있는 액세스 토큰의 계정을 대상 계정에 추가합니다. 이러면 대상 서비스 계정의 OIDC 토큰을 만드는 데 필요한 IAM 권한이 대상 계정에 부여됩니다.- 액세스 토큰이 있는 대상 서비스 계정에서 generateIdToken을 호출합니다.
audience
필드를 클라이언트 ID로 설정하는 경우 특히 주의하세요.
Proxy-Authorization 헤더에서 인증
애플리케이션이 Authorization
요청 헤더를 점유하는 경우 대신 Proxy-Authorization: Bearer
헤더에 ID 토큰을 포함할 수 있습니다. Proxy-Authorization
헤더에 유효한 ID 토큰이 있으면 IAP가 이 토큰을 사용하여 요청을 승인합니다. 요청을 승인하면 IAP가 콘텐츠를 처리하지 않고 애플리케이션에 Authorization
헤더를 전달합니다.
Proxy-Authorization
헤더에 유효한 ID 토큰이 없는 경우 IAP가 Authorization
헤더 처리를 계속 진행하며 요청이 애플리케이션에 전달되기 전에 Proxy-Authorization
헤더를 제거합니다.
다음 단계
- 승인: Bearer 토큰에 대해 알아봅니다.
- Android 로그인 또는 iOS 로그인을 시도합니다.