For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
기본 탐색 메뉴
Theme

Google Cloud용 워크로드 아이덴티티 제휴 구성

다음 두 가지 방식으로 Google Cloud를 워크로드 아이덴티티 공급자로 사용할 수 있습니다.

  • Google 워크로드 아이덴티티: Google이 서명하여 워크로드에 연결된 Google 서비스 계정에 발급한 OIDC 토큰을 단기 OpenAI 액세스 토큰으로 교환합니다.
  • Google Kubernetes Engine: 프로젝션된 GKE 서비스 계정 토큰을 단기 OpenAI 액세스 토큰으로 교환합니다.

Google 워크로드 아이덴티티

Google Cloud 워크로드는 장기 서비스 계정 키를 저장하지 않고도 Google 메타데이터 서버에 서명된 OIDC ID 토큰을 요청할 수 있습니다. OpenAI 워크로드 아이덴티티 제휴에서는 Google ID 토큰이 주체 토큰 역할을 합니다. OpenAI는 이 토큰을 검증한 후 OpenAI 액세스 토큰을 발급합니다. 이 플로우는 Compute Engine, Cloud Run, 연결된 Google 서비스 계정을 사용하는 GKE 워크로드, 그리고 메타데이터 서버의 ID 엔드포인트를 제공하는 다른 Google 관리형 런타임에서 사용할 수 있습니다.

Google 워크로드 아이덴티티 설정

OpenAI API를 호출할 워크로드용 Google 서비스 계정을 만드세요. 전체 설정 절차는 Google의 서비스 계정 만들기 가이드를 참고하세요.

예를 들어 Google Cloud CLI로 다음과 같이 서비스 계정을 만들 수 있습니다.

gcloud iam service-accounts create openai-wif \
  --description="Service account for OpenAI workload identity federation" \
  --display-name="OpenAI workload identity federation"

Compute Engine VM을 만들 때 서비스 계정을 연결하거나, 애플리케이션을 실행하는 Google Cloud 리소스에 서비스 계정을 연결하세요. 해당 리소스는 런타임에 Google 메타데이터 서버를 호출할 수 있어야 합니다. VM 설정 방법은 Google의 사용자 관리형 서비스 계정을 사용하는 VM 만들기 가이드를 참고하세요.

이 플로우에서는 서비스 계정 키를 만들거나 다운로드하지 마세요. 워크로드는 연결된 서비스 계정을 사용해 메타데이터 서버에 단기 OIDC 토큰을 요청합니다.

Google ID 토큰 가져오기

서비스 계정이 연결된 Google Cloud 리소스에서 미리 설정한 대상 값을 지정해 메타데이터 서버에 OIDC ID 토큰을 요청하세요. OpenAI는 이 토큰을 주체 토큰으로 받아 액세스 토큰을 발급합니다.

AUDIENCE="https://api.openai.com/v1"

TOKEN=$(curl -sS -G -H "Metadata-Flavor: Google" \
  "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity" \
  --data-urlencode "audience=${AUDIENCE}")
export TOKEN

메타데이터 서버는 Google이 서명한 JWT를 반환합니다. 메타데이터 서버의 ID 엔드포인트에 대한 자세한 내용은 Google의 VM ID 확인 가이드를 참고하세요.

토큰 확인

워크로드 아이덴티티 제휴를 구성하기 전에 Google ID 토큰을 환경 변수 TOKEN으로 내보낸 다음, 아래 스크립트를 로컬에서 실행해 토큰의 클레임을 확인하세요.

const parts = process.env.TOKEN?.split(".") ?? [];
if (parts.length !== 3) {
  throw new Error("Expected a compact JWT with three segments");
}
if (!/^[A-Za-z0-9_-]+$/.test(parts[1]) || parts[1].length % 4 === 1) {
  throw new Error("JWT payload is not valid Base64URL");
}

const bytes = Buffer.from(parts[1], "base64url");
if (bytes.toString("base64url") !== parts[1]) {
  throw new Error("JWT payload is not valid Base64URL");
}
const decoded = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
const claims = JSON.parse(decoded);
if (claims === null || Array.isArray(claims) || typeof claims !== "object") {
  throw new Error("JWT payload is not a JSON object");
}
console.log(decoded);

