connectbase-client 5.9.0 → 5.11.0

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/CHANGELOG.md CHANGED
@@ -3,6 +3,105 @@
3
3
  본 SDK 의 모든 주요 변경사항을 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/) 형식으로 기록합니다.
4
4
  버전은 [Semantic Versioning](https://semver.org/lang/ko/) 을 따릅니다.
5
5
 
6
+ ## [5.11.0] - 2026-08-05
7
+
8
+ ### Performance — 한국에서 SDK 호출이 585ms → 45ms
9
+
10
+ Cloudflare 가 `connectbase.world` 를 한국 사용자에게 **LAX(로스앤젤레스)** 엣지로 서빙합니다.
11
+ 존이 Free 플랜이라서인데, 서울(ICN) 엣지는 사실상 Enterprise 전용이고 Pro/Business 로 올려도
12
+ 열리지 않습니다. 오리진(춘천)도 사용자도 한국인데 **모든 SDK 호출이 태평양을 두 번 건너
13
+ 141ms 를 고정으로 물고 있었습니다.** 업로드가 있는 요청은 TCP slow-start 가 그 왕복 지연
14
+ 위에 곱해져 훨씬 커집니다.
15
+
16
+ 이 버전부터 SDK 는 서버가 알려주는 저지연 원본(`api-direct.connectbase.world`)으로 데이터
17
+ 평면 요청을 자동으로 옮깁니다. **설정할 것도, 코드를 고칠 것도 없습니다.**
18
+
19
+ 실측 (서울, 같은 요청 · 2026-08-05):
20
+
21
+ | | 기존 (CF LAX) | 5.11.0 (직결) |
22
+ |---|---|---|
23
+ | TCP connect | 137ms | **13ms** |
24
+ | TLS handshake | 283ms | **31ms** |
25
+ | `GET /v1/public/auth-settings` TTFB | 585ms | **45ms** |
26
+ | 187KB POST 왕복 | 1.24–1.74s | **0.13s** |
27
+
28
+ 음성 인식처럼 오디오를 올리는 흐름은 회당 1초 이상 줄어듭니다.
29
+
30
+ **어떻게 동작하나.** Cloudflare 엣지는 요청이 어느 나라에서 왔는지 이미 알고 있습니다.
31
+ 서버가 한국 사용자의 응답에만 `X-CB-Direct-Base` 헤더를 실어 보내고, SDK 가 그걸 보고
32
+ 이후 요청을 옮깁니다. 다른 나라 사용자에게는 광고하지 않습니다 — 그들에게는 가까운
33
+ Cloudflare 엣지가 춘천 오리진보다 훨씬 가깝기 때문입니다. 별도 프로브 요청이 없어
34
+ 왕복 낭비도 없습니다.
35
+
36
+ **세션은 그대로입니다.** 로그인·가입·로그아웃·OAuth·회원 탈퇴처럼 세션 쿠키를 주고받는
37
+ 요청은 옮기지 않습니다. 멤버 refresh 쿠키가 host-only 라 호스트가 갈리면 세션이 끊기기
38
+ 때문입니다. 옮기는 것은 `X-Public-Key` 로만 인증하는 데이터 평면(DB CRUD, 스토리지, AI
39
+ 스트리밍, 함수 호출, 내 정보 조회 등)뿐입니다.
40
+
41
+ **안 되는 환경에서도 안전합니다.** 직결 호스트로 가는 요청이 네트워크 레벨에서 실패하면
42
+ (CSP `connect-src` 를 좁게 잡은 앱, 사내 프록시, DNS 미전파 등) **같은 요청을 즉시 원래
43
+ 원본으로 재시도**하고 그 세션에서는 다시 시도하지 않습니다. 호출자가 취소(AbortController)
44
+ 하거나 타임아웃 난 요청은 재시도하지 않습니다.
45
+
46
+ > **CSP 를 쓰신다면** `connect-src` 에 `https://api-direct.connectbase.world` 를 추가하면
47
+ > 첫 실패 왕복 한 번도 없앨 수 있습니다. 추가하지 않아도 동작에는 문제가 없습니다.
48
+
49
+ 플랫폼 이슈 `019fcc2d`.
50
+
51
+ ## [5.10.0] - 2026-08-05
52
+
53
+ ### Added — 회원 탈퇴(멤버 삭제)를 SDK 로 열었습니다
54
+
55
+ 멤버 삭제가 **콘솔 User 토큰 전용**이라 앱에서도, 서버 함수에서도 탈퇴를 구현할 방법이
56
+ 없었습니다. `DELETE /v1/apps/:appID/app-members/:memberID` 는 `cb_sk_` 로 부르면 401 이었고,
57
+ SDK 의 auth 모듈에는 삭제 계열 메서드가 아예 없었습니다(`adminUpdateMember` 다음이 바로
58
+ `signOut`). 앱이 할 수 있는 최선은 자체 테이블만 지우는 것이었고, 멤버 레코드는 남아 같은
59
+ 소셜 계정으로 다시 로그인하면 **같은 member_id 로 되살아났습니다** — 이용자에게는
60
+ "탈퇴했는데 계정이 남아 있다"로 보였습니다.
61
+
62
+ 이건 편의 문제가 아니라 배포 차단이었습니다. App Store 가이드라인 **5.1.1(v)** 는 앱에서
63
+ 가입이 되면 앱 안에서 탈퇴도 가능할 것을 요구하고 고객센터 안내로는 통과되지 않습니다.
64
+ ConnectBase 로 만든 앱은 이 상태로 iOS 심사를 통과할 수 없었습니다.
65
+
66
+ ```typescript
67
+ // 1) 앱 안의 "회원 탈퇴" 버튼 — 브라우저에서 그대로 (멤버 JWT)
68
+ if (confirm('탈퇴하면 되돌릴 수 없습니다. 계속할까요?')) {
69
+ await cb.auth.deleteMyAccount() // 토큰 정리까지 함께 됩니다
70
+ location.href = '/'
71
+ }
72
+
73
+ // 2) 서버/백엔드에서 관리자가 대신 (cb_sk_ + app_member:write)
74
+ const cbAdmin = new ConnectBase({ publicKey: 'cb_pk_...', secretKey: 'cb_sk_...' })
75
+ await cbAdmin.auth.adminDeleteMember(memberId)
76
+
77
+ // 3) 함수 안에서 — 개인정보 삭제 요청 자동화
78
+ // management_scopes: ["app_member:read", "app_member:write"]
79
+ await ctx.cbAdmin.database.delete('posts', { author_id: memberId })
80
+ await ctx.cbAdmin.appMembers.remove(ctx.appId, memberId)
81
+ ```
82
+
83
+ - `auth.deleteMyAccount()` — 로그인한 본인이 스스로 탈퇴. `cb_pk_` 만 있으면 되므로
84
+ 브라우저에서 호출합니다. 성공/실패와 무관하게 로컬 토큰을 정리하므로 `signOut()` 을
85
+ 따로 부를 필요가 없습니다.
86
+ - `auth.adminDeleteMember(memberId)` — `adminUpdateMember` 와 같은 권한 컨텍스트
87
+ (`cb_pk_` + `cb_sk_`, 그 사용자에게 `app_member:write` 권한). secretKey 없이 부르면
88
+ 네트워크를 타기 전에 던집니다.
89
+ - `appMembers.remove(appId, memberId)` — service_role 함수용. 새 management scope
90
+ `app_member:write` 를 opt-in 해야 합니다. 조회용으로 받은 `app_member:read` 로는
91
+ 삭제되지 않고, 반대로 `app_member:write` 만으로 이메일을 읽을 수도 없습니다.
92
+
93
+ **세 경로 모두 되돌릴 수 없고, 로그인 수단(identities)까지 지웁니다** — 그래서 같은 소셜
94
+ 계정으로 재가입하면 새 `member_id` 를 받습니다. refresh token(세션)·결제·구독·빌링키·
95
+ 푸시 디바이스·웹 방문 기록도 함께 사라집니다. 앱이 `cb.database` 에 만든 자체 테이블
96
+ 데이터는 지우지 않으니 `service_role` 로 직접 정리하세요.
97
+
98
+ 이미 발급된 access token 은 만료(최대 1시간)까지 서명이 유효합니다. 즉시 차단이 필요하면
99
+ 삭제 전에 정지를 함께 쓰세요. 확인 UI 는 앱이 책임집니다 — 서버는 확인 없이 즉시 삭제합니다.
100
+
101
+ 멤버 생성/정지/수정은 여전히 콘솔 전용입니다.
102
+
103
+ 플랫폼 이슈 `019fd042`. 서버 측 라우트 개방이 함께 배포됩니다.
104
+
6
105
  ## [5.9.0] - 2026-08-02
7
106
 
8
107
  ### Fixed — `_redirects` / `_headers` 가 배포되지 않던 것