API 키 관리
API 키는 알림 발송 API(/v1/notifications, /v1/otp 계열)의 HMAC 인증 수단입니다.
키 자체의 발급·수정·회전·폐기는 대시보드 API로 수행하며, Authorization: Bearer 헤더에 대시보드 액세스 토큰을 담아 호출합니다.
토큰 발급은 대시보드 인증을 참고하세요.
키 관리 엔드포인트는 모두 owner / admin 역할만 호출할 수 있습니다.
키 하나는 세 가지 값으로 구성됩니다.
| 값 | 형식 | 용도 |
|---|---|---|
keyId | pk_ 접두 문자열 | 키 식별자. 목록 조회에서 항상 확인할 수 있습니다. |
keySecret | 랜덤 문자열 | X-API-Key 헤더에 keyId와 함께 전달하는 시크릿입니다. |
hmacSecret | 랜덤 문자열 | 요청 서명(X-Signature)을 만드는 HMAC 비밀키입니다. |
keySecret은 해시로, hmacSecret은 암호화되어 저장되므로 발급·회전 응답에서 단 한 번만 확인할 수 있습니다.
발급 후 실제 요청에 사용하는 방법은 인증을 참고하세요.
스코프
키에 부여할 수 있는 스코프 전체 목록입니다.
생성 시 scopes를 생략하면 notifications:send만 부여됩니다.
| 스코프 | 설명 |
|---|---|
notifications:send | 알림 단건·대량 발송과 발송 취소 |
notifications:read | 발송 요청 상태·이력 조회 |
templates:read | 템플릿 조회 |
templates:write | 템플릿 생성·수정 |
providers:read | 공급자 설정 조회 |
routes:read | 라우팅 규칙 조회 |
webhooks:read | 웹훅 구독 조회 |
audit:read | 감사 로그 조회 |
otp:send | OTP 발송·재발송 |
otp:verify | OTP 코드 검증 |
스코프가 없는 엔드포인트를 호출하면 403이 반환됩니다.
scopes를 생략하는 것과 빈 배열 []로 명시하는 것은 다르게 동작합니다.
생략하면 기본값 notifications:send가 부여되지만, scopes: []로 발급한 키는 어떤 스코프도 갖지 않아 발송·조회·OTP 등 스코프를 요구하는 모든 엔드포인트에서 403으로 거부됩니다.
최소 권한 설정이 도리어 발송 권한을 주는 일이 없도록, 빈 배열을 notifications:send로 되돌리지 않습니다.
키 상태
| 상태 | 설명 |
|---|---|
active | 정상. HMAC 인증에 사용할 수 있습니다. |
suspended | 일시정지. 인증이 거부되며, 재개하면 다시 active가 됩니다. |
revoked | 폐기. 되돌릴 수 없습니다. |
- HMAC 인증은
active상태의 키만 통과합니다.suspended/revoked키로 요청하면 401이 반환됩니다. - 상태 전이는
active → suspended(suspend),suspended → active(resume),active/suspended → revoked(revoke, 회전 포함)만 가능합니다.revoked키는 resume으로 되살릴 수 없습니다. expiresAt이 지난 키는 상태와 무관하게 인증이 401(NOTI-4011)로 거부됩니다.
키 목록 조회
워크스페이스의 모든 키를 최신 생성 순으로 조회합니다. (역할: owner / admin)
{
"apiKeys": [
{
"id": "8f14e45f-…",
"name": "production-server",
"keyId": "pk_a1b2c3…",
"status": "active",
"expiresAt": null,
"lastUsedAt": "2026-07-10T09:00:00.000Z",
"createdAt": "2026-07-01T09:00:00.000Z",
"scopes": ["notifications:send", "notifications:read"],
"allowedTemplateIds": [],
"rateLimit": null
}
]
}시크릿(keySecret, hmacSecret)은 목록에 포함되지 않습니다.
rateLimit은 해당 키 전용 레이트리밋 정책이 있을 때만 채워집니다.
키 생성
새 API 키를 발급합니다. (역할: owner / admin)
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
name | string | 필수 | 키 이름. 최대 120자 |
expiresInDays | int | 선택 | 만료까지 일수. 1 ~ 3,650. 미지정 시 무기한 |
scopes | string[] | 선택 | 부여할 스코프. 최대 20개. 생략 시 ["notifications:send"], 빈 배열 []이면 무권한 |
allowedTemplateIds | string[] | 선택 | 발송 허용 템플릿 화이트리스트. 최대 500개. 빈 배열이면 전체 허용 |
rateLimit | object | 선택 | 키 전용 한도. windowSeconds(1maxRequests(1enabled 모두 필수 |
curl -X POST https://api.posmit.io/v1/keys \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "production-server",
"expiresInDays": 365,
"scopes": ["notifications:send", "notifications:read"]
}'{
"apiKeyId": "8f14e45f-…",
"apiKey": {
"keyId": "pk_a1b2c3…",
"keySecret": "f0e1d2…",
"hmacSecret": "9a8b7c…"
}
}keySecret과 hmacSecret은 이 응답에서 단 한 번만 노출되며, 이후 어떤 API로도 다시 조회할 수 없습니다.
발급 즉시 안전한 비밀 저장소에 보관하세요.
분실했다면 회전(rotate)으로 새 시크릿을 발급해야 합니다.
| 코드 | 의미 |
|---|---|
NOTI-40000 | 요청 본문 검증 실패 (허용되지 않은 스코프, 범위 초과 등) |
키 수정
키의 이름·스코프·템플릿 화이트리스트·만료 시각·전용 한도를 수정합니다. (역할: owner / admin) 지정한 필드만 변경되며, 배열 필드는 전체 교체됩니다.
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
name | string | 선택 | 키 이름. 최대 120자 |
scopes | string[] | 선택 | 스코프 전체 교체. 최대 20개 |
allowedTemplateIds | string[] | 선택 | 화이트리스트 전체 교체. 최대 500개 |
expiresAt | string | null | 선택 | ISO 8601 만료 시각. null이면 무기한으로 변경 |
rateLimit | object | null | 선택 | 키 전용 한도 설정. null이면 전용 정책을 삭제하고 기본 한도로 복귀 |
{
"apiKey": {
"id": "8f14e45f-…",
"name": "production-server",
"keyId": "pk_a1b2c3…",
"status": "active",
"scopes": ["notifications:send"],
"allowedTemplateIds": ["tmpl-1", "tmpl-2"],
"rateLimit": null,
"expiresAt": null,
"lastUsedAt": null,
"createdAt": "2026-07-01T09:00:00.000Z"
}
}| 코드 | 의미 |
|---|---|
NOTI-40000 | 요청 본문 검증 실패 |
NOTI-40400 | 해당 키를 찾을 수 없음 |
시크릿 회전
기존 키를 폐기하고 같은 설정의 새 키를 발급합니다. (역할: owner / admin)
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
apiKeyCredentialId | UUID | 필수 | 회전할 키의 id (keyId가 아님) |
name | string | 선택 | 새 키 이름. 미지정 시 기존 이름 승계 |
expiresInDays | int | 선택 | 새 만료까지 일수. 1 ~ 3,650. 미지정 시 기존 만료 시각 승계 |
회전은 다음과 같이 동작합니다.
- 기존 키는 즉시
revoked상태가 되어 인증에 사용할 수 없습니다. - 새
keyId/keySecret/hmacSecret을 가진 새 자격 증명이 생성됩니다. - 스코프, 템플릿 화이트리스트, 키 전용 레이트리밋 정책은 새 키로 승계됩니다.
{
"apiKey": {
"keyId": "pk_d4e5f6…",
"keySecret": "1a2b3c…",
"hmacSecret": "7d8e9f…"
}
}회전 즉시 기존 시크릿이 무효화되므로, 운영 중인 서비스라면 새 시크릿 배포 준비를 마친 뒤 호출하세요.
응답에는 새 시크릿만 포함되며 역시 1회만 노출됩니다.
새 키의 id는 GET /v1/keys로 확인할 수 있습니다.
| 코드 | 의미 |
|---|---|
NOTI-40000 | 요청 본문 검증 실패 |
NOTI-40400 | 해당 키를 찾을 수 없음 |
폐기 · 일시정지 · 재개
세 엔드포인트 모두 성공 시 본문 없이 204를 반환하며, 키를 찾을 수 없으면 404(NOTI-40400)가 반환됩니다.
키를 영구 폐기합니다. (역할: owner / admin)
이미 revoked인 키에 호출해도 204가 반환되며(멱등), 폐기된 키는 되돌릴 수 없습니다.
키를 일시정지합니다. (역할: owner / admin)
active 상태의 키만 suspended로 바뀌며, 그 외 상태에서는 변경 없이 204가 반환됩니다.
일시정지된 키를 재개합니다. (역할: owner / admin)
suspended 상태의 키만 active로 바뀌며, 그 외 상태(폐기 포함)에서는 변경 없이 204가 반환됩니다.
공통 에러
모든 키 관리 엔드포인트는 실패 시 application/problem+json 형식으로 응답합니다.
| 코드 | HTTP | 의미 |
|---|---|---|
NOTI-40100 | 401 | 액세스 토큰 누락·만료·위조 |
NOTI-40300 | 403 | 역할 부족(owner/admin 아님) 또는 워크스페이스 미선택 |
NOTI-40400 | 404 | 키 없음 (다른 워크스페이스의 키 포함) |
에러 형식의 자세한 내용은 에러 처리를 참고하세요.