LLM API 데이터 보존과 ZDR: 소스 코드 전송 전 확인할 조건
공개 자료는 승인된 보존 기간 안에서 처리할 수 있습니다. 비공개 소스 코드와 고객 자료는 조직의 요구에 맞는 ZDR 범위, 실제 요청 경로, 자체 로그를 확인한 뒤 전송해야 합니다.
목차

LLM API를 고를 때는 어떤 데이터를 얼마 동안, 누구의 저장소에 남겨도 되는지부터 정해야 합니다. 공개 문서나 합성 데이터라면 목적과 기간을 승인한 일반 보존 경로를 쓸 수 있습니다. 공급자에게 원문을 보존시키면 안 되는 비공개 코드·고객 자료라면, 실제 계약과 조직 설정에서 ZDR 적용을 확인하고 해당 모델·엔드포인트·기능·중계 서비스까지 범위가 이어지는지 확인해야 합니다.
ZDR은 Zero Data Retention, 제로 데이터 보존의 약자입니다. 통상 지정된 입력·출력을 응답 후 영구 저장하지 않는 통제를 가리키지만, 제품마다 대상과 예외가 다릅니다. 학습에 쓰지 않는다는 약속, store=false, 암호화, 특정 지역에서 처리한다는 설명만으로 전체 요청 경로의 ZDR을 확인할 수는 없습니다.
아래에서는 2026년 10월 6일 확인한 공식 문서의 조건을 바탕으로, 채울 수 있는 승인 기록과 변경을 거부하는 로컬 검사 예제를 제공합니다. 예제의 승인 상태는 가상 값이며 실제 계정 활성화, 공급자의 삭제나 법적 준수를 검증한 결과가 아닙니다.
일반 보존을 허용할지, 검증된 ZDR을 요구할지
먼저 전송할 데이터를 줄입니다. 공개 코드라도 설정 파일에 비밀 키가 섞였다면 공개 데이터로 취급할 수 없습니다. 고객 이름을 지워도 주문 내역·장애 로그·파일 경로를 조합해 식별할 수 있다면 별도 검토가 필요합니다.
| 전송할 자료와 사내 요구 | 선택할 처리 방식 | 승인에 필요한 내용 |
|---|---|---|
| 공개 API 문서, 공개 코드, 개인정보 없는 합성 예제 | 기간을 제한한 일반 보존 | 학습 사용 여부, 보존 목적·최대 기간·예외, 자체 로그의 보존과 삭제 책임 |
| 비공개 자료이지만 조직이 특정 기간의 보존을 명시적으로 허용 | 승인된 제한 보존 | 허용한 자료 범위와 보존 위치, 계약, 접근 권한, 기간을 넘겼을 때의 처리 |
| 공급자와 중계업체의 원문 보존을 금지 | 실제 적용 범위를 확인한 ZDR | 정확한 조직·프로젝트·모델·기능, 공급자와 중계업체의 적용 증거, 고객 저장 허용 여부 |
| 고객 저장소를 포함해 어디에도 원문을 남기면 안 됨 | 전체 경로에서 원문 저장 금지 | 안전 기록용 고객 버킷, 로그, 큐, 파일, 백업까지 원문이 남지 않는 구성 |
| 비밀 키, 인증 정보, 전송 금지 자료 | 전송 중단 후 제거 또는 로컬 처리 | ZDR 여부보다 먼저 전송 자체의 허용 여부 확인 |
“민감하면 무조건 ZDR”이라는 문구보다 이 구분이 실무에 유용합니다. 조직이 허용한 7일 보존과 허용하지 않은 30일 보존은 다르고, 공급자 저장 금지와 고객이 통제하는 저장까지 금지하는 정책도 다릅니다. 아래 예제의 기간은 조직이 정할 값입니다. 업계 공통 승인 기준으로 제시하는 숫자가 아닙니다.

