조직 정책 생성 또는 교체
PUT /v1/organizations/{org_id}/policies/{policy_kind} · 권한 organizations:write
하나의 정책 종류에 대한 설정 객체 전체를 교체합니다. 조직 정책은 환경의 설정보다 엄격하게만 설정할 수 있습니다. 요금제 제한은 서버에서 적용됩니다. session 및 ip_allowlist 종류와 AAGUID 허용 목록에는 Enterprise 요금제가 필요합니다(개발 환경에서는 사용 가능). 설정 내용은 관리 감사 로그에 기록되지만 organization.updated 이벤트에는 포함되지 않습니다.
요청
| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
org_id |
path | 예 | 조직 ID(org_…)입니다. |
policy_kind |
path | 예 | 정책 종류: authentication_methods, mfa, phishing_resistant, sso_enforcement, session 또는 ip_allowlist입니다. 다른 값은 404를 반환합니다. |
If-Match |
header | 아니요 | 정책이 존재하면 필요합니다(마지막으로 읽은 ETag). 정책을 새로 만들려면 생략합니다. *는 기존 정책과 일치합니다. |
settings |
object | 예 | 종류별 설정 객체입니다. 종류별 필드: authentication_methods: allowed_connection_ids(conn_…), allow_passkey, allow_password; mfa: required_for(none, admins, all), allowed_factors(totp, webauthn, sms, email), enrollment_grace_days(0-30); phishing_resistant: required_for, aaguid_allowlist(최대 500개); sso_enforcement: mode(off, org_context, verified_domains), connection_ids(conn_…), bypass_user_ids(usr_…, 최대 2개); session: idle_minutes, absolute_minutes, refresh_idle_days, refresh_absolute_days; ip_allowlist: cidrs(최대 100개), applies_to(admins, all). |
요청 본문:
{
"settings": {
"required_for": "all",
"allowed_factors": [
"totp",
"webauthn"
],
"enrollment_grace_days": 7
}
}
응답
정책을 생성하면 201 Created, 교체하면 200 OK를 반환합니다. 본문은 정책이며, 응답에는 새 ETag가 포함됩니다.
{
"organization_id": "org_01j9xk3m7q8r2s4t6v8w0y2z4a",
"policy_kind": "mfa",
"schema_version": 1,
"settings": {
"required_for": "all",
"allowed_factors": [
"totp",
"webauthn"
],
"enrollment_grace_days": 7
},
"updated_at": "2026-10-12T09:30:00.123456Z",
"version": 1
}
오류
| HTTP | code | 발생 조건 |
|---|---|---|
| 400 | unknown_field |
본문에 스키마에 없거나 읽기 전용인 필드가 있습니다. |
| 403 | plan_feature_unavailable |
해당 종류 또는 AAGUID 허용 목록에 더 높은 요금제가 필요합니다. 문제 응답에는 feature와 required_plan이 포함됩니다. |
| 404 | not_found |
조직이 존재하지 않거나 종류를 알 수 없습니다. |
| 409 | domain_not_verified |
mode가 verified_domains인 sso_enforcement에는 조직에 인증된 도메인이 필요합니다. |
| 409 | connection_test_required |
sso_enforcement를 켜려면(off 또는 정책 없음에서 전환) connection_ids 중 하나 이상의 현재 구성에 대해 최근 24시간 내 테스트 로그인이 성공해야 합니다. 연결 테스트(POST /v1/connections/{connection_id}:test)를 실행한 후 다시 시도하십시오. |
| 409 | organization_pending_deletion |
조직이 셀프 서비스 삭제를 대기 중입니다. 먼저 삭제를 취소하십시오. |
| 412 | precondition_failed |
If-Match가 현재 버전과 일치하지 않거나, 이 종류의 정책이 없는 상태에서 전송되었거나, 이 요청이 생성되는 동안 다른 요청이 정책을 만들었습니다. 정책을 다시 읽으십시오. |
| 422 | validation_failed |
설정 필드가 알 수 없거나 유효하지 않습니다. errors[]가 /settings/…를 가리킵니다. |
| 422 | policy_weaker_than_parent |
설정이 환경의 설정보다 약합니다. errors[]가 약한 필드를 가리킵니다. |
| 422 | at_least_one_method |
authentication_methods에 로그인 방법이 남지 않습니다. |
| 428 | precondition_required |
정책이 존재하는데 If-Match가 없습니다. |
| 401 | unauthenticated |
자격 증명이 없거나, 유효하지 않거나, 취소되었습니다. |
| 403 | insufficient_permissions |
자격 증명에 필요한 권한이 없습니다. |
| 429 | rate_limited |
요청 한도를 초과했습니다. Retry-After 기간 후 다시 시도하십시오. |
| 503 | service_unavailable |
종속 서비스를 일시적으로 사용할 수 없습니다. Retry-After 기간 후 다시 시도하십시오. |
예시
curl -X PUT https://api.eu.keenauth.com/v1/organizations/org_01j9xk3m7q8r2s4t6v8w0y2z4a/policies/mfa \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"settings":{"required_for":"all","allowed_factors":["totp","webauthn"]}}'