
# 서명 키 정책 업데이트

`PATCH /v1/signing-keys/policy` · 권한 `signing-keys:write`

JSON merge patch(`application/merge-patch+json`, RFC 7396)로 서명 키 정책을 업데이트합니다. `If-Match`는 필수입니다. 없으면 `428`, 오래된 버전이면 `412`입니다. 정책이 한 번도 작성되지 않았다면 버전은 `"0"`입니다. 아무것도 바꾸지 않는 패치는 쓰기를 하지 않고 버전을 유지합니다.

`algorithm`을 바꾸면 새 알고리즘으로 새 `next` 키가 즉시 생성됩니다. JWKS를 캐시하는 검증자가 먼저 볼 수 있도록 이 키는 빨라야 7일 후에 활성화될 수 있습니다(그보다 이른 `immediate` 교체는 `409 next_key_too_young`으로 실패). 그때까지 활성 키가 계속 서명합니다. `rotation_interval_days`를 바꾸면 `next_rotation_at`이 이동합니다. 변경이 성공하면 `signing_key.policy_updated` 관리 감사 기록이 작성됩니다.

## 요청

| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
| `If-Match` | header | 예 | 마지막으로 읽은 정책의 `ETag`(한 번도 작성되지 않았다면 `"0"`). 없으면 `428`, 오래되었으면 `412`. |
| `algorithm` | string | 아니오 | `RS256`, `ES256`, `PS256` 또는 `EdDSA`. `null`일 수 없습니다. |
| `rotation_interval_days` | integer | 아니오 | 30-365. `null`일 수 없습니다. |
| `storage` | string | 아니오 | `wrapped`(개인 키는 환경 키로 암호화되어 저장되며 서명 서비스 내부에서만 사용됨). `transit`(키 관리 서비스에 보관되는 키)은 아직 사용할 수 없으며 `422`로 거부됩니다. `null`일 수 없습니다. |

## 응답

`200 OK`와 업데이트된 정책, 새 `ETag`.

```json
{
  "algorithm": "ES256",
  "rotation_interval_days": 90,
  "storage": "wrapped",
  "next_rotation_at": "2026-12-04T09:30:00.123456Z",
  "updated_at": "2026-10-05T09:30:00.123456Z"
}
```

## 오류

| HTTP | code | 조건 |
|---|---|---|
| 400 | `unknown_field` | 패치에 미알려진 필드나 읽기 전용 필드가 있거나 JSON 객체가 아닙니다(`malformed_request`). |
| 412 | `precondition_failed` | `If-Match`가 현재 버전과 일치하지 않습니다. |
| 415 | `unsupported_media_type` | 콘텐츠 유형이 `application/merge-patch+json`이 아닙니다. |
| 422 | `validation_failed` | 값이 잘못되었거나(`invalid_value`), 범위를 벗어났거나(`out_of_range`), `null`로 설정되었거나(`invalid`), `storage`가 `transit`입니다. |
| 428 | `precondition_required` | `If-Match` 헤더가 누락되었습니다. |
| 401 | `unauthenticated` | 자격 증명이 누락되었거나, 잘못되었거나, 취소되었습니다. |
| 403 | `insufficient_permissions` | 자격 증명에 필요한 권한이 없습니다. |
| 429 | `rate_limited` | 속도 제한을 초과했습니다. `Retry-After` 기간 후에 다시 시도하세요. |
| 501 | `not_implemented` | 이 배포에서는 아직 작업을 사용할 수 없습니다. 다시 시도해도 결과는 바뀌지 않습니다. |
| 503 | `service_unavailable` | 종속성을 일시적으로 사용할 수 없습니다. `Retry-After` 기간 후에 다시 시도하세요. |

## 예제

```bash
curl -X PATCH https://api.eu.keenauth.com/v1/signing-keys/policy \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -H 'If-Match: "0"' \
  -d '{"algorithm":"ES256","rotation_interval_days":90}'
```
