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

Idira용 워크로드 ID 페더레이션 구성

Idira Secure Workload Access(SWA)를 사용하면 OpenAI API 키를 저장하지 않고도 OpenAI API를 호출할 수 있습니다. SWA는 워크로드에 SPIFFE ID를 할당하고 해당 ID를 나타내는 서명된 토큰인 JWT-SVID를 발급합니다. OpenAI SDK는 이 토큰을 매핑된 서비스 계정의 권한을 가진 단기 OpenAI 액세스 토큰으로 교환합니다.

이 가이드에서는 OpenAI API 설정 방법을 설명합니다. Codex에서 사용하려면 이 가이드에 따라 워크로드에 토큰을 전달한 다음 Codex에서 워크로드 ID 사용의 안내를 따르세요.

시작하기 전에

다음 항목을 준비하세요.

  • 신뢰 도메인과 워크로드에 의도한 SPIFFE ID를 할당하는 증명 정책이 구성된 SWA 배포 환경
  • 워크로드에서 SWA 에이전트의 Workload API 소켓에 접근할 수 있는 권한
  • OpenAI 조직에서 워크로드 ID 공급자, 서비스 계정 매핑, 프로젝트, 서비스 계정을 관리할 수 있는 권한
  • 워크로드 ID 자격 증명을 지원하는 OpenAI SDK

Idira의 OpenAI 통합 가이드에 명시된 사전 요구 사항에 따라 SWA 인프라 설정을 완료하세요.

발급자 및 서명 키 확인

신뢰 도메인의 jwt.discovery_endpoints.oidc_discovery_url과 jwt.discovery_endpoints.jwks_uri 값을 확인하세요. 이 값은 Idira의 OIDC 구성 안내에 따라 찾을 수 있습니다.

OpenAI가 자격 증명 없이 HTTPS로 디스커버리 문서와 JWKS에 접근할 수 있어야 합니다. 발급자는 토큰의 iss 클레임에 지정된 HTTPS URL입니다. sub의 SPIFFE ID는 워크로드를 식별합니다.

https://api.openai.com/v1과 같이 OpenAI 액세스 전용 대상 값을 선택하세요. JWT-SVID를 요청할 때와 OpenAI 공급자를 구성할 때 동일한 값을 사용하세요. 대상 값은 토큰을 받을 주체를 식별하며, 토큰 교환 엔드포인트를 지정하지는 않습니다.

SWA는 기본적으로 4096비트 RSA 키로 RS512 서명을 생성합니다. OpenAI의 JWT 검증기는 이 조합을 지원합니다. SWA의 다른 서명 옵션은 Idira의 JWT 요구 사항을 참고하세요.

워크로드에 최신 JWT-SVID 전달

워크로드 환경에 spiffe-helper를 설치해 SWA 에이전트에 JWT-SVID를 요청하고 갱신하세요. 다음 구성을 helper.conf로 저장하세요. 헬퍼는 SPIFFE SDK 공통 예제에서 사용하는 경로인 /var/run/spiffe/openai.jwt에 토큰을 씁니다.

agent_address = "/tmp/swa-agent/public/api.sock"
cert_dir      = "/var/run/spiffe"
daemon_mode   = true

jwt_svids = [{
  jwt_audience       = "https://api.openai.com/v1"
  jwt_svid_file_name = "openai.jwt"
}]

Kubernetes에서는 워크로드의 파드에서 헬퍼를 사이드카로 실행하세요. 메모리 기반 emptyDir 볼륨을 /var/run/spiffe에 마운트해 워크로드와 헬퍼가 공유하도록 하고, SWA 소켓의 상위 디렉터리인 /tmp/swa-agent/public을 헬퍼에 마운트하세요. VM에서는 /run/swa-agent/api.sock을 agent_address 값으로 사용하고 토큰 디렉터리를 메모리 기반 스토리지에 두세요. 소켓 접근 및 워크로드 증명 설정은 Idira의 배포 안내를 따르세요.

헬퍼를 시작하기 전에 토큰 디렉터리를 만들고 헬퍼에 쓰기 권한을 부여하세요. 사이드카 또는 VM 서비스에서 이 구성으로 헬퍼를 시작하세요.

spiffe-helper -config helper.conf

토큰 파일과 에이전트 소켓에 대한 접근 권한은 각각 해당 리소스가 필요한 프로세스에만 부여하세요. 토큰이 만료되기 전에 헬퍼가 새 토큰으로 교체할 수 있도록 헬퍼를 계속 실행하세요.

