SecureKey API 연동에 필요한 상세 가이드입니다.
Webhook 콜백
인증 완료 시 고객 서버로 HTTP POST 콜백을 자동 전송합니다.
API Key 생성 시 webhookUrl을 지정하면
HMAC 서명용 webhookSecret이 자동 생성됩니다.
이벤트 타입
| event |
channel |
설명 |
verification.completed |
sms |
SMS OTP 검증 성공 |
verification.completed |
email |
Email OTP 검증 성공 |
verification.completed |
totp |
TOTP 코드 검증 성공 (백업 코드 포함) |
verification.completed |
webauthn |
패스키 인증 성공 |
push.responded |
push |
Push 인증 승인 또는 거부 |
콜백 페이로드
POST (고객 서버로 전송)
{
"event": "verification.completed",
"channel": "sms",
"data": {
"requestId": "cuid...",
"externalUserId": "user_123",
"phone": "01012345678",
"purpose": "login"
},
"timestamp": "2026-03-24T12:00:00+09:00"
}
HMAC 서명 검증
모든 webhook 요청에 X-SecureKey-Signature 헤더가 포함됩니다.
반드시 서명을 검증한 후 처리하세요.
서명 검증Node.js
const crypto = require('crypto');
function verifySignature(body, signature, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(JSON.stringify(body))
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature), Buffer.from(expected)
);
}
// Express 미들웨어 예시
app.post('/webhook/securekey', (req, res) => {
const sig = req.headers['x-securekey-signature'];
if (!verifySignature(req.body, sig, WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
// 인증 완료 처리
const { event, channel, data } = req.body;
console.log(`${channel} 인증 완료: ${data.externalUserId}`);
res.sendStatus(200);
});
서명 검증Python
import hmac, hashlib, json
def verify_signature(body: dict, signature: str, secret: str) -> bool:
expected = 'sha256=' + hmac.new(
secret.encode(), json.dumps(body).encode(), hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
전송 정책
타임아웃
5초 (초과 시 전송 포기)
재시도
없음 (fire-and-forget, 실패 시 서버 로그에만 기록)
권장
Webhook은 보조 알림 용도로 활용하고, 핵심 검증 결과는 API 응답 또는 폴링으로 확인하세요.
MFA 정책 엔진
조직별 MFA 정책을 정의하여 인증 요청에 대한 추가 요구사항, 차단, 강제 채널 등을 설정합니다.
인증 검증 요청 시 해당 조직의 정책을 우선순위 순으로 평가하고, 조건이 매칭되면 정의된 액션을 실행합니다.
조건 (conditions)
| 필드 |
타입 |
설명 |
channel |
string | array |
인증 채널 (sms, email, totp, webauthn, push) |
purpose |
string | array |
인증 목적 (login, payment 등) |
ip_ranges |
array |
CIDR 형식 IP 대역 (예: "10.0.0.0/8") |
time_range |
object |
{ "start": "HH:MM", "end": "HH:MM" } — 자정 넘김 지원 |
user_pattern |
string |
사용자 ID 와일드카드 패턴 (예: admin_*) |
모든 조건은 AND로 결합됩니다. 빈 조건은 모든 요청에 매칭됩니다.
액션 (actions)
| type |
추가 필드 |
설명 |
require_additional |
channels: [...] |
추가 채널 인증 완료 필요 (10분 이내) |
block |
message: "..." |
요청 즉시 차단 (403) |
step_up |
channel: "..." |
특정 채널 인증 완료 필요 (10분 이내) |
allow |
— |
명시적 허용 (이후 정책 무시) |
정책 생성 예시
예시 1: 결제 시 TOTP 추가 요구
curl -X POST https://securekey.ideacode.co.kr/api/v1/mfa-policies \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "결제 시 추가 인증",
"organizationId": "org_123",
"conditions": { "channel": "sms", "purpose": "payment" },
"actions": { "type": "require_additional", "channels": ["totp"] },
"priority": 10
}'
예시 2: 야간 시간대 인증 차단
curl -X POST https://securekey.ideacode.co.kr/api/v1/mfa-policies \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "야간 차단",
"organizationId": "org_123",
"conditions": { "time_range": { "start": "00:00", "end": "06:00" } },
"actions": { "type": "block", "message": "야간 시간대에는 인증이 불가합니다." },
"priority": 1
}'
예시 3: 관리자 계정 Passkey 강제
curl -X POST https://securekey.ideacode.co.kr/api/v1/mfa-policies \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "관리자 Passkey 강제",
"organizationId": "org_123",
"conditions": { "user_pattern": "admin_*" },
"actions": { "type": "step_up", "channel": "webauthn" },
"priority": 5
}'
정책 테스트 (Dry Run)
실제 차단 없이 정책 평가 결과를 미리 확인할 수 있습니다.
정책 평가 API
curl -X POST https://securekey.ideacode.co.kr/api/v1/mfa-policies/evaluate \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"organizationId": "org_123",
"channel": "sms",
"purpose": "payment",
"externalUserId": "user_456"
}'
클라이언트 측 처리
정책에 의해 추가 인증이 필요한 경우, API가 다음과 같은 응답을 반환합니다.
MFA_REQUIRED 응답
{
"success": false,
"error": "추가 인증이 필요합니다.",
"code": "MFA_REQUIRED",
"requiredChannels": ["totp"],
"matchedPolicies": ["결제 시 추가 인증"]
}
requiredChannels에 명시된 채널로 인증을 완료한 후,
원래 요청을 재시도하면 정상 처리됩니다.
추가 인증의 유효 시간은 10분입니다.