예를 들어 공개 SDK 설명을 요약하는 팀은 30일 이내의 공급자 보존을 승인할 수 있습니다. 반면 미공개 취약점의 재현 코드를 분석하는 팀은 공급자 보존을 금지하고 외부 도구도 끌 수 있습니다. 후자의 경로가 준비되지 않았다면 모델을 바꾸거나 필요한 코드만 합성 예제로 대체합니다. 사용 가능하게 만들기 위해 보존 요구를 조용히 낮추면 안 됩니다.
요청 경로와 저장 위치를 함께 적습니다
승인 단위는 회사 이름보다 좁아야 합니다. 다음 항목을 실제 배포 설정과 대조할 수 있을 정도로 적습니다.
애플리케이션 → 자체 로그·재시도 큐 → 게이트웨이 → 처리 사업자 → 조직·프로젝트·지역 → 모델·엔드포인트 → 활성 기능·외부 도구
| 확인 대상 | 기록할 값 | 값의 근거 |
|---|---|---|
| 계약과 운영 주체 | 계약 ID, 처리 사업자, 적용 조직, 승인 책임자 | 체결한 계약·승인 기록. 공개 정책만으로 본 계정의 승인을 대체하지 않음 |
| 실제 실행 설정 | 조직·프로젝트·리소스, 지역, 모델 버전, 엔드포인트 | 배포 설정과 접근 통제된 관리자 증거의 참조 ID |
| 요청 옵션과 기능 | store, background, 파일·검색·캐시·에이전트, 외부 도구 | 요청 생성 코드와 기능별 정책 |
| 중계와 대체 경로 | 게이트웨이, 실제 상위 공급자, 장애 시 전환 후보 | 라우팅 설정과 후보별 적용 증거 |
| 원문 저장 | 안전 로그, 대화 상태, 고객 버킷, 자체 로그·큐·백업 | 저장 목적, 최대 기간, 삭제·접근 책임자 |
| 원문 외 산출물 | 사용량, 해시, 스키마, 캐시 상태, 진단 정보 | 실제 필드와 수명. 원문이나 민감한 이름을 포함하는지 별도 판단 |
계약·관리자 증거·자체 로그 검사는 서로 다른 질문에 답합니다. 공식 문서는 기능이 대상인지 설명하고, 계약은 조직이 무엇을 승인받았는지 설명합니다. 배포 설정은 실제 요청이 그 조직과 기능을 사용하는지 보여 줍니다. 자체 로그 검사로 공급자 내부 삭제까지 입증할 수는 없습니다.
공식 문서에서 특히 달라지는 조건
OpenAI: 고객 안전 버킷의 30일 저장까지 정책과 맞춥니다
OpenAI 데이터 통제 문서에 따르면 API 데이터는 명시적 동의 없이 학습에 사용되지 않지만, 기본 악용 방지 로그는 원문을 포함해 최대 30일 보존될 수 있고 법적·안전상 예외가 있습니다. MAM과 ZDR에는 별도 승인이 필요하며 프로젝트가 조직 설정을 어떻게 상속하는지도 확인해야 합니다. ZDR의 Responses·Chat Completions에서 store는 false로 처리되지만, 비대상 상태 저장 기능까지 허용되는 것은 아닙니다. Responses의 background polling은 약 10분간 상태를 저장하므로 엄격한 ZDR 요구와 맞지 않습니다.
현재 ZDR with Private Safety Processing 문서는 선택한 상호작용의 암호화된 안전 기록을 고객이 통제하는 클라우드 저장소에 30일 두는 구조를 설명합니다. 자동 안전 처리 결과도 같은 수명으로 저장하며, OpenAI는 내용 사본 대신 운영상 인덱스·참조를 유지합니다. 자동 처리는 보호된 실행 환경에서 이뤄지지만, 암호화된 고객 기록이 존재한다는 사실은 바뀌지 않습니다. 키 접근을 철회해도 이미 저장된 기록이 삭제되지는 않습니다.
따라서 공급자 원문 보존은 금지하되 고객 통제 저장은 허용하는 정책과, 모든 위치의 원문 저장을 금지하는 정책은 이 구조를 다르게 판단할 수 있습니다. OpenAI 관리 저장소에 암호화하여 보관하는 Private Retention with PSP와도 구분해야 합니다. 승인 기록에는 어느 방식을 쓰는지, 고객 버킷의 위치·30일 수명·접근 책임을 적습니다. ZDR이라는 이름만 적고 고객 저장 항목을 0으로 채우지 않습니다.
Claude: 호출 성공이 ZDR 적용을 뜻하지 않습니다
Claude API 보존 문서는 ZDR을 조직별로 적용하며 모델과 기능의 적격성을 따로 설명합니다. 현재 Fable 5·5.1 및 Mythos 5·5.1은 별도 허가 없이 ZDR 대상이라고 볼 수 없습니다. Files, batch, 코드 실행, Managed Agents, MCP connector처럼 비대상인 기능은 ZDR 조직에서도 호출 자체가 성공할 수 있습니다. 애플리케이션이 허용 기능을 검사해야 하는 이유입니다.
적격 prompt caching의 메모리상 KV·해시, structured outputs의 조건부 스키마 보존은 원문 대화 저장과 구별합니다. 스키마는 마지막 사용 후 최대 24시간 보존될 수 있으므로 이름·enum·const·pattern에 고객 정보나 내부 식별자를 넣지 않습니다. 기술 산출물이라는 분류가 민감한 내용까지 허용하는 것은 아닙니다. 법적·안전상 예외도 계약 검토에 포함합니다.
상용 서비스 보존 안내는 API 입력·출력의 최대 삭제 창을 30일 이내로 설명하며 기능·계약·안전상 예외를 둡니다. 기능 문서의 저장이 필요 없는 대화 설명과는 서술 단위가 다릅니다. 둘을 합쳐 “모든 Claude 요청은 0일” 또는 “항상 30일 저장”이라고 적지 말고 실제 모델·기능·계약의 조건을 기록합니다.
Gemini Developer와 Google Cloud는 서로 다른 경로입니다
Gemini Developer API의 현재 ZDR 안내는 보장된 ZDR이나 기업 DPA가 필요하면 Vertex AI를 사용하도록 안내합니다. 유료 서비스의 학습 제외를 Developer 프로젝트의 보장된 ZDR로 바꾸어 읽으면 안 됩니다. Developer의 Google Search·Maps grounding에는 끌 수 없는 30일 보존이 있고, Interactions의 기본 store=true, 파일·명시적 캐시·세션 재개도 별도로 확인해야 합니다.
Developer 로그·데이터셋 문서는 제품 로그의 기본값을 Interactions와 GenerateContent에서 다르게 정합니다. 제품 로그의 기본 보존은 55일이며 7·14·28·55일을 선택할 수 있습니다. 데이터셋에 저장한 로그는 자동 만료되지 않습니다. 이 기간을 모든 요청의 악용 방지 보존 기간이라고 쓰지 않습니다. 프로젝트 설정과 요청별 재정의, 데이터셋 저장·공유 여부가 각각 검토 대상입니다.
반면 Google Cloud의 ZDR 문서는 해당 Cloud 경로의 Search grounding 파생 쿼리·문맥에 최대 3일 보존을 설명합니다. Developer의 30일과 같은 조건이 아닙니다. Cloud에서도 Maps의 30일, Interactions 상태, Deep Research의 7일 상태와 Advanced AI 모델·기능의 추가 안전 조건을 확인해야 합니다. Cloud로 옮긴다는 결정만으로 모든 기능을 ZDR로 승인할 수 없습니다.
Bedrock: 지역의 유효 모드와 모델의 허용 모드를 대조합니다
Bedrock 보존 문서는 지역별 보존 설정과 모델별 허용 모드를 설명합니다. 적용되는 모드는 mantle 프로젝트 설정, 지역의 계정 설정, 모델 기본값 중 상속이 아닌 첫 설정을 따릅니다. 일반 runtime 경로에 프로젝트 개념이 있다고 가정하지 않습니다. 다른 지역으로 추론을 보내면 보존 위치도 확인해야 합니다.
none은 영구 저장과 모델 공급자 공유를 하지 않는 모드입니다. 이 모드에서는 Responses의 store=true가 거부되고 background도 사용할 수 없습니다. 그러나 모델이 allowed_modes에 none을 허용하지 않으면 그 조합으로 ZDR 경로를 구성할 수 없습니다. 승인된 다른 모델을 선택하거나 명시적 예외 승인을 확보하거나 전송을 멈춥니다. aws_review로 바꾸어 호출을 성공시키는 것은 ZDR 문제의 해결이 아닙니다.
Bedrock 데이터 보호의 모델 공급자 접근 제한과 AWS 자체 보존도 구별합니다. 악용 탐지 문서의 법적·안전상 예외와 고객 계정의 invocation 로그까지 확인해야 전체 경로를 판단할 수 있습니다.
Azure와 게이트웨이: 누가 처리하는지부터 확인합니다
Azure가 판매하는 Foundry 모델의 데이터 문서는 Azure 호스팅 경로를 설명합니다. 같은 Foundry 이름이라도 Anthropic이 처리하는 Claude offering에 이 조건을 그대로 적용할 수 없습니다. 판매·처리 주체를 확인하세요. 승인된 악용 모니터링 변경에서 ContentLogging=false를 확인할 수 있지만, 그 필드가 없다는 이유로 false라고 해석하면 안 됩니다. 상태 저장 기능과 고객 Azure 리소스·진단 로그는 별도입니다.
OpenRouter ZDR 설정은 적격 추론 엔드포인트로 라우팅하는 통제입니다. 계정 등에서 강제한 ZDR을 요청의 false로 해제할 수 없지만, 플러그인·외부 도구까지 자동으로 같은 조건을 받는 것은 아닙니다. BYOK·Private Deployment의 고객 선언을 독립적으로 검증한 인증으로 보아서도 안 됩니다. 중계업체 자체 로그, 실제 상위 공급자, 장애 시 대체 엔드포인트를 모두 승인 기록에 포함합니다. 이 기준은 laozhang.ai를 포함한 모든 중계업체에 동일하게 적용합니다.
안내: laozhang.ai는 이 블로그 운영팀의 자사 서비스입니다. 그 가격은 독립적인 비교가 아니라 자사 제시 가격입니다.
승인 기록은 미확인 상태에서 시작합니다
다음 JSON을 evidence.json으로 저장해 팀의 조건과 실제 배포 값으로 바꿀 수 있습니다. 저장 범위가 빠진 채 승인하지 않도록 공급자·기능·중계·자체 시스템·기술 산출물의 검토를 모두 요구합니다. 고객 버킷이나 외부 도구가 있으면 해당 검토 항목 아래 참조 기록에서 저장 위치와 수명을 나누어 관리합니다.
route는 별칭만 적는 칸이 아닙니다. 모델 ID·버전, 기능 옵션과 실제 최종 엔드포인트까지 배포와 비교할 값입니다. logging_profile이 가리키는 설정도 변경 시 다른 버전으로 갱신해야 합니다. 승인한 기능 안에서 store나 세션 재개 옵션이 바뀌어도 요청 내용이 달라졌다고 판단할 수 있어야 합니다.
{
"workload": "source-review",
"data_class": "confidential",
"policy": {
"mode": "verified_zdr",
"provider_content_max_days": 0,
"customer_content_max_days": 0,
"training_allowed": false
},
"route": {
"processor": "REPLACE_PROCESSOR",
"contract_scope": "REPLACE_CONTRACT_SCOPE",
"organization": "REPLACE_ORG",
"project": "REPLACE_PROJECT",
"region": "REPLACE_REGION",
"endpoint": "REPLACE_ENDPOINT",
"model": "REPLACE_MODEL_VERSION",
"features": ["text-only"],
"request_options": {"store": false, "background": false},
"gateway": "none",
"fallbacks": [],
"logging_profile": "REPLACE_LOGGING_PROFILE_VERSION"
},
"evidence": {
"status": "unknown",
"contract_ref": "REPLACE_CONTRACT_REF",
"configuration_ref": "REPLACE_CONFIGURATION_REF",
"owner": "REPLACE_OWNER",
"valid_until": "2026-11-01",
"zdr_eligible": false,
"training": "unknown",
"scope_reviews": {
"provider": "unknown",
"features": "unknown",
"gateway_tools": "unknown",
"customer_systems": "unknown",
"technical_artifacts": "unknown"
},
"provider_content_days": null,
"customer_content_days": null,
"safety_legal_exceptions_reviewed": false,
"own_logs_test_ref": "REPLACE_LOCAL_TEST_REF",
"own_logs_test_passed": false
}
}첫 파일은 의도적으로 승인을 받지 못합니다. 실제 담당자가 근거를 확인한 뒤에만 approved, reviewed, 일수와 참조 ID를 채웁니다. 공급자 보존을 허용한다면 mode를 bounded로 정하고 최대 기간을 적습니다. 고객 저장이 허용된다면 그 최대 기간도 따로 적습니다. 여러 저장소가 있으면 각 저장소가 조건을 충족하는지 확인한 뒤 해당 소유 범위의 최대 보존 기간을 넣습니다. 무기한이거나 모르면 숫자로 축소하지 않고 null을 유지합니다.
예를 들어 고객 통제 안전 버킷의 30일 저장을 허용한 ZDR 정책이라면 공급자 최대 일수는 0, 고객 최대 일수는 30이 될 수 있습니다. 이는 고객 저장을 포함한 무보존 승인이 아닙니다. 원문·암호화 기록·파생 메타데이터의 분류와 제품 예외는 참조 기록에 남겨야 하며, reviewed라는 문자열로 판단을 대신할 수 없습니다.
로컬 검사로 모델·기능·로그 변경을 거부합니다

