프라이빗 안전 처리(PSP)를 적용한 데이터 비보관(ZDR)을 사용하면 OpenAI가 고객의 프롬프트나 응답을 보관하지 않고도 오프라인에서 안전성을 자동으로 검토할 수 있습니다. 이 가이드에서는 PSP를 적용한 ZDR의 작동 방식과 고객이 운영 시 지켜야 할 사항을 설명합니다. 전체 아키텍처와 보안 모델은 프라이빗 안전 처리 기술 백서를 참고하세요.
세 가지 설계 원칙
- 고객이 콘텐츠를 통제합니다
고객 콘텐츠는 고객이 통제하는 스토리지에 저장됩니다. 보호된 안전성 기록을 조회하고 복호화하는 데 필요한 접근 권한과 고객 관리형 엔터프라이즈 키 관리(EKM) 권한은 고객이 통제합니다. - 사람이 직접 검토하지 않습니다
안전성 검토를 통해 OpenAI 직원이 보호된 고객 콘텐츠를 읽을 수 있는 경로가 새로 생겨서는 안 됩니다. 암호화된 고객 콘텐츠는 사람의 접근을 차단하고 하드웨어 기반 증명을 거친 승인된 안전성 런타임에서 복호화됩니다. PSP로 보호되는 검토 환경에서 평문으로 내보내는 정보는 범위가 제한된 안전성 신호와 운영 메타데이터뿐입니다. - 콘텐츠는 안전 목적으로만 보관합니다
고객이 통제하는 스토리지에 저장된 콘텐츠는 승인된 안전 목적으로만 사용합니다. 고객 콘텐츠를 모델 학습에 사용하거나 OpenAI 내부의 다른 조직 또는 파트너사의 다른 조직에 제공할 수 없습니다.
PSP를 적용한 ZDR의 작동 방식
아키텍처는 두 가지 플로우로 구성됩니다.
- API 요청 및 보관 플로우는 대상 API 콘텐츠를 보호하고 고객이 통제하는 스토리지 컨테이너에 보관합니다.
- 비동기 안전성 파이프라인은 승인된 자동 안전성 검토를 수행할 때만 기록을 조회하며, 정해진 범위 내에서 안전성 판정 결과를 내보냅니다.
API 요청 및 보관
안전성 분류기의 검토 요청이나 승인된 샘플링 정책에 따라 상호작용(고객의 프롬프트와 모델의 응답)이 검토 대상으로 선정됩니다. 검토 요청 자체로 정책 위반이 확인되는 것은 아닙니다.
시스템은 기록을 암호화한 후 고객의 리전별 클라우드 스토리지에 씁니다. OpenAI는 콘텐츠 사본을 보관하지 않고 운영 메타데이터와 스토리지 참조 정보가 담긴 인덱스를 유지합니다. 암호화와 저장은 비동기로 실행되므로 추론을 차단하지 않습니다.


비동기 안전성 파이프라인
PSP를 적용한 ZDR은 고객 스토리지에서 암호화된 기록을 가져와 복호화 가능 여부를 확인합니다. 안전성 검토 런타임은 하드웨어 기반 증명을 거치고 사람의 접근을 차단하는 컴퓨팅 환경입니다. OpenAI 워크로드 중 이 런타임만 고객 콘텐츠를 복호화할 수 있도록 설계되었습니다. 런타임은 승인된 검토용 프롬프트와 고객 콘텐츠를 노출하지 않는 출력 스키마를 사용해 안전성을 자동으로 검토합니다.
검토 환경에서 평문으로 내보낼 수 있는 정보는 범위가 미리 정해진 안전성 신호와 승인된 운영 메타데이터뿐입니다. 상세 결과는 런타임을 벗어나기 전에 암호화되며, 고객의 클라우드 스토리지에 원본 기록과 동일한 만료 시점으로 저장됩니다. PSP를 적용한 ZDR은 기록을 암호화해 고객의 리전별 클라우드 스토리지에 쓰며 TTL은 30일입니다.