사용하는 언어에 SPIFFE Workload API 클라이언트가 있다면 헬퍼 대신 주체 토큰 공급자에서 최신 JWT-SVID를 직접 가져올 수 있습니다. Idira의 통합 가이드에서 Workload API를 직접 사용하는 방법을 참고하세요.

토큰 확인

워크로드 안에서 토큰을 읽어 로컬 디코더가 사용할 환경 변수에 저장하세요.

export TOKEN="$(cat /var/run/spiffe/openai.jwt)"
const parts = process.env.TOKEN?.split(".") ?? [];
if (parts.length !== 3) {
  throw new Error("Expected a compact JWT with three segments");
}

const decode = (segment) => {
  if (!/^[A-Za-z0-9_-]+$/.test(segment) || segment.length % 4 === 1) {
    throw new Error("JWT segment is not valid Base64URL");
  }
  const bytes = Buffer.from(segment, "base64url");
  if (bytes.toString("base64url") !== segment) {
    throw new Error("JWT segment is not valid Base64URL");
  }
  const decoded = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
  const value = JSON.parse(decoded);
  if (value === null || Array.isArray(value) || typeof value !== "object") {
    throw new Error("JWT segment is not a JSON object");
  }
  return decoded;
};

console.log("Header:");
console.log(decode(parts[0]));
console.log("\nPayload:");
console.log(decode(parts[1]));

OpenAI 공급자를 만들기 전에 다음 필드를 확인하세요.

필드 예상 값
헤더 alg RS512 등 구성된 서명 알고리즘입니다.
헤더 kid 신뢰 도메인의 공개 JWKS에 포함된 서명 키의 ID입니다.
iss 신뢰 도메인의 HTTPS 발급자 URL입니다.
sub 이 워크로드에 할당된 SPIFFE ID입니다.
aud OpenAI 액세스용으로 선택한 대상 값이 포함되어야 합니다.
iat 및 exp 각각 토큰의 발급 시각과 만료 시각입니다. 만료되지 않은 토큰을 사용하세요.

디코더는 서명을 검증하지 않고 클레임을 읽습니다. 토큰을 로그에 기록하거나 웹 기반 디코더에 붙여 넣지 마세요. 확인을 마치면 TOKEN 환경 변수를 해제하세요.

OpenAI 워크로드 ID 페더레이션 구성

워크로드 ID 공급자 만들기

조직 설정 > 보안 > 워크로드 ID 공급자로 이동해 다음 설정으로 공급자를 만드세요.

설정 값
이름 idira-prod와 같이 고유한 이름을 입력하세요.
설명 이 공급자를 사용하는 애플리케이션과 환경을 기재하세요.
OIDC 발급자 URL JWT-SVID의 iss 값을 입력하세요.
대상 https://api.openai.com/v1과 같이 헬퍼가 요청한 대상 값을 입력하세요.
업로드한 JWKS로 토큰 검증 OIDC 디스커버리를 사용하려면 이 옵션을 꺼 두세요.
속성 변환 sub에서 직접 매핑하는 경우 비워 두세요.

OpenAI API는 토큰을 교환할 때 발급자 URL 끝의 슬래시를 무시하고 비교합니다. 예를 들어 https://issuer.example.com과 https://issuer.example.com/은 일치하는 것으로 처리합니다. 스킴과 경로를 포함한 나머지 문자는 모두 일치해야 합니다. 대상 값은 완전히 일치해야 합니다. 구성을 일관되게 유지하려면 발급된 토큰의 발급자 값을 그대로 복사하세요.

OpenAI가 디스커버리 문서나 JWKS에 접근할 수 없다면 공통 공급자 구성 안내에 따라 공개 JWKS를 업로드하세요. SWA가 서명 키를 교체하면 업로드한 키도 업데이트하세요.

SPIFFE ID를 서비스 계정에 매핑

  1. 공급자에서 서비스 계정 매핑을 만들고 idira-production-workload와 같은 이름을 지정하세요.
  2. 키 항목을 sub로 설정하고, 값 항목에는 워크로드 토큰의 SPIFFE ID를 그대로 입력하세요. 예를 들면 spiffe://prod.example.com/k8s-nodegroup/ns/my-namespace/sa/my-service-account입니다.
  3. 워크로드가 사용할 수 있는 프로젝트와 서비스 계정을 선택하세요.
  4. 워크로드에 필요한 권한을 선택하세요. 예를 들어 모델 요청에는 api.model.request가 필요합니다. 여기서 서비스 계정의 접근 권한을 더 좁게 제한할 수 있지만, 서비스 계정에 부여된 범위를 넘어 권한을 부여할 수는 없습니다. 권한을 비워 두면 WIF에서 별도의 제한을 추가하지 않습니다.