아래 전체 코드를 retention_gate.py에 저장합니다. Python 표준 라이브러리만 사용하며 네트워크·SDK·API 키 없이 JSON과 날짜만 검사합니다. 누락된 칸, 미확인 증거, 경로 변경과 정책을 초과한 기간을 거부합니다. verified_zdr에서는 별도 적격성 확인이 필요합니다.
import copy
import json
import sys
from datetime import date
from pathlib import Path
ROUTE_KEYS = {
"processor", "contract_scope", "organization", "project", "region",
"endpoint", "model", "features", "request_options", "gateway",
"fallbacks", "logging_profile"
}
REVIEWS = {
"provider", "features", "gateway_tools", "customer_systems",
"technical_artifacts"
}
if not __debug__:
sys.exit("BLOCK: run Python without optimization flags")
def known(value):
if value is None:
return False
if isinstance(value, str):
return bool(value.strip()) and not value.startswith("REPLACE")
if isinstance(value, dict):
return all(known(v) for v in value.values())
if isinstance(value, list):
return all(known(v) for v in value)
return True
def gate(card, deployed, today):
try:
policy, route, evidence = (
card["policy"], card["route"], card["evidence"]
)
assert card["data_class"] in {"public", "internal", "confidential"}
assert policy["mode"] in {"bounded", "verified_zdr"}
assert isinstance(policy["training_allowed"], bool)
assert set(route) == ROUTE_KEYS and known(route)
assert isinstance(route["features"], list) and route["features"]
assert isinstance(route["request_options"], dict)
assert isinstance(route["fallbacks"], list)
assert route == deployed, "route changed"
assert evidence["status"] == "approved"
for key in ("contract_ref", "configuration_ref", "owner",
"own_logs_test_ref"):
assert known(evidence[key])
assert date.fromisoformat(evidence["valid_until"]) >= today
reviews = evidence["scope_reviews"]
assert set(reviews) == REVIEWS
assert all(v == "reviewed" for v in reviews.values())
assert evidence["safety_legal_exceptions_reviewed"] is True
assert evidence["own_logs_test_passed"] is True
assert evidence["training"] in {"yes", "no"}
assert policy["training_allowed"] or evidence["training"] == "no"
for side in ("provider", "customer"):
actual = evidence[f"{side}_content_days"]
maximum = policy[f"{side}_content_max_days"]
assert type(actual) is int and type(maximum) is int
assert 0 <= actual <= maximum
if policy["mode"] == "verified_zdr":
assert policy["provider_content_max_days"] == 0
assert evidence["zdr_eligible"] is True
return True, "ALLOW: local checks passed"
except (KeyError, TypeError, ValueError, AssertionError) as error:
return False, "BLOCK: " + (str(error) or "unverified condition")
def self_test():
route = {k: "fictional-value" for k in ROUTE_KEYS}
route.update(features=["text-only"], request_options={"store": False},
fallbacks=[], gateway="none")
card = {
"data_class": "confidential", "route": route,
"policy": {"mode": "verified_zdr", "training_allowed": False,
"provider_content_max_days": 0,
"customer_content_max_days": 0},
"evidence": {
"status": "approved", "contract_ref": "FICTION-1",
"configuration_ref": "FICTION-2", "owner": "fictional-team",
"own_logs_test_ref": "FICTION-3", "own_logs_test_passed": True,
"valid_until": "2026-11-01", "training": "no",
"scope_reviews": {k: "reviewed" for k in REVIEWS},
"safety_legal_exceptions_reviewed": True, "zdr_eligible": True,
"provider_content_days": 0, "customer_content_days": 0
}
}
today = date(2026, 10, 6)
assert gate(card, route, today)[0]
changed = copy.deepcopy(route)
changed["features"].append("files")
assert not gate(card, changed, today)[0]
expired = copy.deepcopy(card)
expired["evidence"]["valid_until"] = "2026-10-05"
assert not gate(expired, route, today)[0]
bounded = copy.deepcopy(card)
bounded["policy"].update(mode="bounded", provider_content_max_days=30)
bounded["evidence"].update(zdr_eligible=False, provider_content_days=30)
assert gate(bounded, route, today)[0]
customer_storage = copy.deepcopy(card)
customer_storage["evidence"]["customer_content_days"] = 30
assert not gate(customer_storage, route, today)[0]
customer_storage["policy"]["customer_content_max_days"] = 30
assert gate(customer_storage, route, today)[0]
unknown = copy.deepcopy(card)
unknown["evidence"]["scope_reviews"]["features"] = "unknown"
assert not gate(unknown, route, today)[0]
print("PASS: fictional approval and refusal cases")
if __name__ == "__main__":
if sys.argv[1:] == ["--self-test"]:
self_test()
else:
try:
card = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
deployed = json.loads(Path(sys.argv[2]).read_text(encoding="utf-8"))
ok, message = gate(card, deployed, date.fromisoformat(sys.argv[3]))
except (OSError, ValueError, IndexError, TypeError) as error:
ok, message = False, "BLOCK: invalid input: " + str(error)
print(message)
sys.exit(0 if ok else 1)먼저 python3 retention_gate.py --self-test를 실행하면 가상 승인·거부 사례를 확인할 수 있습니다. 이 글의 코드는 그 합성 사례로 로컬 실행을 확인했습니다. 실제 공급자에 요청한 테스트는 아닙니다. 검사에는 Python의 assert를 사용하므로 python3 -O처럼 검사를 제거하는 최적화 옵션으로 실행하면 시작 단계에서 거부합니다.
팀이 기록을 채운 뒤에는 실제 배포 설정에서 route와 같은 구조의 deployment.json을 추출하고 다음처럼 실행합니다.
python3 retention_gate.py evidence.json deployment.json 2026-10-06날짜 인수에는 배포 당일 날짜를 넣습니다. deployment.json을 승인 기록에서 복사해서 만들면 실제 변경을 감지할 수 없습니다. CI에서는 요청 생성에 쓰는 설정을 읽어 이 파일을 만들고, 종료 코드가 0일 때만 다음 단계로 진행합니다. 기능 목록은 순서까지 비교하므로 추출 과정에서도 일관되게 정렬합니다. 승인 기록은 검토자가 변경하도록 보호해야 합니다.
| 가상 변경 | 로컬 검사 결과 | 실제 팀의 다음 행동 |
|---|---|---|
| 승인된 경로·0일 조건을 그대로 사용 | ALLOW | 실제 증거가 유효한지 전제한 설정 일치 |
| Files 기능을 새로 추가 | BLOCK | 기능의 저장 조건을 확인하고 새 경로 승인 |
| 승인 기한 만료 | BLOCK | 해당 계약·설정·기능 조건 재확인 |
| 30일을 허용한 일반 보존에 실제 최대 30일 | ALLOW | 그 데이터 등급과 목적에 한정하여 사용 |
| 고객 저장 금지인데 고객 버킷에 30일 보존 | BLOCK | 고객 저장을 제거하거나 정책 담당자의 별도 결정 |
| 고객 통제 저장 30일을 명시적으로 허용 | ALLOW | 공급자 ZDR 및 고객 저장 조건을 각각 유지 |
이 검사는 기록의 일관성과 변경을 잡습니다. 공급자 정책을 자동으로 읽거나 거짓 승인 값을 찾아내지는 못합니다. 제품의 예외와 원문 외 산출물은 사람의 검토와 참조 증거가 필요합니다. 특히 Bedrock의 aws_review 변경이나 Claude의 새 기능이 실제 요청 코드에서 이 추출 파일을 우회하지 못하도록, 같은 허용 목록을 요청 직전에도 적용해야 합니다.
자체 로그는 원문 없이도 운영할 수 있습니다
운영에 필요한 것은 보통 요청 ID, 시간, 모델, 토큰 수, 상태, 지연 시간입니다. 프롬프트·응답 본문, 고객 파일 이름과 도구 인수가 자동으로 trace나 오류 보고에 들어가지 않게 허용 필드를 정합니다. 재시도 큐의 본문, 실패 큐, 지원 티켓, 백업도 저장소 목록에 포함합니다. 원문을 메타데이터 칸에 옮겨 적으면 분류가 달라지는 것이 아닙니다.
확인은 합성 표시 문자열로 진행할 수 있습니다. 예컨대 가상의 요청·응답에 RETENTION_CHECK_KO_001을 넣고 로컬 로그 처리기를 통과시킵니다. 생성한 로그·오류 기록·큐 항목에서 표시 문자열이 남는지 확인하고, 본문 기록을 끈 경우와 실수로 켠 경우를 모두 검사합니다. 원문을 보관하도록 승인한 작업이라면 만료 전후, 복제·백업·내보내기의 처리도 확인 대상입니다.
실제 관측 시스템에서 같은 검사를 할 때는 담당자가 허용한 비민감 테스트 범위로 진행해야 합니다. 검색 결과가 없다는 사실은 검사한 자체 저장소에 대한 관찰이며, 공급자 내부 삭제 증명이 아닙니다. 승인 기록의 own_logs_test_ref에는 검사한 저장소, 설정 버전, 확인 날짜와 결과를 남깁니다. 공식 기능 문서의 조건부 캐시·스키마 보존과 자체 원문 로그를 같은 칸에 넣지 않습니다.
자주 묻는 질문
ZDR이면 메모리와 모든 메타데이터도 남지 않나요?
그렇지 않습니다. 제품이 정의한 원문 보존 범위와 메모리 캐시·사용량·해시·스키마는 구별해야 합니다. 예를 들어 Claude의 적격 캐시·스키마 조건과 Gemini의 암묵적 메모리 캐시는 ZDR 설명 안에서도 별도로 다뤄집니다. 조직이 메모리 사용이나 파생 정보까지 금지한다면 그 요구를 추가로 확인해야 합니다.
store=false만 넣으면 비공개 코드를 보내도 되나요?
아닙니다. 해당 옵션은 주로 대화·응답 상태를 제어하며, 공급자 악용 방지 통제나 자체 로그를 모두 끄는 설정이 아닙니다. OpenAI 데이터 통제의 승인 범위와 실제 조직·프로젝트·기능을 함께 확인하세요. 전송할 코드에 비밀 키나 금지된 자료가 있는지도 먼저 확인해야 합니다.
OpenAI ZDR with PSP에서 고객 저장 30일은 ZDR 위반인가요?
공급자의 제품 명칭만으로 사내 정책 위반 여부를 판단할 수는 없습니다. 공식 PSP 구조는 선택한 암호화 안전 기록을 고객 저장소에 30일 보관합니다. 고객 저장을 허용하는 정책인지, 암호화된 기록을 포함해 모든 원문 저장을 금지하는 정책인지에 따라 결론이 달라집니다. 이를 OpenAI 관리 저장소의 Private Retention으로 기록하면 저장 책임이 잘못됩니다.
Gemini Search grounding은 3일인가요, 30일인가요?
Gemini Developer API의 Search grounding은 30일입니다. Google Cloud의 해당 ZDR 문서가 설명하는 Search grounding 파생 쿼리·문맥은 최대 3일입니다. 서로 다른 경로와 저장 대상이므로 모델 이름이 같아도 적용 기간을 바꿔 쓰면 안 됩니다.
승인받은 ZDR 계정에서 요청이 성공하면 충분한가요?
충분하지 않습니다. Claude의 비대상 기능은 ZDR 조직에서도 호출될 수 있습니다. 반대로 Bedrock에서 모델이 none을 허용하지 않아 호출이 막히면, aws_review로 완화하기보다 승인 가능한 모델·구성을 선택해야 합니다. 성공 여부와 보존 조건 충족 여부는 따로 검사합니다.
승인된 처리 경로를 확보한 다음에는 같은 모델의 구매 경로별 비용 비교로 비용을 계산할 수 있습니다. 저렴한 후보라도 이번 자료의 보존 조건을 통과한 경로 안에서만 비교하세요.
참고 자료12
이 글이 링크한 외부 페이지를 본문에 나온 순서대로 정리했습니다. 마지막 업데이트: 2026년 10월 6일.
참고 자료12
이 글이 링크한 외부 페이지를 본문에 나온 순서대로 정리했습니다. 마지막 업데이트: 2026년 10월 6일.
- 1.OpenAI 데이터 통제 문서developers.openai.com/api/docs/guides/your-data
- 2.ZDR with Private Safety Processing 문서developers.openai.com/api/docs/guides/private-safety-processing
- 3.Claude API 보존 문서platform.claude.com/docs/en/manage-claude/api-and-data-retention
- 4.상용 서비스 보존 안내privacy.claude.com/en/articles/7996866-how-long-do-you-store-my-organization-s-data
- 5.Gemini Developer API의 현재 ZDR 안내ai.google.dev/gemini-api/docs/zdr
- 6.Developer 로그·데이터셋 문서ai.google.dev/gemini-api/docs/logs-datasets
- 7.Google Cloud의 ZDR 문서docs.cloud.google.com/gemini-enterprise-agent-platform/resources/zero-data-retention
- 8.Bedrock 보존 문서docs.aws.amazon.com/bedrock/latest/userguide/data-retention.html
- 9.Bedrock 데이터 보호docs.aws.amazon.com/bedrock/latest/userguide/data-protection.html
- 10.악용 탐지 문서docs.aws.amazon.com/bedrock/latest/userguide/abuse-detection.html
- 11.Azure가 판매하는 Foundry 모델의 데이터 문서learn.microsoft.com/en-us/azure/foundry/responsible-ai/openai/data-privacy
- 12.OpenRouter ZDR 설정openrouter.ai/docs/guides/features/zdr





