@vircle/sdk-web 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -18
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ VircleCore를 확장하여 웹 환경에 특화된 기능을 제공하는 웹
|
|
|
23
23
|
|
|
24
24
|
### 세션 관리
|
|
25
25
|
- **세션 타임아웃**: 비활성 상태 감지 후 자동 세션 로테이션 (기본 30분)
|
|
26
|
-
- **fetch+keepalive**: 페이지 종료 시
|
|
26
|
+
- **fetch+keepalive**: 페이지 종료 시 `Authorization` 헤더 포함 이벤트 전송
|
|
27
27
|
|
|
28
28
|
### 보안 및 프라이버시
|
|
29
29
|
- **페이로드 암호화**: Web Crypto API 기반 하이브리드 암호화 (AES-256-GCM + RSA-OAEP)
|
|
@@ -162,7 +162,7 @@ await vircle.identify('user-123', {
|
|
|
162
162
|
│ • 자동 추적 (페이지뷰/클릭/폼/에러/SPA) │
|
|
163
163
|
│ • 웹 컨텍스트 수집 (WebContextCollector) │
|
|
164
164
|
│ • 세션 타임아웃 / 로테이션 │
|
|
165
|
-
│ •
|
|
165
|
+
│ • fetch+keepalive (페이지 이탈 보호) │
|
|
166
166
|
│ • StorageFactory (IndexedDB/LocalStorage) │
|
|
167
167
|
│ • 하이브리드 암호화 (WebExtendedCryptoAdapter)│
|
|
168
168
|
│ • 에러 클래스 (VircleWebError 계열) │
|
|
@@ -244,6 +244,22 @@ User-Agent 기반 디바이스/브라우저/OS 감지 및 화면 정보 수집
|
|
|
244
244
|
| `version` | `string \| undefined` | `<meta name="version">` | 앱 버전 |
|
|
245
245
|
| `environment` | `'development' \| 'production'` | `window.location.hostname` | localhost/staging → development, 그 외 → production |
|
|
246
246
|
|
|
247
|
+
#### campaign (CampaignContext)
|
|
248
|
+
|
|
249
|
+
URL의 UTM 파라미터 및 광고 클릭 ID를 수집합니다. `sessionStorage`에 저장하여 MPA 페이지 전환 간에도 유지됩니다.
|
|
250
|
+
|
|
251
|
+
| 필드 | 타입 | 조건 | 설명 |
|
|
252
|
+
|------|------|------|------|
|
|
253
|
+
| `source` | `string` | `utm_source` 존재 시 | 트래픽 소스 (예: `google`) |
|
|
254
|
+
| `medium` | `string` | `utm_medium` 존재 시 | 트래픽 매체 (예: `cpc`) |
|
|
255
|
+
| `campaign` | `string` | `utm_campaign` 존재 시 | 캠페인 이름 |
|
|
256
|
+
| `term` | `string` | `utm_term` 존재 시 | 검색 키워드 |
|
|
257
|
+
| `content` | `string` | `utm_content` 존재 시 | 광고 콘텐츠 구분 |
|
|
258
|
+
| `gclid` | `string` | `gclid` 존재 시 | Google Ads 클릭 ID |
|
|
259
|
+
| `fbclid` | `string` | `fbclid` 존재 시 | Facebook 클릭 ID |
|
|
260
|
+
| `msclkid` | `string` | `msclkid` 존재 시 | Microsoft Ads 클릭 ID |
|
|
261
|
+
| `ttclid` | `string` | `ttclid` 존재 시 | TikTok 클릭 ID |
|
|
262
|
+
|
|
247
263
|
#### custom (Record<string, unknown>)
|
|
248
264
|
|
|
249
265
|
추가 브라우저 환경 정보 (가용한 경우에만 수집)
|
|
@@ -251,7 +267,6 @@ User-Agent 기반 디바이스/브라우저/OS 감지 및 화면 정보 수집
|
|
|
251
267
|
| 필드 | 타입 | 조건 | 설명 |
|
|
252
268
|
|------|------|------|------|
|
|
253
269
|
| `referrer` | `string` | `document.referrer` 존재 시 | 이전 페이지 URL |
|
|
254
|
-
| `campaign` | `{ source, medium, campaign, term, content }` | URL에 `utm_*` 파라미터 존재 시 | UTM 캠페인 파라미터 (`utm_` 접두사 제거) |
|
|
255
270
|
| `cookieEnabled` | `boolean` | 항상 | 쿠키 활성화 여부 |
|
|
256
271
|
| `doNotTrack` | `boolean` | `navigator.doNotTrack` 존재 시 | DNT 설정 여부 |
|
|
257
272
|
| `connection` | `{ effectiveType, downlink, rtt, saveData }` | Network Information API 지원 시 | 네트워크 연결 정보 |
|
|
@@ -284,13 +299,13 @@ User-Agent 기반 디바이스/브라우저/OS 감지 및 화면 정보 수집
|
|
|
284
299
|
version: '2.1.0',
|
|
285
300
|
environment: 'production'
|
|
286
301
|
},
|
|
302
|
+
campaign: {
|
|
303
|
+
source: 'google',
|
|
304
|
+
medium: 'cpc',
|
|
305
|
+
campaign: 'summer_sale'
|
|
306
|
+
},
|
|
287
307
|
custom: {
|
|
288
308
|
referrer: 'https://google.com',
|
|
289
|
-
campaign: {
|
|
290
|
-
source: 'google',
|
|
291
|
-
medium: 'cpc',
|
|
292
|
-
campaign: 'summer_sale'
|
|
293
|
-
},
|
|
294
309
|
cookieEnabled: true,
|
|
295
310
|
doNotTrack: false,
|
|
296
311
|
connection: {
|
|
@@ -398,14 +413,14 @@ const vircle = new VircleWeb({
|
|
|
398
413
|
});
|
|
399
414
|
```
|
|
400
415
|
|
|
401
|
-
###
|
|
416
|
+
### fetch+keepalive (페이지 이탈 보호)
|
|
402
417
|
|
|
403
|
-
페이지 종료 시 `
|
|
418
|
+
페이지 종료 시 `fetch()` + `keepalive: true` 옵션을 사용하여 대기 중인 이벤트를 안전하게 전송합니다:
|
|
404
419
|
|
|
405
|
-
- **beforeunload**: 페이지 닫기/새로고침 시 큐의 이벤트를
|
|
406
|
-
- **visibilitychange → hidden**: 탭 전환/최소화 시
|
|
407
|
-
-
|
|
408
|
-
- **폴백**: `
|
|
420
|
+
- **beforeunload**: 페이지 닫기/새로고침 시 큐의 이벤트를 keepalive fetch로 전송
|
|
421
|
+
- **visibilitychange → hidden**: 탭 전환/최소화 시 keepalive fetch로 전송
|
|
422
|
+
- **장점**: `Authorization` 헤더를 포함할 수 있어 인증된 요청으로 전송 가능
|
|
423
|
+
- **폴백**: `keepalive` 미지원 환경에서는 자동으로 무시됩니다
|
|
409
424
|
|
|
410
425
|
```typescript
|
|
411
426
|
const vircle = new VircleWeb(
|
|
@@ -445,7 +460,7 @@ try {
|
|
|
445
460
|
- **컨텍스트 캐싱**: ContextCache를 통한 브라우저 정보 캐싱 (기본 5분), 중복 수집 방지를 위한 Promise 재사용
|
|
446
461
|
- **이벤트 배칭**: TransportService의 큐를 통한 네트워크 요청 최소화
|
|
447
462
|
- **메모리 관리**: cleanup 시 모든 이벤트 리스너 제거 및 History API 원복으로 누수 방지
|
|
448
|
-
- **페이지 이탈 대응**: `
|
|
463
|
+
- **페이지 이탈 대응**: `fetch()+keepalive`를 사용한 페이지 종료 시 안정적 이벤트 전송
|
|
449
464
|
- **큐 크기 제한**: TaskScheduler의 `maxQueueSize`(기본 1000)로 메모리 오버플로우 방지
|
|
450
465
|
|
|
451
466
|
### 추적 제외
|
|
@@ -502,7 +517,7 @@ interface VircleWebConfig extends VircleConfig {
|
|
|
502
517
|
|
|
503
518
|
```typescript
|
|
504
519
|
interface VircleWebOptions extends Partial<VircleCoreOptions> {
|
|
505
|
-
flushOnUnload?: boolean; // 페이지 언로드 시
|
|
520
|
+
flushOnUnload?: boolean; // 페이지 언로드 시 fetch+keepalive 전송 (기본: true)
|
|
506
521
|
contextCacheTime?: number; // 컨텍스트 캐시 시간(ms) (기본: 300000 = 5분)
|
|
507
522
|
}
|
|
508
523
|
```
|
|
@@ -678,7 +693,7 @@ import type {
|
|
|
678
693
|
|
|
679
694
|
4. **암호화**: `enableEncryption: true` 설정 시 서버 공개키로 이벤트 페이로드를 암호화합니다. 공개키는 CDN(`RemoteConfigService`)에서 자동 fetch됩니다.
|
|
680
695
|
|
|
681
|
-
5.
|
|
696
|
+
5. **페이지 이탈 전송**: 페이지 종료 시 `fetch()+keepalive`로 전송되며, `Authorization` 헤더를 포함한 인증된 요청으로 전송됩니다. 정상 동작과 동일한 `fetch()` 기반 전송을 사용합니다.
|
|
682
697
|
|
|
683
698
|
## 성능 영향
|
|
684
699
|
|
|
@@ -762,7 +777,7 @@ const vircle = new VircleWeb(
|
|
|
762
777
|
},
|
|
763
778
|
{
|
|
764
779
|
contextCacheTime: 600000, // 10분 캐싱 (기본 5분)
|
|
765
|
-
flushOnUnload: true, //
|
|
780
|
+
flushOnUnload: true, // fetch+keepalive로 페이지 이탈 시 자동 전송 (기본값)
|
|
766
781
|
},
|
|
767
782
|
);
|
|
768
783
|
|