애플리케이션과 환경별로 별도의 서비스 계정을 사용하세요. 가급적 SPIFFE ID 전체를 지정하세요. 같은 접두사로 시작하는 모든 ID에 동일한 접근 권한을 부여해야 할 때만 끝에 와일드카드를 사용하세요. 매핑이 겹치지 않도록 하세요. 자세한 내용은 SPIFFE 서비스 계정 매핑을 참고하세요.

코드에서 토큰 사용

OpenAI 공급자 ID와 선택한 서비스 계정 ID를 워크로드의 환경 변수에 설정하세요.

export OPENAI_IDENTITY_PROVIDER_ID="<workload identity provider ID>"
export OPENAI_SERVICE_ACCOUNT_ID="<service account ID>"

다음 SPIFFE 공통 예제는 /var/run/spiffe/openai.jwt에서 토큰을 읽습니다. SDK가 토큰을 교환해 OpenAI 액세스 토큰을 발급받거나 갱신해야 할 때마다 주체 토큰 공급자가 현재 JWT-SVID를 반환합니다. SWA와 헬퍼는 외부 JWT-SVID를 갱신하고, OpenAI SDK는 OpenAI 액세스 토큰을 관리합니다.

Idira에서 발급한 SPIFFE JWT-SVID로 인증
import { readFile } from "node:fs/promises";
import OpenAI from "openai";

const tokenPath = "/var/run/spiffe/openai.jwt";
const identityProviderId = process.env.OPENAI_IDENTITY_PROVIDER_ID;
const serviceAccountId = process.env.OPENAI_SERVICE_ACCOUNT_ID;

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

function spiffeJwtSvidProvider(path) {
  return {
    tokenType: "jwt",
    getToken: async () => {
      const token = (await readFile(path, "utf8")).trim();
      if (!token) {
        throw new Error("The SPIFFE JWT-SVID file is empty.");
      }
      return token;
    },
  };
}

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

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

console.log(response.output_text);

검증 및 문제 해결

증명을 마친 워크로드 안에서 OPENAI_API_KEY 환경 변수를 해제한 상태로 예제를 실행하세요. 요청이 성공하면 모델의 응답이 출력됩니다. 헬퍼가 JWT-SVID를 교체하고 SDK가 OpenAI 액세스 토큰을 갱신한 후에도 요청이 계속 성공하는지 확인하세요.

증상 확인할 사항
헬퍼가 워크로드 ID를 받지 못함 워크로드가 SWA 증명 정책의 조건을 충족하고 에이전트 소켓에 접근할 수 있는지 확인하세요. 워크로드의 실행 컨텍스트에서 점검하세요.
토큰 파일이 없거나 비어 있거나 파일에 저장된 토큰이 만료됨 헬퍼가 실행 중인지, 헬퍼와 워크로드의 공유 볼륨 및 파일 경로가 일치하는지, 워크로드가 파일을 읽을 수 있는지 확인하세요. 호스트의 시계를 동기화된 상태로 유지하세요.
토큰 검증 실패 iss, aud, kid 값과 토큰 만료 여부를 확인하고 디스커버리 문서와 JWKS에 접근할 수 있는지 점검하세요. 앞에서 설명한 발급자 비교 규칙을 적용하세요.
일치하는 서비스 계정 매핑이 없음 공급자 ID와 서비스 계정 ID를 확인하세요. 매핑이 활성화되어 있는지, sub 값이 정확히 일치하는지도 확인하세요.
일치하는 매핑이 여러 개임 겹치는 매핑의 범위를 좁히거나 해당 매핑을 비활성화해 활성화된 매핑 중 하나만 일치하도록 하세요.
토큰 교환에는 성공하지만 API가 요청을 거부함 매핑된 서비스 계정의 프로젝트와 권한, 적용되는 API 접근 정책을 확인하세요.

SWA 배포 환경을 진단하는 방법은 Idira의 통합 문제 해결 안내를 참고하세요.