브라우저 SDK (sdk-web)
브라우저에서 회원가입·리드·커스텀 전환 이벤트를 전송하는 @edgelinkapp/sdk-web 사용법
@edgelinkapp/sdk-web은 고객 사이트의 브라우저에서 회원가입·리드·커스텀 이벤트를 Edgelink로 전송하는 5KB(gzip) 미만의 경량 SDK입니다.
설치
CDN 스크립트 태그가 표준 설치 방식입니다. 별도 npm 설치는 필요하지 않습니다.
<script
async
src="https://cdn.edgelink.me/sdk/v1/edgelink.iife.js"
data-publishable-key="pk_live_xxxxxxxxxxxx"
></script>
data-publishable-key 속성에 발급받은 publishable 키(pk_live_* 또는 pk_test_*)를 넣습니다. live와 test를 분리해 발급받아 스테이징·프로덕션에서 각각 사용하세요.
주요 동작
스크립트가 로드되면 SDK는 자동으로 다음 작업을 수행합니다:
- URL의
?el_cid=파라미터를 감지하여_el_cid쿠키에 저장 (90일,SameSite=Lax) - GPC/DNT 신호 감지. 신호가 있으면 모든 이벤트를 no-op 처리
window.edgelink함수 노출. 스니펫보다 먼저 호출된 큐(stub)는 자동 drain
이벤트 전송
회원가입 추적
<script>
edgelink('track', 'signup', {
externalUserId: 'user-1234',
customerEmailHash: 'hashed-email-or-null',
})
</script>
| 필드 | 타입 | 설명 |
|---|---|---|
| 이벤트명 | string | 자유 식별자. 예: signup, subscribe |
externalUserId | string? | 고객사 측 user ID. 후속 이벤트와 동일 사용자 매칭에 사용 |
customerEmailHash | string? | 이메일 SHA-256 해시(lowercase). 평문 금지 |
externalEventId | string? | 멱등키. 동일 키 재전송 시 중복 저장 안 됨 |
커스텀 이벤트
<script>
edgelink('track', 'video-completed', { videoId: 'intro-2026' })
</script>
metadata는 자동 분리되어 저장됩니다. 8KB를 초과하면 거부됩니다.
사용자 식별 (identify)
회원가입 직후 클릭과 사용자를 묶어 두면, 사용자가 다른 기기로 로그인해도 매칭이 유지됩니다(후속 spec).
<script>
edgelink('identify', 'user-1234', { plan: 'pro' })
</script>
에러 처리
SDK는 4xx 응답을 즉시 폐기하고 console에 경고만 표시합니다. 5xx·network 에러는 localStorage 큐로 백오프 재시도합니다(최대 24시간).
| 응답 | 동작 |
|---|---|
| 200 | 정상 처리 |
| 400 INVALID_PAYLOAD | 즉시 폐기 + console.warn |
| 401 INVALID_KEY | 즉시 폐기 + console.error |
| 401 ORIGIN_NOT_ALLOWED | 즉시 폐기 + console.error (allowedOrigins 점검 필요) |
| 403 CONVERSION_TRACKING_NOT_ENABLED | 즉시 폐기 + console.error (Pro 플랜 활성 필요) |
| 410 CLICK_EXPIRED | 즉시 폐기 |
| 429 RATE_LIMITED | Retry-After 헤더 존중하여 재큐잉 |
| 5xx | 지수 백오프 재시도 |
허용 Origin 설정
publishable 키 발급 시 허용 Origin 목록을 설정합니다. Origin 헤더가 일치하지 않으면 ORIGIN_NOT_ALLOWED 에러로 거부됩니다.
https://myshop.com
https://*.myshop.com (단일 서브도메인)
- live 모드 키는 허용 Origin을 1개 이상 등록해야 발급되고, 허용 Origin이 비어 있는 live 키의 요청은 거부됩니다. 키가 노출되더라도 등록하지 않은 사이트에서는 이벤트를 보낼 수 없습니다.
*,https://*.com, 스킴이 없는 값(myshop.com), 경로가 붙은 값(https://myshop.com/shop)은 등록할 수 없습니다.localhost/127.0.0.1/*.local은 test 모드 키에서 자동 허용되므로, test 모드 키는 허용 Origin을 비워 둘 수 있습니다.
다음 단계
자주 묻는 질문
sdk-web으로 sale(매출) 이벤트도 보낼 수 있나요?
보낼 수 없습니다. publishable 키 + 브라우저 환경에서는 매출 위변조 우려가 있어 `sale` 이벤트가 거부됩니다(`SALE_REQUIRES_SECRET_KEY`). 매출은 서버에서 sdk-node로 전송하세요.
광고 차단기를 사용하는 사용자도 이벤트가 전송되나요?
주요 차단기에서 `/api/v1/track` 엔드포인트가 차단될 수 있습니다. SDK는 `sendBeacon` → `fetch keepalive` → `localStorage` 큐 백오프 순으로 폴백하지만, 차단되면 결국 도달하지 않을 수 있습니다.
GPC/DNT 신호가 있는 사용자도 추적되나요?
추적되지 않습니다. SDK는 Sec-GPC=1 또는 navigator.doNotTrack=1 신호를 감지하면 모든 이벤트를 no-op 처리합니다. PIPA·GDPR 컴플라이언스를 위한 기본값입니다.
쿠키 없이도 사용할 수 있나요?
사용할 수 있지만 권장하지 않습니다. _el_cid 쿠키 없이 호출 시 `externalUserId`를 명시적으로 전달해야 하며, 매칭률이 크게 떨어집니다.