고객 콘텐츠 암호화
고객 스토리지에 보관되는 각 기록에는 두 겹의 암호화가 적용됩니다.
- OpenAI 관리형 HPKE 암호화: 내부 암호화 계층은 승인된 안전성 검토 런타임에서만 고객 콘텐츠를 복호화할 수 있도록 제한합니다.
- 고객 관리형 암호화: 엔터프라이즈 키 관리(EKM)는 고객이 통제하는 키 관리 서비스를 사용해 외부 암호화 계층을 추가합니다.
EKM을 활성화하면 OpenAI의 내부 복호화 키만으로는 저장된 기록을 복호화할 수 없습니다. 고객 관리형 키를 사용할 권한도 필요합니다. 이 권한을 철회하면 보관된 기록을 복호화할 수 없지만, 기록이 삭제되거나 이미 완료된 처리가 취소되지는 않습니다.
이러한 추가 제어를 위해 EKM을 활성화하는 것이 좋습니다. EKM 키를 보관하는 KMS는 고객이 구성한 스토리지와 다른 리전에 있어도 됩니다. 권한 부여와 철회는 EKM 기술 FAQ를, 암호화, 기밀 컴퓨팅, 가드레일, 투명성은 기술 백서를 참고하세요.
PSP 복호화를 사용하면 고객이 통제하는 비대칭 키로 연결된 클라우드 스토리지의 PSP 기록에 포함된 고객 콘텐츠를 복호화할 수 있습니다. OpenAI는 공개 키를 사용하며, 비공개 키는 고객의 클라우드 키 관리 서비스에 보관됩니다. 이 기능은 EKM과 별개이며 OpenAI 직원에게 고객 콘텐츠 접근 권한을 부여하지 않습니다.
비대칭 키 설정에서 AWS KMS, Azure Key Vault, Google Cloud KMS 설정 및 키 등록 방법을 확인하세요. PSP 복호화의 사용 가능 여부와 활성화 여부는 OpenAI 담당자에게 확인하세요. 키를 등록하는 것만으로 PSP가 활성화되거나 스토리지가 구성되지는 않습니다. 해당 키에 대해 PSP 복호화가 활성화된 상태에서 작성된 기록만 그 키로 복호화할 수 있습니다. 기존 기록은 변환되지 않습니다.
복호화 절차, 기록 형식, 키 파생 방법은 PSP 기록 복호화를 참고하세요.
프로젝트 읽기 및 쓰기 권한이 있는 조직 Admin API 키를 사용하세요. 키를 OPENAI_ADMIN_KEY에 안전하게 불러오세요. 프로젝트 추론 키는 사용할 수 없습니다. 예제에서는 curl과 Bash 호환 셸을 사용합니다.
조직 ID, 프로젝트 ID, 키 등록 시 반환된 extkey ID를 설정하세요.
123456API_BASE="https://api.openai.com/v1"
ORG_ID="<OPENAI_ORG_ID>"
PROJECT_ID="<CUSTOMER_PROJECT_ID>"
KEY_ID="<EXTERNAL_KEY_ID>"
OPENAI_ADMIN_KEY="<OPENAI_ADMIN_KEY>"
PROJECTS_URL="$API_BASE/organization/projects"psp_decryption_key_id를 같은 조직에서 반환된 extkey ID로 설정하세요. 프로젝트의 EKM 키를 지정하는 external_key_id는 변경하지 마세요.
12345curl --fail-with-body -sS "$PROJECTS_URL/$PROJECT_ID" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $ORG_ID" \
-H "Content-Type: application/json" \
--data "{\"psp_decryption_key_id\":\"$KEY_ID\"}"성공하면 HTTP 200이 반환됩니다. 프로젝트를 조회해 선택한 키를 확인하세요.
123curl --fail-with-body -sS "$PROJECTS_URL/$PROJECT_ID" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $ORG_ID"프로젝트 목록을 조회해도 psp_decryption_key_id가 반환됩니다. 키 등록 정보의 api_project_ids에는 연결된 프로젝트가 표시됩니다. psp_decryption_key_id를 생략하면 기존 선택이 유지됩니다. 같은 ID를 다시 선택해도 됩니다.
먼저 PSP 복호화 키 선택에 나온 API 변수를 설정하세요.
null을 보내면 키 선택이 해제됩니다. 필드를 생략하면 기존 선택이 유지됩니다.
12345curl --fail-with-body -sS "$PROJECTS_URL/$PROJECT_ID" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $ORG_ID" \
-H "Content-Type: application/json" \
--data '{"psp_decryption_key_id":null}'고객 소유의 AWS S3 버킷, Azure Blob 컨테이너, Google Cloud Storage 버킷 또는 Oracle Cloud Infrastructure(OCI) Object Storage 버킷을 OpenAI 프로젝트에 연결하세요. 사용하는 클라우드에 맞는 설정 절차를 완료한 다음 연결을 등록하고 검증하세요.
PSP를 적용한 ZDR은 프로젝트별로 활성화됩니다. 활성화하면 일반적으로 PSP가 필요하지 않은 모델에 대한 요청을 포함해 해당 프로젝트의 모든 API 트래픽에 PSP 정책이 적용됩니다. 지원 대상 모델에 PSP 없이 ZDR을 사용하려면 PSP 없이 ZDR만 사용하도록 구성한 별도 프로젝트를 통해 해당 요청을 보내세요.
시작하기 전에
- 이미 데이터 비보관 승인을 받은 조직은 API 콘솔에서 바로 PSP를 적용한 ZDR을 설정할 수 있습니다. 아직 ZDR 승인을 받지 않았다면 자격 및 승인 요건을 확인하세요.
- 지원되는 스토리지 리전 중 프로젝트의 데이터 레지던시 요건을 충족하는 리전이라면 어디든 선택할 수 있습니다. 클라우드 계정에서 스토리지를 생성하고 접근 권한을 위임할 수 있어야 합니다.
- 조직 관리자에게 API 콘솔에서 스토리지를 등록하고 검증하도록 요청하세요. Management API를 사용할 때는 OpenAI 조직 Admin API 키가 필요합니다. 프로젝트 관리자는 안내와 상태를 확인할 수 있습니다. 프로젝트 추론 키로는 Management API를 호출할 수 없습니다.
API 콘솔에서 스토리지 설정 열기
- 조직 설정 > 데이터 제어 > 데이터 보관 메뉴를 열고 스토리지 연결을 선택하세요.
- 외부 스토리지 연결에서 AWS, Azure, GCP, OCI 중 하나를 선택한 다음 프로젝트를 선택하세요. 스토리지 연결은 프로젝트 설정 > 데이터 보관에서도 열 수 있습니다.
- 아래의 클라우드 설정을 완료하세요. 그런 다음 대화상자에 스토리지 정보를 입력하고 연결 및 검증을 선택하세요.
클라우드별 설정
AWS를 사용한다면 다음 절차를 완료하세요. 다른 클라우드를 사용한다면 Azure Blob Storage, Google Cloud Storage, OCI Object Storage 중 해당 섹션으로 이동하세요.
AWS 온보딩 안내(2분 10초, 음성 없음). 설정값은 아래 절차에서 확인하세요.
1. 버킷 생성
프로젝트의 데이터 레지던시 요건을 충족하는 리전에 전용 S3 버킷을 생성하세요. 데이터 레지던시가 꺼져 있다면 어느 리전에나 버킷을 생성할 수 있습니다.
- ACL 비활성화 설정을 유지하세요.
- 모든 퍼블릭 액세스 차단을 켜세요.
- 버킷 ARN을 기록해 두세요. 아래에서
CUSTOMER_BUCKET_ARN으로 사용합니다.

2. 수명 주기 규칙 설정
버킷의 관리 > 수명 주기 규칙 생성 페이지를 열고 다음과 같이 설정하세요.
- 규칙 이름:
psp-retention - 접두사:
openai/ - 작업: 객체의 현재 버전 만료
- 경과 일수: 30일
규칙을 활성화하세요. 다른 규칙에 따라 이 기록들이 더 일찍 만료되지 않는지 확인하세요. 이 설정은 객체의 수명 주기 만료 시점을 결정합니다. OpenAI의 복호화 키 만료 시점은 별도로 관리됩니다.

3. 접근 정책 생성
IAM > 정책 > 정책 생성에서 JSON을 선택하세요. CUSTOMER_BUCKET_ARN을 실제 버킷 ARN(예: arn:aws:s3:::your-psp-bucket)으로 바꾸고 정책 이름을 psp-bucket-policy로 저장하세요.
123456789101112131415{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetLifecycleConfiguration",
"Resource": "CUSTOMER_BUCKET_ARN"
},
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
"Resource": "CUSTOMER_BUCKET_ARN/*"
}
]
}4. IAM 역할 생성
IAM > 역할 > 역할 생성에서 사용자 지정 신뢰 정책을 선택하세요.

