Security posture 결과 참조
조직의 현재 Security posture 결과를 반환하는 Compliance API 엔드포인트의 요청, 응답 필드, 각 결과 사유의 의미, 오류를 확인합니다.
이 엔드포인트는 요청 시점에 평가된 조직의 보안 통제 대부분에 대해 각각 하나의 항목을 반환하며, 각 통제에 대해 응답에 나타나는 Security posture 진술이 함께 포함됩니다. 해당 조직을 포함하고 read:compliance_org_data 또는 read:org_audit 범위를 가진 Compliance Access Key가 필요합니다. 읽을 수 있는 조직은 Security posture 사용 가능 여부에서 확인하세요.
요청
/v1/compliance/organizations/{organization_id}/security_posture로 GET 요청을 보내세요. 각 호출은 하나의 조직을 읽으며, 응답은 페이지로 나뉘지 않습니다.
curl --fail-with-body -sS \
"https://api.anthropic.com/v1/compliance/organizations/91012d09-e48b-438e-a489-1bebfd8fa6f9/security_posture" \
-H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \
-H "anthropic-version: 2026-10-21"| 항목 | 규칙 |
|---|---|
organization_id | 조직 나열에서 가져온 연결된 조직의 uuid입니다. 그 밖의 값은 어떤 값이든 404를 반환합니다. |
| 키 | 상위 조직용 키는 연결된 조직 중 어느 조직이든 지정할 수 있으며, 단일 조직용 키는 해당 조직만 지정할 수 있습니다. |
anthropic-version | 필수입니다. 이 헤더가 없는 요청은 400을 반환합니다. |
| 쿼리 매개변수 | 없습니다. 쿼리 매개변수가 하나라도 포함된 요청은 400을 반환합니다. |
응답
다음 축약 예시는 응답에 포함될 수 있는 통제 중 네 가지를 보여 줍니다. read:compliance_org_data와 read:compliance_user_data를 보유한 키에 대한 응답입니다.
{
"type": "security_posture",
"organization_id": "91012d09-e48b-438e-a489-1bebfd8fa6f9",
"evaluated_at": "2027-02-09T09:00:02.417305Z",
"comments_status": "not_enabled",
"controls": [
{
"id": "sso_enabled",
"display_name": "Single sign-on (SSO)",
"section": "identity_access",
"setting_name": "sso_enabled",
"status": "passed",
"rating": "passed",
"current_value": "On",
"desired_state": "On",
"attestation": null
},
{
"id": "directory_sync_enabled",
"display_name": "Directory sync (SCIM)",
"section": "identity_access",
"setting_name": "directory_sync_enabled",
"status": "failed_check_accepted_risk",
"rating": "passed",
"current_value": "Off",
"desired_state": "On",
"attestation": {
"state": "in_force",
"attested_at": "2026-10-20T15:04:00.220114Z",
"comment": null,
"attested_by": {
"type": "user_actor",
"user_id": "user_01WxYzAbCdEfGhJkMnPqRsTu"
}
}
},
{
"id": "allowed_invite_domains",
"display_name": "Allowed email domains",
"section": "identity_access",
"setting_name": "allowed_invite_domains",
"status": "descriptive",
"rating": "descriptive",
"current_value": "example.com",
"desired_state": null,
"attestation": null
},
{
"id": "oauth_conditional_access",
"display_name": "OAuth conditional access on connected SaaS",
"section": "connectors_integrations",
"setting_name": null,
"status": "not_attested",
"rating": "not_attested",
"current_value": null,
"desired_state": "Completed",
"attestation": {
"state": "review_due",
"attested_at": "2026-11-02T09:30:00.008771Z",
"comment": null,
"attested_by": {
"type": "user_actor",
"user_id": "user_01AbCdEfGhJkLmNpQrStUvWx"
}
}
}
]
}모든 필드는 항상 존재하며, 값이 없는 필드는 절대 생략되지 않고 null이 됩니다. 시간 값은 소수 자릿수가 없거나 여섯 자리이므로, 시간은 문자열이 아닌 시간으로 비교하세요.
최상위 필드
| 필드 | 유형 | 설명 |
|---|---|---|
type | string | 항상 security_posture입니다. |
organization_id | string | 조직의 UUID입니다. |
evaluated_at | string (RFC 3339, UTC) | 모든 통제가 평가된 시점입니다. |
comments_status | string | 진술 코멘트를 읽었는지 여부입니다. 진술자 및 코멘트를 참조하세요. |
controls | array of objects | 조직의 통제이며, 절대 비어 있지 않습니다. |
controls[] 필드
| 필드 | 유형 | 설명 |
|---|---|---|
id | string | 통제의 식별자로, 모든 조직에서 동일하며 절대 변경되지 않습니다. |
display_name | string | 통제의 표시 이름으로, 표현이 바뀔 수 있는 영어 표시 텍스트입니다. |
section | string | 통제가 속한 섹션으로, 이 표 뒤에 나열된 10개 섹션 중 하나입니다. 값이 추가될 수 있으므로 알 수 없는 값은 별도의 섹션으로 취급하세요. |
setting_name | string 또는 null | 이 통제가 읽는, 조직의 유효 설정 항목의 name입니다. 이러한 항목을 읽지 않는 경우 null입니다. |
status | string | 통제 결과의 사유입니다. 결과 사유 값을 참조하세요. |
rating | string | 통제의 결과로, status에 따라 정해집니다. 결과 사유 값을 참조하세요. |
current_value | string 또는 null | 현재 값으로, 표현이 바뀔 수 있는 영어 표시 텍스트입니다. 수동 통제이거나 값을 읽지 못한 경우 null입니다. |
desired_state | string 또는 null | 권장 값으로, 표현이 바뀔 수 있는 영어 표시 텍스트입니다. 이 조직에 권장 값이 없는 경우 null입니다. |
attestation | object 또는 null | 응답에 나타나는 진술로, 진술이 유효하지 않은 동안에도 포함됩니다. status가 descriptive, not_applicable 또는 not_evaluated인 동안과 이러한 경우에는 null입니다. |
section은 identity_access, data_privacy, capabilities, connectors_integrations, chats_desktop_mdm, cowork_admin_console, cowork_desktop_mdm, claude_code_admin_console, claude_code_managed_settings, healthy_adoption 중 하나입니다.
코드에서 값을 비교하려면 같은 조직의 유효 설정에서 setting_name을 조회하세요. 조회 결과가 없을 수도 있으며, 두 통제가 하나의 setting_name을 공유할 수도 있습니다.
attestation 필드
| 필드 | 유형 | 설명 |
|---|---|---|
state | string | 진술이 유효한지 여부입니다. 진술 상태를 참조하세요. |
attested_at | string (RFC 3339, UTC) | 진술이 이루어진 시점입니다. |
comment | string 또는 null | 진술과 함께 저장된 최대 2,000자의 코멘트입니다. 코멘트가 없거나 comments_status가 available이 아닌 경우 null입니다. |
attested_by | object 또는 null | 진술한 사람입니다. 키가 read:compliance_user_data와 read:org_audit 중 어느 것도 보유하지 않은 경우, 해당 사람의 계정이 삭제되었거나 삭제 중인 경우, 또는 엔드포인트가 진술한 사람을 조직에 대해 반환하지 않는 경우 null입니다. |
attested_by 필드
| 필드 | 유형 | 설명 |
|---|---|---|
type | string | 항상 user_actor입니다. |
user_id | string | 사용자의 ID로, user_로 시작합니다. |
결과 사유 값
status는 통제 결과의 사유를 나타내며, 각 결과 사유에는 하나의 rating이 대응합니다.
status | 통제 종류 | 의미 | rating | 페이지에서 |
|---|---|---|---|---|
passed | 자동 | 현재 값이 권장 값을 충족합니다. | passed | 통과 |
matches_profile | 자동 | 현재 값이 권장 값과 같습니다. | passed | 통과 |
exceeds_baseline | 자동 | 현재 값이 권장 값보다 엄격합니다. | passed | 통과 |
failed_check_accepted_risk | 자동 | 자동 검사 기준을 충족하지 못하며, 위험 수용이 유효합니다. | passed | 통과 |
failed | 자동 또는 수동 | 현재 값이 권장 값을 충족하지 않거나, 응답에서 제외되는 진술이 이 결과를 부여합니다. | failed | 실패, 또는 완료 진술이 유효한 경우 통과 |
review | 자동 | 현재 값이 권장 값보다 느슨합니다. | failed | 실패 |
attested_completed | 수동 | 값이 완료(completed)인 진술이 유효합니다. | passed | 통과 |
attested_accepted_risk | 수동 | 값이 위험 수용(accepted_risk)인 진술이 유효합니다. | passed | 통과 |
not_attested | 수동 | 유효한 진술이 없습니다. | not_attested | 미진술 |
attestation_not_enabled | 수동 | 아무도 이 통제에 대해 진술할 수 없습니다. | not_attested | 정보 제공 |
descriptive | 정보 제공용 | 통제가 보고되기만 하고 결과가 부여되지 않습니다. | descriptive | 정보 제공 |
not_applicable | 어느 종류든 | 통제가 조직에 적용되지 않습니다. | descriptive | 정보 제공 |
not_evaluated | 어느 종류든 | 해당 설정, 또는 통제의 적용 여부를 결정하는 다른 설정을 읽을 수 없었습니다. | descriptive | 정보 제공 |
통제 종류를 나타내는 필드는 없습니다. failed의 경우 current_value가 null이면 수동 통제입니다. 값이 추가될 수 있으므로, 알 수 없는 status를 가진 통제는 rating에 따라 집계하고, 알 수 없는 rating은 통과로 간주하지 마세요. 결과 사유 review와 진술 상태 review_due는 서로 관련이 없습니다.
진술 상태
state는 응답에 나타나는 진술이 유효한지 여부를 나타냅니다.
state | 의미 |
|---|---|
in_force | 진술이 유효합니다. |
review_due | 만료일이 되었습니다. |
setting_changed | 위험을 수용한 값이 아닌 다른 값에서 검사 기준을 충족하지 못하거나, 위험 수용이 이미 종료된 것으로 기록되었습니다. |
check_passing | 검사 기준을 충족하므로 수용할 위험이 없습니다. |
여러 사유가 해당하는 경우, 응답은 check_passing, setting_changed, review_due 중 가장 앞의 것을 제공합니다. 만료일 00:00 UTC부터 진술은 유효하지 않습니다. 응답에는 만료일이 없으므로 state로 판단하며, 저장된 만료일은 진술 활동의 review_date입니다. 알 수 없는 state는 유효하지 않은 것으로 간주하세요.
응답에 진술이 나타나는 방식
응답에는 일부 진술만 나타나고 나머지는 제외되므로, attestation이 null이라고 해서 아무도 진술하지 않았다는 것이 증명되지는 않습니다.
| 통제 종류 | 진술 값 | status | rating | attestation |
|---|---|---|---|---|
| 수동 | 진술 없음 | not_attested 또는 아무도 진술할 수 없는 경우 attestation_not_enabled | not_attested | null |
| 수동 | 완료 | attested_completed | passed | 포함됨 |
| 수동 | 위험 수용 | attested_accepted_risk | passed | 포함됨 |
| 수동 | 실패(control_failed) | failed | failed | null: 절대 포함되지 않음 |
| 자동, 검사 기준 미충족 | 진술 없음 | failed 또는 review | failed | null |
| 자동, 검사 기준 미충족 | 위험 수용 | failed_check_accepted_risk | passed | 포함됨 |
| 자동, 검사 기준 미충족 | 완료 | 자동 검사가 review를 부여하는 경우에도 failed | failed | null: 절대 포함되지 않음 |
| 자동, 검사 기준 미충족 | 실패 | 자동 검사가 부여하는 status | failed | null: 절대 포함되지 않음 |
| 자동, 검사 기준 충족 | 진술 없음 | passed, matches_profile 또는 exceeds_baseline | passed | null |
| 자동, 검사 기준 충족 | 완료 | 자동 검사가 부여하는 status | passed | null: 절대 포함되지 않음 |
| 자동, 검사 기준 충족 | 위험 수용 | 자동 검사가 부여하는 status | passed | 수용된 값에서 검사 기준을 충족하는 동안 null |
| 자동, 검사 기준 충족 | 실패 | failed | failed | null: 절대 포함되지 않음 |
| 정보 제공용 | 어떤 값이든 | descriptive | descriptive | null: 절대 포함되지 않음 |
| 어느 종류든, 진술이 유효하지 않은 동안 | 앞의 행에서 응답에 포함되는 값 | 진술이 없을 때와 같음 | 진술이 없을 때와 같음 | 포함됨, state는 in_force 이외의 값 |
| 어느 종류든, 진술이 유효하지 않은 동안 | 앞의 행에서 응답에서 제외되는 값 | 진술이 없을 때와 같음 | 진술이 없을 때와 같음 | null |
마지막 두 행을 제외한 각 행은 진술이 유효한 동안 적용됩니다. 자동 통제에서는 검사가 읽는 값이 진술이 저장될 때의 값과 다른 동안에는 진술이 유효하지 않습니다. 자동 통제에서 응답에 나타나는 진술은 모두 위험 수용입니다. Activity Feed에는 응답에서 제외되는 종류의 진술도 기록됩니다.
결과 집계
rating별로 통제를 집계할 때 네 가지 사항을 확인하세요.
| 집계 대상 | 함께 확인할 사항 |
|---|---|
통과(passed) | 위험 수용이 유효한 모든 통제가 포함되므로 failed_check_accepted_risk와 attested_accepted_risk를 확인하세요. |
실패(failed) | 실패(control_failed)로 진술된 통제와, 완료 진술이 유효하지만 자동 검사 기준을 충족하지 못한 통제가 포함됩니다. 후자는 Security posture 페이지에 통과로 나타납니다. |
정보 제공(descriptive) | 읽을 수 없었던 통제가 가려질 수 있으므로 not_evaluated를 확인하세요. |
| 모든 통제 | 응답에 없는 통제는 통과로 간주하지 않으며 이름도 나타나지 않으므로, id 값을 해당 조직에서 이전에 확인한 값과 비교하세요. |
진술자 및 코멘트
attested_by는 read:compliance_org_data와 함께 read:compliance_user_data를 보유하거나 read:org_audit를 보유한 키에 대해서만 채워집니다. read:compliance_user_data만 보유한 키는 403을 받습니다. attested_by의 user_id는 진술 활동에 있는 actor의 user_id와 같습니다. attested_by에는 사용자 ID만 들어 있으며, 각 현재 구성원의 이름과 이메일 주소는 조직 사용자 나열에서 제공됩니다. 이러한 범위를 추가하기 전에 진술한 사람을 볼 수 있는 사람을 참조하세요.
이 엔드포인트는 Security posture 페이지에 코멘트가 표시되는 경우에도 코멘트를 반환하지 않습니다. 모든 comment는 null이며, comments_status는 not_enabled 또는 not_permitted입니다. 따라서 not_enabled와 null 코멘트는 진술에 코멘트가 없다는 뜻이 아닙니다. comments_status는 null 코멘트를 어떻게 해석해야 하는지 알려 주며, 스키마에는 이 값들이 정의되어 있습니다.
comments_status | 의미 |
|---|---|
not_permitted | API 키가 read:compliance_user_data와 read:org_audit 중 어느 것도 보유하지 않으므로 모든 comment와 모든 attested_by가 null입니다. |
requires_organization_key | API 키가 상위 조직용 키 등 해당 조직에서 생성되지 않은 키이므로 모든 comment가 null입니다. 다시 시도해도 해결되지 않습니다. |
available | 코멘트를 읽었으므로, null 코멘트는 코멘트가 없거나 방금 저장되었음을 의미합니다. |
not_enabled | 이 엔드포인트는 해당 조직의 코멘트를 반환하지 않으므로 모든 comment가 null입니다. |
unavailable | 이 응답에서는 코멘트를 읽을 수 없었습니다. 이후 요청은 성공할 수도 있지만, 일부 원인은 고객이 조치할 때까지 지속됩니다. |
값이 추가될 수 있습니다. 알 수 없는 값은 unavailable로 간주하세요.
오류
오류는 나머지 Compliance API와 동일한 본문을 사용합니다. 이 표는 이 엔드포인트가 고유한 방식으로 반환하는 오류를 나열합니다.
상태 코드 및 error.type | 발생 시점 | 조치 |
|---|---|---|
400 invalid_request_error | anthropic-version이 없거나 유효하지 않은 경우, 상위 조직에 Compliance API가 활성화되지 않은 경우, 또는 쿼리 매개변수가 있는 경우입니다. | error.message에 명시된 문제를 수정하세요. |
401 authentication_error | 키가 없거나, 인식되지 않거나, Compliance Access Key 또는 Admin API 키가 아닌 경우입니다. | x-api-key에 유효한 Compliance Access Key를 보내세요. |
403 permission_error | 키가 이 엔드포인트를 호출할 수 없는 경우로, 일반적으로 read:compliance_org_data와 read:org_audit가 모두 없기 때문입니다. | 두 범위 중 하나를 가진 키를 사용하세요. |
404 not_found_error | 이 표 다음에 나열된 원인을 참조하세요. | 즉시 재시도하지 말고, 실패한 통제가 없다는 의미로 절대 해석하지 마세요. |
429 rate_limit_error | 공유 Compliance API 속도 제한 또는 이 엔드포인트의 더 낮은 제한을 모두 사용한 경우로, 어느 쪽인지는 error.message에 나타납니다. | retry-after만큼 기다리세요. 429 Too Many Requests를 참조하세요. |
error.details.error_code가 posture_evaluation_failed인 503 overloaded_error | 결과를 생성할 수 없었습니다. | retry-after만큼 기다린 후 재시도하세요. 이후 실행에서도 특정 조직에서 다시 발생하면 Anthropic 지원팀에 한 번 문의하세요. |
error_code가 없는 503 또는 504 timeout_error | 일시적인 실패입니다. | 지수 백오프로 재시도하세요. |
404의 원인:
organization_id가 UUID가 아니거나, 어떤 조직도 가리키지 않거나, 삭제된 조직을 가리킵니다.organization_id가 상위 조직, 다른 상위 조직 아래의 조직, 또는 단일 조직용 키가 포함하지 않는 조직을 가리킵니다.- 조직이 Claude Enterprise를 사용하지 않거나, Claude Console 조직처럼 Security posture를 사용할 수 없습니다.
- 해당 조직에 대해 Security posture 페이지가 꺼짐으로 설정되었습니다(Security posture 사용 가능 여부 참조).
- 조직에서 Security posture를 사용할 수 있지만, 엔드포인트가 해당 조직을 지원하지 않습니다.
- 사용 가능 여부를 확인할 수 없었습니다. 이후 요청은 성공할 수 있습니다.
모든 404는 존재하지 않는 경로와 마찬가지로 동일한 본문을 가집니다.
최신성 및 부수 효과
엔드포인트는 호출 시점에 모든 통제를 평가하며, evaluated_at이 그 시점입니다.
- 최근 몇 분 이내의 변경 사항은 반영되지 않을 수 있습니다.
- 설정이 변경되지 않아도 결과가 바뀔 수 있습니다. 예를 들어 만료일이 되거나 Anthropic이 권장 값을 변경하는 경우입니다.
- Anthropic이 현재 값의 표현을 변경하면, 해당 값에 대한 위험 수용은 유효하지 않습니다.
- 호출은 결과를 저장하지 않으며 진술을 종료시키지 않습니다.
- 키, 범위, 버전 검사를 통과하고 쿼리 매개변수가 없는 각 요청은 성공 여부와 관계없이
compliance_api_accessed활동을 하나 기록합니다. 이 활동의url은 읽은 조직을 나타내며, 상위 조직용 키의 경우organization_uuid는null입니다.
이 페이지가 도움이 되었나요?