Node SDK (sdk-node)
서버에서 매출(sale) 등 위변조 우려가 있는 전환 이벤트를 안전하게 전송하는 @edgelink/sdk-node 사용법
Node SDK (@edgelink/sdk-node)
@edgelink/sdk-node는 서버에서 매출(sale) 같이 위변조 우려가 있는 전환 이벤트를 secret 키로 안전하게 전송하는 SDK입니다.
참고: 본 SDK는 monorepo workspace 내부 의존성으로 제공됩니다. 외부 npm 배포(
@edgelinkorg)는 별도 작업으로 진행 예정이며, 그 전까지는 본 문서의 코드 예시를 참고해 직접 HTTP 호출하거나 npm 배포 공지를 기다려 주세요.
설치 (npm 배포 후)
npm install @edgelink/sdk-node
npm 배포 전에는 본 문서의 API 레퍼런스를 참고하여 직접 HTTP 요청을 보내세요.
빠른 시작
import { Edgelink } from '@edgelink/sdk-node'
const edgelink = new Edgelink({
secretKey: process.env.EDGELINK_SECRET_KEY!,
})
// 결제 완료 webhook
app.post('/api/checkout/success', async (req, res) => {
await edgelink.conversions.create({
clickId: req.cookies._el_cid,
eventType: 'sale',
eventName: 'purchase',
externalEventId: order.id,
valueMinor: order.totalAmountKrw,
currency: 'KRW',
customerEmailHash: Edgelink.hashEmail(user.email),
})
res.json({ ok: true })
})
핵심 정책
| 정책 | 동작 |
|---|---|
secretKey 자동 픽업 안 함 | 실수로 미설정 시 silent 동작을 막기 위해 명시적 주입을 강제합니다 |
clickId XOR externalUserId | 둘 중 하나 이상 반드시 전달. 타입 시그니처가 컴파일 타임에 강제 |
valueMinor 정수 강제 | 최소 통화 단위 정수(KRW=원, USD=cents). Float 금지로 부동소수점 오차 차단 |
| 5xx/429 자동 재시도 | 지수 백오프 최대 3회. Retry-After 헤더 존중 |
| 4xx 즉시 throw | 페이로드 오류는 재시도해도 실패하므로 즉시 전파 |
| Edge runtime 호환 | native fetch만 사용 — Cloudflare Workers / Vercel Edge / Bun / Deno에서 동작 |
이벤트 타입별 사용 예시
1) 매출 (sale)
await edgelink.conversions.create({
clickId: orderRecord.clickId, // DB에 저장해 둔 click ID
eventType: 'sale',
eventName: 'purchase',
externalEventId: orderRecord.id, // 멱등키
valueMinor: orderRecord.totalAmountKrw,
currency: 'KRW',
})
2) 리드 — 서버 사이드 회원가입
브라우저가 아닌 서버에서 직접 회원가입을 처리하는 경우(예: B2B API):
await edgelink.conversions.create({
externalUserId: newUser.id,
eventType: 'lead',
eventName: 'signup',
customerEmailHash: Edgelink.hashEmail(newUser.email),
})
3) 멱등 재시도
같은 externalEventId로 재전송하면 200 + 기존 eventId가 반환되어 중복 저장되지 않습니다. 결제 webhook이 중복 도달하는 상황을 안전하게 처리할 수 있습니다.
에러 처리
SDK는 HTTP 상태에 따라 다음 에러 클래스를 throw 합니다:
import {
EdgelinkAuthError,
EdgelinkValidationError,
EdgelinkRateLimitError,
EdgelinkServerError,
} from '@edgelink/sdk-node'
try {
await edgelink.conversions.create({...})
} catch (error) {
if (error instanceof EdgelinkValidationError) {
// 페이로드 오류 — 코드 수정 필요
logger.error('Invalid payload', error.code, error.message)
} else if (error instanceof EdgelinkRateLimitError) {
// 큐에 다시 넣기. error.retryAfter 초 후 재시도
} else if (error instanceof EdgelinkServerError) {
// 5xx — 알림 후 모니터링
}
}
| 에러 | HTTP | 의미 |
|---|---|---|
EdgelinkAuthError | 401 / 403 | 키 누락·만료·회수·Origin 불일치 |
EdgelinkValidationError | 400 / 404 / 410 | 페이로드 위반, click 미존재·만료 |
EdgelinkRateLimitError | 429 | retryAfter 초 정보 포함 |
EdgelinkServerError | 5xx | 서버 일시 장애 |
이메일 해싱 헬퍼
PII 보호를 위해 평문 이메일 대신 SHA-256 해시(lowercase)를 전송합니다.
const hash = Edgelink.hashEmail('User@Example.COM')
// → 'b4c9a289323b21a01c3e940f150eb9b8c542587f1abfd8f0e1cc1ffc5e475857'
다음 단계
- 브라우저 SDK 가이드
- API 레퍼런스 — 직접 HTTP 호출