아래 정책을 사용하세요. CUSTOMER_PROJECT_ID를 실제 OpenAI 프로젝트 ID로 바꾸세요. OpenAI 보안 주체의 ARN은 변경하지 마세요.
1234567891011121314151617{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::790389265272:role/CustomerStorage"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": ["CUSTOMER_PROJECT_ID"]
}
}
}
]
}생성 중인 역할에 psp-bucket-policy를 연결하세요. 역할 이름은 psp-role로 지정해도 됩니다. 역할 ARN을 CUSTOMER_ROLE_ARN으로 기록해 두세요. sts:ExternalId의 프로젝트 ID는 등록할 프로젝트의 ID와 일치해야 합니다.

스토리지 등록으로 이동하세요.
Azure를 사용한다면 다음 절차를 완료하세요.
1. 스토리지 계정 생성
Azure 상용 클라우드에 전용 계정을 생성하세요. 프로젝트의 데이터 레지던시와 일치하는 미국 또는 EU의 승인된 스토리지 리전을 선택하세요.
- 계정 종류:
StorageV2 - 기본 사항 > 성능: 표준
- 기본 사항 > 중복성: LRS 또는 ZRS(권장)
- 고급 > 액세스 계층: 핫
- 고급 > 계층 구조 네임스페이스: 사용 안 함
- 네트워킹 > 공용 네트워크 액세스: 모든 네트워크에서 사용
- 보안 > 보안 전송: HTTPS 필수, 최소 TLS 1.2
- 보안 > 익명 Blob 액세스: 사용 안 함
- 보안 > 스토리지 계정 키 액세스: 사용 안 함
- 보안 > Microsoft Entra 권한 부여: 사용
네트워크 설정이 고객의 클라우드 요건을 충족하는지 확인하세요. 소버린 클라우드 엔드포인트나 사용자 지정 엔드포인트 대신 계정의 기본 Blob 엔드포인트를 사용하세요.


2. 컨테이너 생성
스토리지 계정 > 데이터 스토리지 > 컨테이너 > 컨테이너 추가에서 프라이빗 컨테이너를 생성하세요. 컨테이너 > 설정 > 메타데이터를 열고 openai_organization_id에 정확한 OpenAI 조직 ID를 입력하세요. 이 필드는 필수입니다.
하나의 OpenAI 프로젝트만 컨테이너를 사용하도록 제한하려면 openai_project_id에도 해당 프로젝트의 정확한 ID를 입력하세요. 이 필드는 선택 사항입니다. 값을 지정하면 ID가 일치하는 프로젝트만 컨테이너를 등록하거나 검증할 수 있고, 컨테이너에서 데이터를 읽거나 컨테이너에 데이터를 쓸 수 있습니다.
openai_project_id를 생략하고 스토리지 리전이 두 프로젝트의 데이터 레지던시 요건을 모두 충족하면 같은 조직에 속한 두 OpenAI 프로젝트가 컨테이너를 공유할 수 있습니다. 각 프로젝트에서 컨테이너를 등록하고 검증하세요.
메타데이터는 스토리지 계정이나 개별 Blob이 아닌 컨테이너에 추가하세요.
3. 수명 주기 규칙 설정
스토리지 계정 > 데이터 관리 > 수명 주기 관리 > 추가에서 전용 계정의 모든 현재(기본) 블록 Blob에 적용되는 규칙을 추가하고 활성화하세요.
- 작업: 마지막 수정 후 30일이 지나면 삭제
- 필터: 접두사 또는 태그 필터 없음


4. OpenAI에 접근 권한 부여
디렉터리 관리자에게 OpenAI 애플리케이션을 테넌트에 추가하도록 요청하세요. 아래의 CUSTOMER_TENANT_ID를 실제 Azure 테넌트 ID로 바꾸세요. 애플리케이션 ID는 변경하지 마세요.
123az login --tenant '<CUSTOMER_TENANT_ID>'
az ad sp create --id 'e5627955-3059-4a88-89f8-73843190624d' \
--query '{name:displayName,objectId:id}' -o table애플리케이션이 이미 있으면 az ad sp show에 동일한 --id와 쿼리를 사용하세요. 애플리케이션 이름과 해당 테넌트 내의 개체 ID를 기록해 두세요.
스토리지 계정에서 스토리지 계정 > 액세스 제어(IAM) > 역할 할당 추가를 여세요. 읽기 권한자 역할을 선택하고 다음에 대한 액세스 할당을 사용자, 그룹 또는 서비스 주체로 설정한 다음 CSG - Azure Blob Storage Prod를 검색해 선택하세요.