이 명령어는 토큰 서명을 검증하지 않고 JWT 페이로드를 디코딩합니다. 프로덕션 토큰은 로컬 디코더로 확인하고 타사 도구에 붙여 넣지 마세요.

Google 메타데이터 서버에서 받은 ID 토큰을 디코딩하면 다음과 비슷한 결과가 나옵니다.

{
  "iss": "https://accounts.google.com",
  "aud": "https://api.openai.com/v1",
  "azp": "110123456789012345678",
  "sub": "110123456789012345678",
  "email": "openai-wif@my-project.iam.gserviceaccount.com",
  "email_verified": true,
  "iat": 1716235422,
  "exp": 1716239022
}

디코딩한 페이로드의 값을 OpenAI에 설정한 발급자, 대상, 매핑 값과 비교하세요. 토큰을 교환하기 전에 iss, aud, email, sub 클레임을 확인하면 대부분의 구성 문제를 찾을 수 있습니다.

워크로드 아이덴티티 제휴 설정

OpenAI에서 Google이 발급한 ID 토큰에 사용할 워크로드 아이덴티티 공급자를 만든 다음, 토큰에서 값이 변하지 않는 클레임을 기준으로 서비스 계정 매핑을 추가하세요.

먼저 워크로드 아이덴티티 공급자를 구성한 후 서비스 계정 매핑을 만드세요.

워크로드 아이덴티티 공급자 설정

  1. 워크로드 아이덴티티 공급자를 만드세요. 이름 필드에 google-workload-identity-prod처럼 고유한 값을 입력하세요. 설명 필드에는 Production Google Cloud workloads처럼 관리자가 공급자를 식별하는 데 도움이 되는 내용을 입력하세요.

  2. 발급자와 대상을 설정하세요. OIDC 발급자 URL 필드에 https://accounts.google.com을 입력하세요. 대상 필드에는 워크로드가 Google 메타데이터 서버에 토큰을 요청할 때 지정하는 맞춤 대상 값(예: https://api.openai.com/v1)을 입력하세요. 이 값은 토큰의 aud 클레임과 일치해야 합니다.

  3. Google OIDC 검색을 사용하세요. 토큰 검증에 업로드한 JWKS 사용 옵션은 꺼 두세요. OpenAI는 Google의 OIDC 검색 메타데이터와 JWKS를 사용해 Google이 서명한 ID 토큰을 검증합니다.

  4. 기존 클레임에서 매핑 속성을 도출해야 한다면 속성 변환을 추가하세요. 예를 들어 속성 이름에 subject, 표현식에 assertion.sub를 입력하면 주체 클레임에서 openai.subject를 만들 수 있습니다. 대시보드는 openai. 접두사를 자동으로 붙입니다. 원본 토큰 클레임의 이름이 이미 openai.로 시작하더라도 해당하는 변환을 설정하지 않으면 openai. 매핑 키에 그 클레임이 사용되지 않습니다.

서비스 계정 매핑 설정

  1. 서비스 계정 매핑을 만드세요. 이름 필드에 compute-openai-wif처럼 해당 워크로드 아이덴티티 공급자 내에서 고유한 값을 입력하세요. 설명 필드에는 Production Compute Engine OpenAI API workload처럼 어떤 워크로드가 이 매핑을 사용할 수 있는지 적으세요.

  2. 값이 변하지 않는 Google 서비스 계정 클레임을 매핑 조건으로 지정하세요. 일치해야 하는 클레임마다 행을 하나씩 추가하고 키 필드와 값 필드를 채우세요. sub는 값이 변하지 않고 고유하므로 서비스 계정을 식별하는 기본 기준으로 사용하세요. 계정을 쉽게 알아볼 수 있도록 email을 추가 조건으로 지정해도 됩니다.

  3. OpenAI 대상을 선택하세요. 프로젝트 필드에서 대상 서비스 계정이 속한 OpenAI 프로젝트를 선택하세요. 서비스 계정 필드에서는 google-workload-identity-prod-openai-wif처럼 Google Cloud 워크로드가 사용할 수 있는 OpenAI 서비스 계정을 선택하세요.

  4. 필요하면 API 권한을 제한하세요. 권한 필드에서 api.model.request, api.vector_store.read 등 적절한 권한을 선택하면 이 매핑을 통해 발급되는 액세스 토큰의 권한 범위를 더 좁힐 수 있습니다. WIF에만 적용되는 범위 제한을 추가하지 않으려면 이 필드를 비워 두세요. 이 경우에도 토큰에는 매핑된 서비스 계정의 권한이 적용됩니다.

