Skip to Content
개발자API 키 관리

API 키 관리

API 키는 알림 발송 API(/v1/notifications, /v1/otp 계열)의 HMAC 인증 수단입니다. 키 자체의 발급·수정·회전·폐기는 대시보드 API로 수행하며, Authorization: Bearer 헤더에 대시보드 액세스 토큰을 담아 호출합니다. 토큰 발급은 대시보드 인증을 참고하세요.

키 관리 엔드포인트는 모두 owner / admin 역할만 호출할 수 있습니다.

키 하나는 세 가지 값으로 구성됩니다.

형식용도
keyIdpk_ 접두 문자열키 식별자. 목록 조회에서 항상 확인할 수 있습니다.
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:sendOTP 발송·재발송
otp:verifyOTP 코드 검증

스코프가 없는 엔드포인트를 호출하면 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)로 거부됩니다.

키 목록 조회

GEThttps://api.posmit.io/v1/keys

워크스페이스의 모든 키를 최신 생성 순으로 조회합니다. (역할: 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은 해당 키 전용 레이트리밋 정책이 있을 때만 채워집니다.

키 생성

POSThttps://api.posmit.io/v1/keys

새 API 키를 발급합니다. (역할: owner / admin)

필드타입필수설명
namestring필수키 이름. 최대 120자
expiresInDaysint선택만료까지 일수. 1 ~ 3,650. 미지정 시 무기한
scopesstring[]선택부여할 스코프. 최대 20개. 생략 시 ["notifications:send"], 빈 배열 []이면 무권한
allowedTemplateIdsstring[]선택발송 허용 템플릿 화이트리스트. 최대 500개. 빈 배열이면 전체 허용
rateLimitobject선택키 전용 한도. windowSeconds(13,600), maxRequests(11,000,000), enabled 모두 필수
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…" } }

keySecrethmacSecret이 응답에서 단 한 번만 노출되며, 이후 어떤 API로도 다시 조회할 수 없습니다. 발급 즉시 안전한 비밀 저장소에 보관하세요. 분실했다면 회전(rotate)으로 새 시크릿을 발급해야 합니다.

코드의미
NOTI-40000요청 본문 검증 실패 (허용되지 않은 스코프, 범위 초과 등)

키 수정

PATCHhttps://api.posmit.io/v1/keys/:apiKeyCredentialId

키의 이름·스코프·템플릿 화이트리스트·만료 시각·전용 한도를 수정합니다. (역할: owner / admin) 지정한 필드만 변경되며, 배열 필드는 전체 교체됩니다.

필드타입필수설명
namestring선택키 이름. 최대 120자
scopesstring[]선택스코프 전체 교체. 최대 20개
allowedTemplateIdsstring[]선택화이트리스트 전체 교체. 최대 500개
expiresAtstring | null선택ISO 8601 만료 시각. null이면 무기한으로 변경
rateLimitobject | 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해당 키를 찾을 수 없음

시크릿 회전

POSThttps://api.posmit.io/v1/keys/rotate

기존 키를 폐기하고 같은 설정의 새 키를 발급합니다. (역할: owner / admin)

필드타입필수설명
apiKeyCredentialIdUUID필수회전할 키의 id (keyId가 아님)
namestring선택새 키 이름. 미지정 시 기존 이름 승계
expiresInDaysint선택새 만료까지 일수. 1 ~ 3,650. 미지정 시 기존 만료 시각 승계

회전은 다음과 같이 동작합니다.

  1. 기존 키는 즉시 revoked 상태가 되어 인증에 사용할 수 없습니다.
  2. keyId / keySecret / hmacSecret을 가진 새 자격 증명이 생성됩니다.
  3. 스코프, 템플릿 화이트리스트, 키 전용 레이트리밋 정책은 새 키로 승계됩니다.
{ "apiKey": { "keyId": "pk_d4e5f6…", "keySecret": "1a2b3c…", "hmacSecret": "7d8e9f…" } }

회전 즉시 기존 시크릿이 무효화되므로, 운영 중인 서비스라면 새 시크릿 배포 준비를 마친 뒤 호출하세요. 응답에는 새 시크릿만 포함되며 역시 1회만 노출됩니다. 새 키의 idGET /v1/keys로 확인할 수 있습니다.

코드의미
NOTI-40000요청 본문 검증 실패
NOTI-40400해당 키를 찾을 수 없음

폐기 · 일시정지 · 재개

세 엔드포인트 모두 성공 시 본문 없이 204를 반환하며, 키를 찾을 수 없으면 404(NOTI-40400)가 반환됩니다.

POSThttps://api.posmit.io/v1/keys/:apiKeyCredentialId/revoke

키를 영구 폐기합니다. (역할: owner / admin) 이미 revoked인 키에 호출해도 204가 반환되며(멱등), 폐기된 키는 되돌릴 수 없습니다.

POSThttps://api.posmit.io/v1/keys/:apiKeyCredentialId/suspend

키를 일시정지합니다. (역할: owner / admin) active 상태의 키만 suspended로 바뀌며, 그 외 상태에서는 변경 없이 204가 반환됩니다.

POSThttps://api.posmit.io/v1/keys/:apiKeyCredentialId/resume

일시정지된 키를 재개합니다. (역할: owner / admin) suspended 상태의 키만 active로 바뀌며, 그 외 상태(폐기 포함)에서는 변경 없이 204가 반환됩니다.

공통 에러

모든 키 관리 엔드포인트는 실패 시 application/problem+json 형식으로 응답합니다.

코드HTTP의미
NOTI-40100401액세스 토큰 누락·만료·위조
NOTI-40300403역할 부족(owner/admin 아님) 또는 워크스페이스 미선택
NOTI-40400404키 없음 (다른 워크스페이스의 키 포함)

에러 형식의 자세한 내용은 에러 처리를 참고하세요.

Last updated on