그런 다음 Storage Blob 데이터 기여자 역할을 선택하고 다음에 대한 액세스 할당을 사용자, 그룹 또는 서비스 주체로 설정한 후 CSG - Azure Blob Storage Prod를 검색해 선택하세요.
애플리케이션 자격 증명은 OpenAI가 관리합니다. 스토리지 키, SAS 토큰, 클라이언트 비밀을 생성하거나 공유하지 마세요.
1. 버킷 생성
Cloud Storage > 버킷에서 OpenAI 프로젝트의 데이터 레지던시 요건을 충족하는 위치에 버킷을 생성하고 다음과 같이 설정하세요.
- 공개 액세스 방지: 사용
- 액세스 제어: 균일
기본 소프트 삭제 정책(데이터 복구용) 설정은 필요에 따라 비활성화해도 됩니다. 다음 단계에서 수명 주기에 따른 삭제를 구성합니다.
글로벌 프로젝트의 경우 사용할 리전마다 이 GCP 설정을 반복하세요.

2. 수명 주기 규칙 설정
버킷의 수명 주기 탭에서 다음 조건으로 객체 삭제 규칙을 추가하세요.
- 객체 이름이 접두사와 일치:
openai/ - 경과 일수: 30일

3. Google Cloud 프로젝트 번호 확인
IAM 및 관리자 > 설정에서 워크로드 아이덴티티 풀이 속한 프로젝트의 프로젝트 번호(숫자)를 복사해 <CUSTOMER_GCP_PROJECT_NUMBER>로 사용하세요.
4. 워크로드 아이덴티티 풀 및 공급자 생성
IAM 및 관리자 > 워크로드 아이덴티티 제휴에서 워크로드 아이덴티티 풀을 생성하고 다음 설정으로 OpenID Connect(OIDC) 공급자를 추가하세요.
- 발급기관(URL):
https://accounts.google.com - 허용된 대상:
<CUSTOMER_PROJECT_ID>(고객의 OpenAI 프로젝트 ID)

다음과 같이 속성을 매핑하세요.
| Google 속성 | OIDC 값 |
|---|---|
google.subject |
assertion.sub |
attribute.openai_project |
assertion.aud |
아래 속성 조건을 설정하세요. OpenAI 프로덕션 ID의 주체 값 112981926705442324573은 변경하지 마세요.
assertion.sub == '112981926705442324573' && assertion.aud == '<CUSTOMER_PROJECT_ID>'
풀 ID와 공급자 ID를 각각 <CUSTOMER_GCP_POOL_ID>와 <CUSTOMER_GCP_PROVIDER_ID>로 기록해 두세요.
OpenAI 프로젝트가 여러 개인 경우
같은 고객에 속한 프로젝트는 풀과 공급자를 재사용할 수 있습니다. 허용된 대상에 각 프로젝트 ID를 추가하고 속성 조건을 업데이트하세요.
assertion.sub == '112981926705442324573' &&
(assertion.aud == '<CUSTOMER_PROJECT_ID_1>' || assertion.aud == '<CUSTOMER_PROJECT_ID_2>')버킷 접근 권한 부여와 스토리지 등록은 프로젝트별로 완료하세요.
5. 커스텀 스토리지 역할 생성
IAM 및 관리자 > 역할에서 버킷이 속한 Google Cloud 프로젝트에 다음 권한을 가진 커스텀 역할을 생성하세요.
storage.buckets.get
storage.objects.create
storage.objects.get
storage.objects.delete6. OpenAI에 버킷 접근 권한 부여
버킷의 권한 > 액세스 권한 부여에서 다음 주체를 추가하세요.
principalSet://iam.googleapis.com/projects/<CUSTOMER_GCP_PROJECT_NUMBER>/locations/global/workloadIdentityPools/<CUSTOMER_GCP_POOL_ID>/attribute.openai_project/<CUSTOMER_PROJECT_ID>5단계에서 생성한 커스텀 역할을 선택하세요.

스토리지 등록으로 이동하세요.
1. 버킷 생성
OCI 콘솔에서 스토리지 > 오브젝트 스토리지 및 아카이브 스토리지 > 버킷을 열고 전용 버킷을 생성하세요. 다음 표에서 프로젝트의 데이터 레지던시와 일치하는 상용 리전을 선택하세요.
| 지역 | 지원되는 OCI 리전 |
|---|---|
| 미국 | us-ashburn-1, us-chicago-1, us-phoenix-1, us-sanjose-1 |
| EU | eu-amsterdam-1, eu-frankfurt-1, eu-madrid-1, eu-madrid-3, eu-marseille-1, eu-milan-1, eu-paris-1, eu-stockholm-1, eu-turin-1, eu-zurich-1 |
버킷을 다음과 같이 설정하세요.
- 스토리지 계층: 표준(자동 계층화 비활성화)
- 공개 범위: 비공개
- 객체 버전 관리: 사용 안 함
복제는 비활성화 상태로 두세요. 버킷 이름과 리전 식별자를 각각 CUSTOMER_BUCKET_NAME과 CUSTOMER_OCI_REGION으로 기록해 두세요. 프로필을 열고 테넌시를 선택한 다음 테넌시 이름을 선택하세요. 해당 OCID를 복사해 CUSTOMER_TENANCY_OCID로 사용하세요. 테넌시에서 버킷의 리전을 구독하고 있어야 합니다.
2. 버킷 태그 추가
버킷을 생성할 때 다음 태그를 추가하거나 버킷의 태그 탭을 열고 추가를 선택하세요. 네임스페이스에서 없음(자유 형식 태그) 항목을 선택하고 정확한 OpenAI 조직 ID와 프로젝트 ID를 입력하세요.
| 키 | 값 |
|---|---|
openai_organization_id |
CUSTOMER_ORG_ID |
openai_project_id |
CUSTOMER_PROJECT_ID |
접근 정책과 스토리지 등록에도 동일한 ID를 사용하세요. 각 버킷은 하나의 OpenAI 조직과 하나의 프로젝트에 연결됩니다.