코드에서 토큰 사용

OpenAI SDK 클라이언트가 메타데이터 서버에 Google ID 토큰을 요청하고 이를 OpenAI가 발급하는 액세스 토큰으로 교환하도록 구성하세요.

OPENAI_WIF_AUDIENCE에 워크로드 아이덴티티 공급자의 대상으로 설정한 맞춤 대상 값을 지정하세요. SDK는 해당 대상에 대한 Google ID 토큰을 요청해 OpenAI가 발급하는 액세스 토큰으로 교환하고, 이 OpenAI 토큰으로 API 요청을 인증합니다.

Google 메타데이터 서버의 ID 토큰으로 인증하기
import OpenAI from "openai";

const metadataEndpoint =
  "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity";

const identityProviderId = process.env.OPENAI_IDENTITY_PROVIDER_ID;
const serviceAccountId = process.env.OPENAI_SERVICE_ACCOUNT_ID;
const audience = process.env.OPENAI_WIF_AUDIENCE;

if (!identityProviderId || !serviceAccountId || !audience) {
  throw new Error(
    "Set OPENAI_IDENTITY_PROVIDER_ID, OPENAI_SERVICE_ACCOUNT_ID, and OPENAI_WIF_AUDIENCE"
  );
}

function googleMetadataIdentityTokenProvider(audience) {
  return {
    tokenType: "jwt",
    getToken: async () => {
      const url = new URL(metadataEndpoint);
      url.searchParams.set("audience", audience);
      url.searchParams.set("format", "full");

      const response = await fetch(url, {
        headers: { "Metadata-Flavor": "Google" },
      });

      if (!response.ok) {
        throw new Error(
          `Google metadata token request failed with status ${response.status}.`
        );
      }

      const token = (await response.text()).trim();
      if (!token) {
        throw new Error(
          "Google metadata server did not return an identity token."
        );
      }

      return token;
    },
  };
}

const client = new OpenAI({
  workloadIdentity: {
    identityProviderId,
    serviceAccountId,
    provider: googleMetadataIdentityTokenProvider(audience),
  },
});

const response = await client.responses.create({
  model: "gpt-5.6-terra",
  input: "Say hello from Google Cloud workload identity federation.",
});

console.log(response.output_text);

Google Cloud 권장 사항

  • 워크로드마다 전용 Google 서비스 계정을 사용하세요. 서로 관련 없는 서비스나 환경 간에는 서비스 계정을 공유하지 마세요.
  • 장기 서비스 계정 키 대신 워크로드 아이덴티티 플로우를 사용하세요. 메타데이터 서버의 ID 토큰이나 GKE 워크로드 아이덴티티를 사용할 수 있는 워크로드에는 JSON 키 파일을 배포하거나 주기적으로 교체하는 방식을 피하세요.
  • 각 ID의 사용 범위는 운영상 가능한 한 작은 워크로드 단위로 제한하세요. 애플리케이션마다 서비스 계정을 분리하면 감사 시 접근 주체를 명확히 파악하고 최소 권한 원칙을 적용하기 쉽습니다.
  • 속성 기반 매핑은 신중하게 구성하세요. 가능하면 변경될 수 있는 메타데이터보다 서비스 계정의 주체 클레임처럼 값이 변하지 않는 식별자를 사용하세요.
  • 프로덕션 프로젝트와 비프로덕션 프로젝트를 분리하세요. 프로젝트를 분리하면 의도치 않게 권한을 공유할 위험이 줄고 감사도 간소화됩니다.
  • 필요한 IAM 권한만 부여하세요. Google ID의 권한은 워크로드에 필요한 범위로 제한하세요.
  • 서비스 계정 사용 현황을 모니터링하세요. 예상하지 못한 토큰 교환은 구성이 의도한 상태에서 벗어났거나 워크로드가 침해되었다는 징후일 수 있습니다.