3. OpenAI에 접근 권한 부여
ID 및 보안 > 정책에서 테넌시의 루트 구획을 선택하고 psp-storage-access라는 정책을 생성하세요. 수동 편집기 표시를 켠 다음 아래 정책문을 입력하세요. CUSTOMER_... 자리표시자에는 실제 버킷 이름, 리전, OpenAI 조직 ID와 프로젝트 ID를 입력하세요. OpenAI의 테넌시 및 그룹 OCID 값은 변경하지 마세요.
Define tenancy OpenAICSG as ocid1.tenancy.oc1..aaaaaaaa4kzwe5jdr4gsxft7dfnwbnp3aozhxeskabsqo7czdkbp6fkh3uha
Define group OpenAICSGProduction as ocid1.group.oc1..aaaaaaaanuot5i5kooasr6qh6qo4ohqljrrxx3javkl2tkedb7ljsluq62sa
Admit group OpenAICSGProduction of tenancy OpenAICSG to {OBJECTSTORAGE_NAMESPACE_READ} in tenancy
Admit group OpenAICSGProduction of tenancy OpenAICSG to {BUCKET_READ} in tenancy where target.bucket.name = 'CUSTOMER_BUCKET_NAME'
Admit group OpenAICSGProduction of tenancy OpenAICSG to {OBJECT_READ, OBJECT_CREATE, OBJECT_OVERWRITE} in tenancy where all {target.bucket.name = 'CUSTOMER_BUCKET_NAME', target.object.name = 'openai/CUSTOMER_ORG_ID/CUSTOMER_PROJECT_ID/*'}
Allow service objectstorage-CUSTOMER_OCI_REGION to {BUCKET_INSPECT, BUCKET_READ, OBJECT_INSPECT, OBJECT_DELETE} in tenancy where target.bucket.name = 'CUSTOMER_BUCKET_NAME'이 정책은 OpenAI가 고객의 Object Storage 네임스페이스를 조회하고, 버킷 구성을 읽고, 프로젝트 접두사 아래의 객체를 읽고 쓸 수 있도록 허용합니다. 네임스페이스를 조회하려면 버킷 조건이 없는 테넌시 수준 권한이 필요합니다. 마지막 정책문은 Oracle의 리전별 Object Storage 서비스가 만료된 객체를 삭제할 수 있도록 허용합니다. us-ashburn-1 리전에서는 서비스 이름으로 objectstorage-us-ashburn-1을 사용하세요.
정책을 저장하세요. OpenAI가 자체 자격 증명을 관리하므로 API 서명 키나 액세스 키를 생성하거나 공유할 필요가 없습니다.
4. 수명 주기 규칙 설정
버킷의 정책 탭을 여세요. 수명 주기 정책 규칙에서 규칙 생성을 선택하고 다음과 같이 설정하세요.
- 이름:
psp-retention - 대상: 객체
- 수명 주기 작업: 삭제
- 일수: 30

고급 옵션을 펼치고 상태는 사용으로 유지하세요. 객체 이름 필터에서 필터 추가를 선택하고 접두사로 포함을 선택한 다음 마지막 슬래시까지 포함해 openai/CUSTOMER_ORG_ID/CUSTOMER_PROJECT_ID/를 입력하세요.

규칙을 저장하세요. OCI에서 수명 주기 권한을 자동으로 추가할지 묻더라도 3단계에서 버킷 범위로 제한한 권한을 유지하세요. 다른 규칙이 이 객체들을 더 일찍 삭제하거나 아카이브 스토리지로 이동시키지 않는지 확인하세요. 보존 규칙으로 수명 주기 삭제 규칙을 대체할 수 없습니다.
스토리지 등록으로 이동하세요.
스토리지 등록
위의 클라우드 설정을 완료한 후 프로젝트에 적용할 수 있는 기본 데이터 보존 정책을 선택하세요. 프라이빗 안전 처리는 데이터 비보관 또는 수정된 남용 모니터링과 함께 사용할 수 있습니다. 프라이빗 안전 처리가 연결된 스토리지를 사용하는 동안에도 선택한 기본 정책은 계속 적용됩니다. 그런 다음 API 콘솔 또는 Management API를 사용해 스토리지를 등록하고 검증하세요. 두 방법 중 하나만 사용하면 됩니다.
방법 1: API 콘솔
조직 관리자로 로그인하세요. API 콘솔은 로그인한 세션을 사용하므로 이 방법에는 Admin API 키나 curl 명령어가 필요하지 않습니다.
1. 스토리지 연결 열기
조직 설정 > 데이터 제어 > 데이터 보관 메뉴를 열고 스토리지 연결을 선택하세요. 프로젝트 설정 > 데이터 보관에서도 연결할 수 있습니다.

2. 스토리지 정보 입력
AWS, Azure, GCP, OCI 중 하나를 선택한 다음 프로젝트를 선택하세요. 데이터 보존 정책에서 조직이 사용할 수 있는 정책에 따라 프라이빗 안전 처리를 적용한 데이터 비보관 또는 프라이빗 안전 처리를 적용한 수정된 남용 모니터링을 선택하세요. 프로젝트 설정에서 대화상자를 열었다면 해당 프로젝트가 이미 선택되어 있습니다. 등록된 스토리지가 표시되면 새 스토리지 연결을 선택해 저장 대상을 추가하세요.
AWS의 경우 클라우드 설정에서 확인한 버킷 ARN과 IAM 역할 ARN을 입력하세요.

Azure의 경우 테넌트 ID, 구독 ID, 리소스 그룹, 스토리지 계정 이름, 컨테이너 이름을 입력하세요. 대화상자를 아래로 스크롤해 모든 필드를 작성하세요.

GCP의 경우 버킷 이름, 워크로드 아이덴티티 프로젝트 번호, 워크로드 아이덴티티 풀 ID, 워크로드 아이덴티티 공급자 ID를 입력하세요. 대화상자를 아래로 스크롤해 모든 필드를 작성하세요.

OCI의 경우 테넌시 OCID, 리전, 버킷 이름을 입력하세요. 리전에는 us-ashburn-1과 같은 식별자를 입력하고, 버킷에는 OCID나 URL 대신 이름을 입력하세요. OpenAI가 Object Storage 네임스페이스를 자동으로 찾습니다. 대화상자를 아래로 스크롤해 모든 필드를 작성하세요.

3. 연결 및 검증
연결 및 검증을 선택하세요. API 콘솔이 선택한 기본 데이터 보존 정책을 저장하고 스토리지를 등록한 후 검증을 실행하고 스토리지와 프로젝트의 상태를 새로 고칩니다. 검증에 성공하면 선택한 기본 정책을 유지하면서 프라이빗 안전 처리를 활성화합니다.
스토리지 검증 완료가 표시되고 프로젝트에서 프라이빗 안전 처리가 활성화되었다는 확인 메시지가 나타나면 완료를 선택하세요.

등록 후 검증에 실패하면 표시된 문제를 해결하고 검증 재시도를 선택하세요. 나중에 다시 진행하려면 등록된 스토리지에서 저장 대상을 선택한 다음 스토리지 검증을 선택하세요. API 콘솔이 결과를 새로 고치지 못하면 처음부터 다시 시작하기 전에 상태 새로 고침을 선택하세요.
방법 2: Management API
이 방법에는 조직 Admin API 키를 사용하세요. 프로젝트의 기본 데이터 보존 정책을 설정하고 스토리지를 등록한 다음 4. 설정 검증에 따라 검증을 실행하세요.
1. API 설정 준비
조직 Admin API 키를 OPENAI_ADMIN_KEY에 안전하게 불러오세요.
OPENAI_API_BASE를 프로젝트에 대해 확인된 엔드포인트로 설정하세요. 글로벌은 https://api.openai.com, 미국은 https://us.api.openai.com, 유럽은 https://eu.api.openai.com을 사용합니다.
아래 자리표시자를 해당 엔드포인트와 OpenAI 조직 ID로 바꾸세요. 나머지 명령어도 같은 셸 세션에서 실행하세요.
123OPENAI_API_BASE='<OPENAI_API_BASE>'
OPENAI_ORG_ID='<OPENAI_ORG_ID>'
OPENAI_STORAGE_URL="$OPENAI_API_BASE/v1/organization/external_storage"2. 기본 보존 정책 설정
스토리지를 등록하기 전에 프로젝트에 적용할 수 있는 기본 데이터 보존 정책을 설정하세요. 데이터 비보관(ZDR)에는 zero_data_retention을, 수정된 남용 모니터링(MAM)에는 modified_abuse_monitoring을 사용하세요. 프라이빗 안전 처리를 활성화한 후에도 선택한 정책은 계속 적용됩니다.
123456curl --fail-with-body -sS -X POST \
"$OPENAI_API_BASE/v1/organization/projects/CUSTOMER_PROJECT_ID/data_retention" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $OPENAI_ORG_ID" \
-H 'Content-Type: application/json' \
--data-binary '{"retention_type":"zero_data_retention"}'수정된 남용 모니터링을 설정하려면 요청 본문에 {"retention_type":"modified_abuse_monitoring"}을 보내세요. 성공하면 응답에 object: "project.data_retention"과 선택한 type 값이 포함됩니다.
3. 등록 요청 보내기
사용하는 공급자에 해당하는 요청만 실행하세요. 모든 CUSTOMER_... 자리표시자를 실제 ID와 생성한 리소스 정보로 바꾸세요.
AWS S3
123456789101112curl --fail-with-body -sS -X POST "$OPENAI_STORAGE_URL" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $OPENAI_ORG_ID" \
-H 'Content-Type: application/json' \
--data-binary '{
"project_id": "CUSTOMER_PROJECT_ID",
"provider": {
"type": "aws",
"bucket": "CUSTOMER_BUCKET_ARN",
"role_arn": "CUSTOMER_ROLE_ARN"
}
}'Azure Blob Storage
123456789101112131415curl --fail-with-body -sS -X POST "$OPENAI_STORAGE_URL" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $OPENAI_ORG_ID" \
-H 'Content-Type: application/json' \
--data-binary '{
"project_id": "CUSTOMER_PROJECT_ID",
"provider": {
"type": "azure",
"tenant_id": "CUSTOMER_TENANT_ID",
"subscription_id": "CUSTOMER_SUBSCRIPTION_ID",
"resource_group": "CUSTOMER_RESOURCE_GROUP",
"account_name": "CUSTOMER_STORAGE_ACCOUNT",
"container": "CUSTOMER_CONTAINER_NAME"
}
}'Google Cloud Storage
1234567891011121314curl --fail-with-body -sS -X POST "$OPENAI_STORAGE_URL" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $OPENAI_ORG_ID" \
-H 'Content-Type: application/json' \
--data-binary '{
"project_id": "<CUSTOMER_PROJECT_ID>",
"provider": {
"type": "gcp",
"bucket": "<CUSTOMER_GCP_BUCKET_NAME>",
"workload_identity_project_number": "<CUSTOMER_GCP_PROJECT_NUMBER>",
"workload_identity_pool_id": "<CUSTOMER_GCP_POOL_ID>",
"workload_identity_provider_id": "<CUSTOMER_GCP_PROVIDER_ID>"
}
}'OCI Object Storage
12345678910111213curl --fail-with-body -sS -X POST "$OPENAI_STORAGE_URL" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $OPENAI_ORG_ID" \
-H 'Content-Type: application/json' \
--data-binary '{
"project_id": "CUSTOMER_PROJECT_ID",
"provider": {
"type": "oci",
"tenancy_ocid": "CUSTOMER_TENANCY_OCID",
"region": "CUSTOMER_OCI_REGION",
"bucket": "CUSTOMER_BUCKET_NAME"
}
}'응답의 id는 extstorage_로 시작하며 상태는 status: "pending"입니다. 검증에 사용할 ID를 기록해 두세요. API 콘솔에는 검증 대기 중이 표시되며 프로젝트에서 선택한 기본 데이터 보존 정책은 그대로 유지됩니다. 프라이빗 안전 처리는 검증에 성공해야 활성화됩니다.
4. 설정 검증
API로 검증하려면 EXTERNAL_STORAGE_ID를 등록 시 반환된 ID로 바꾸고 다음 명령어를 실행하세요.
12345EXTERNAL_STORAGE_ID='<EXTERNAL_STORAGE_ID>'
curl --fail-with-body -sS -X POST \
"$OPENAI_STORAGE_URL/$EXTERNAL_STORAGE_ID/validate" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $OPENAI_ORG_ID"성공하면 응답에 status: "validated"가 포함됩니다. 검증 과정에서는 구성과 접근 권한을 확인한 다음 고객 관리형 스토리지를 사용하는 프라이빗 안전 처리를 활성화합니다. 이때 선택한 기본 데이터 보존 정책은 계속 적용됩니다. API 콘솔에는 검증 완료 상태와 함께 프라이빗 안전 처리를 적용한 데이터 비보관 또는 프라이빗 안전 처리를 적용한 수정된 남용 모니터링과 같이 두 설정을 결합한 프로젝트 정책이 표시됩니다.
Management API를 사용했다면 저장된 등록 정보를 조회하세요.
1234curl --fail-with-body -sS \
"$OPENAI_STORAGE_URL/$EXTERNAL_STORAGE_ID" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $OPENAI_ORG_ID"어느 방법을 사용했든 프로젝트 설정 > 데이터 보관 메뉴를 열고 새로 고침을 선택하세요. 저장 대상, 공급자, 지역과 검증 완료 상태를 확인한 다음 선택한 기본 정책에 프라이빗 안전 처리가 표시되는지 확인하세요. 조직의 데이터 보관 표에서도 프로젝트별 스토리지와 상태를 확인할 수 있습니다.

검증 완료는 검증에 성공했다는 기록이며, 스토리지가 계속 정상 작동하고 있음을 보장하지는 않습니다. 새로 고침을 선택해도 검증은 다시 실행되지 않습니다. 지속적인 모니터링과 재검증 방법은 운영 및 문제 해결을 참고하세요.
스토리지 상태 확인
프로젝트 목록을 보려면 조직 설정 > 데이터 제어 > 데이터 보관 메뉴를, 특정 프로젝트의 스토리지 세부 정보를 보려면 프로젝트 설정 > 데이터 보관 메뉴를 여세요. 저장 대상과 지역을 확인한 다음 상태를 확인하세요. 설정 및 검증에 안내된 API로도 등록 정보를 조회할 수 있습니다.
- 검증 대기 중 (
pending): 스토리지가 등록되었지만 아직 검증을 통과하지 않았습니다. 검증에 성공할 때까지 프로젝트의 보존 정책은 변경되지 않습니다. - 검증 완료 (
validated): 스토리지가 검증을 통과했습니다. 현재 연결이 정상이라는 보장은 없습니다. - 확인 필요 (
unhealthy): 검사 중 스토리지 또는 구성 문제가 발견되었습니다. 원인을 해결한 후 다시 검증하세요.
새로 고침은 저장된 상태를 다시 불러올 뿐 연결을 테스트하지 않습니다. 런타임에서 오류가 발생해도 표시된 상태는 바뀌지 않을 수 있습니다. API 콘솔에서 스토리지 정보를 불러오지 못하면 버킷 장애로 판단하기 전에 API로 확인하세요.
스토리지 활동 모니터링
다음 정보를 각각 확인하세요.
- 스토리지 등록 정보: 프로젝트, 공급자, 지역, 검증 결과를 확인하세요.
- 클라우드 활동: 로깅을 활성화했다면 공급자의 접근 로그와 읽기 및 쓰기 오류를 확인하세요. 검증용 테스트와 실제 PSP 활동을 구분하세요.
- 안전 및 규정 준수 이벤트: Compliance API를 별도로 활성화했다면 제공되는 콘텐츠 수명 주기 이벤트를 확인하세요. 이 이벤트는 스토리지 등록 이벤트 및 클라우드 접근 로그와 구분됩니다.
어떤 요청에 대해 보관할 객체를 생성할지는 샘플링 정책에 따라 결정됩니다. 객체나 이벤트가 없다는 이유만으로 스토리지에 장애가 발생했다고 판단할 수는 없습니다.
검증용 테스트 식별
AWS, Azure, GCP, OCI에서는 검증 과정에서 구성된 저장 대상에 테스트 객체를 씁니다. 객체 이름에는 csg_validation_ 뒤에 임의의 16진수 접미사가 붙습니다. 각 객체의 본문에는 이름과 동일한 접미사를 사용한 customer-storage-gateway-validation:csg_validation_<suffix> 텍스트가 들어 있습니다. 테스트 객체에는 고객의 프롬프트나 응답이 포함되지 않습니다. OpenAI는 구성된 접근 권한으로 각 테스트 객체를 읽은 다음, 같은 객체에 대해 인증 없이 GET을 시도하여 공개 접근 가능 여부를 확인합니다. 비공개 스토리지라면 인증되지 않은 요청을 거부해야 합니다. 로깅 구성에 따라 이러한 요청이 공급자의 접근 로그에 표시될 수 있습니다.
AWS에서는 역할의 sts:ExternalId 제한도 검증합니다. OpenAI는 프로젝트의 외부 ID를 사용해 고객이 구성한 역할을 성공적으로 수임한 후 AssumeRole 호출을 두 번 테스트합니다. 한 번은 외부 ID 없이, 한 번은 의도적으로 잘못된 테스트 ID인 proj_smoketest-verifier를 사용해 호출합니다. 두 테스트 호출 모두 AccessDenied를 반환해야 합니다. 테스트에는 동일한 OpenAI 보안 주체와 구성된 역할이 사용됩니다. 테스트 ID는 다른 고객의 프로젝트를 가리키지 않습니다. AWS CloudTrail은 거부된 이러한 교차 계정 역할 수임 시도를 고객 계정에 기록하지 않습니다. 신뢰 정책은 실제 프로젝트 ID로 제한하세요. 테스트 호출이 성공하도록 테스트 ID를 허용하거나 외부 ID 조건을 제거하지 마세요.
오류 복구
1. 오류 확인
customer_managed_retention_not_enabled: 온보딩 담당자에게 조직의 접근 권한을 확인해 달라고 요청하세요.- 인증 또는 권한 오류: 필요한 외부 스토리지 권한이 있는 조직 Admin 키를 사용하고 있는지 확인하세요.
- 구성 문제: 클라우드 ID, 신뢰 정책 또는 접근 권한, 수명 주기 규칙, 승인된 네트워크 구성을 확인하세요.
401 customer_storage_not_ready: 요청한 프로젝트의 지역에 검증된 스토리지가 있는지 확인하세요.incorrect_hostname: 데이터 레지던시가 고정된 프로젝트의 구성과 일치하는 호스트 이름을 사용하세요.503 external_storage_validation_unavailable: 나중에 다시 시도하세요. 오류가 계속되면 지원팀에 문의하세요.
AWS의 프로젝트 기반 AWS 가입(신규) 방식을 사용하면 기본 리소스 제어 정책(RCP)이 OpenAI의 교차 계정 역할 수임을 차단합니다. 해당 계정을 사용하려면 필요한 경우 유료 플랜으로 업그레이드하고 고급 기능을 활성화한 후 RCP를 업데이트해 OpenAI의 sts:AssumeRole 접근을 허용하세요.
2. 재검증
구성을 수정한 후 프로젝트의 스토리지 연결을 열고 조직 Admin API 키로 검증 명령어를 실행하세요. 등록 정보를 조회하거나 새로 고침을 선택해 검증 완료 상태인지 확인하세요. 새로 고침만으로는 검증이 실행되지 않습니다.
스토리지 연결 해제
스토리지 연결을 해제하려면 프로젝트 설정 > 데이터 보관 메뉴를 여세요. 외부 스토리지에서 연결 항목 옆의 휴지통 아이콘을 선택한 다음 스토리지 연결 해제를 선택해 확인하세요.
Google Cloud Storage 버킷을 삭제하기 전에 해당 버킷을 사용하는 모든 OpenAI 프로젝트에서 버킷 연결을 해제하세요. 버킷을 삭제하면 다른 Google Cloud 프로젝트에서 같은 이름으로 버킷을 생성할 수 있습니다.
프로젝트에서 PSP를 적용한 ZDR을 사용 중이라면 마지막 스토리지 연결을 해제할 때 보존 정책이 조직의 기본값으로 자동 재설정됩니다. 다른 연결이 남아 있으면 정책은 변경되지 않습니다. 정책이 변경되면 PSP를 적용한 ZDR이 필요한 모델을 더 이상 사용하지 못할 수 있습니다.
스토리지 연결을 해제해도 고객의 클라우드 스토리지나 그 안의 콘텐츠는 삭제되지 않습니다. 기존 기록에 대한 보관 요건은 계속 준수하세요. 새 프로젝트와 데이터 레지던시 위치마다 설정과 검증을 완료하세요.
고객이 지속적으로 준수해야 할 사항
PSP를 적용한 ZDR을 사용하는 고객은 다음 요건을 준수해야 합니다.
- PSP 스토리지를 등록하고 검증하세요. PSP가 활성화된 프로젝트와 데이터 레지던시 위치마다 OpenAI의 관리 API를 통해 스토리지 버킷을 등록하고 검증하세요. OpenAI가 공개한 지침에 따라 PSP 서비스의 버킷 접근 권한을 구성하세요.
- 암호화된 기록을 최소 30일간 보관하세요. PSP 기록이 그보다 일찍 삭제되지 않도록 스토리지 수명 주기 규칙을 구성하세요.
- 스토리지 및 키 접근 권한을 유지하세요. 리전별 스토리지, 서비스 권한, 고객 관리형 키 사용 권한이 올바르게 구성된 상태를 유지하세요.
- 구성 문제를 해결하세요. OpenAI로부터 알림을 받으면 스토리지 구성 문제를 수정하세요.
- 안전 관련 우려 사항에 대한 통지에 대응하세요. OpenAI와 협력하여 해당 사안을 조사하고 해결하세요.
참고 자료
- 프라이빗 안전 처리 기술 백서 - 전체 아키텍처, 보안 제어 및 적용 범위.
- API 데이터 제어 - ZDR 자격 요건, 엔드포인트별 데이터 보관 및 예외.
- 데이터 레지던시 - 지원되는 리전 및 데이터 처리 범위.
지원팀에 문의
문제 해결 절차를 따른 후에도 스토리지 또는 검증 문제가 계속되면 OpenAI 지원팀에 문의하세요.