마찰 없는 온‑램프 with zkLogin
지갑 마찰을 없애고, 사용자를 지속시키며, 성장 가능성을 예측하는 방법
Web3 앱이 최신 Web2 서비스와 같은 원활한 회원가입 흐름을 제공한다면 어떨까요? 이것이 바로 zkLogin이 Sui 블록체인에서 제공하는 핵심 약속입니다. zkLogin은 Sui용 OAuth와 같은 역할을 하며, 사용자가 Google, Apple, X 등 익숙한 계정으로 로그인할 수 있게 해줍니다. 이후 영지식 증명이 해당 Web2 신원을 온체인 Sui 주소와 안전하게 연결합니다 — 지갑 팝업도, 시드 구문도, 사용자 이탈도 없습니다.
그 효과는 실질적이고 즉각적입니다. 이미 수십만 개의 zkLogin 계정이 활성화된 상황에서, 사례 연구에 따르면 전통적인 지갑 장벽을 제거한 후 사용자 전환율이 **17%에서 42%**로 크게 상승했습니다. 이제 작동 원리와 프로젝트에 가져다줄 수 있는 혜택을 살펴보겠습니다.
왜 지갑이 첫 번째 전환을 방해하는가
혁신적인 dApp을 만들었지만 사용자 확보 퍼널이 새는 경우가 많습니다. 그 원인은 거의 항상 “Connect Wallet” 버튼입니다. 표준 Web3 온보딩은 확장 프로그램 설치, 시드 구문 경고, 암호화 용어 퀴즈 등 복잡한 미로와 같습니다.
신규 사용자는 큰 장벽에 직면합니다. UX 연구자들은 지갑 프롬프트가 나타나는 순간 **87%**가 이탈한다는 충격적인 수치를 발견했습니다. 한 실험에서는 해당 프롬프트를 결제 과정의 후반부로 옮기기만 해도 완료율이 **94%**로 급상승했습니다. 암호화에 호기심이 있는 사용자조차도 “잘못된 버튼을 누르면 자금이 사라질까 봐”라는 두려움을 가지고 있습니다. 이 단일하고 위협적인 단계를 제거하는 것이 기하급수적 성장을 여는 열쇠입니다.
zkLogin 작동 방식 (쉽게 설명)
zkLogin은 모든 인터넷 사용자가 이미 신뢰하는 기술을 활용해 지갑 문제를 우아하게 회피합니다. 몇 가지 간단한 단계로 마법이 이루어집니다:
- 임시 키 페어: 사용자가 로그인하려면 브라우저에서 일시적인 단일 세션 키 페어가 로컬에서 생성됩니다. 이는 이번 세션에만 유효한 임시 패스키와 같습니다.
- OAuth 흐름: 사용자는 Google, Apple 등 소셜 계정으로 로그인합니다. 앱은 이 로그인 요청에 고유값(nonce)을 삽입합니다.
- ZKP 서비스: 로그인 성공 후, ZKP(Zero‑Knowledge Proof) 서비스가 암호학적 증명을 생성합니다. 이 증명은 “이 OAuth 토큰이 임시 패스키 소유자를 인증한다”는 것을 온체인에 공개하지 않고 확인합니다.
- 주소 파생: OAuth 제공자의 JWT(JSON Web Token)와 고유 salt를 결합해 영구적인 Sui 주소를 결정적으로 생성합니다. salt는 클라이언트 측이나 안전한 백엔드에 비공개로 보관됩니다.
- 트랜잭션 제출: 앱은 임시 키로 트랜잭션에 서명하고 ZK 증명을 첨부합니다. Sui 검증자는 온체인에서 증명을 검증해 전통적인 지갑 없이도 트랜잭션의 정당성을 확인합니다.
단계별 통합 가이드
구현 준비가 되셨나요? TypeScript SDK를 활용한 빠른 가이드를 소개합니다. Rust나 Python에서도 원리는 동일합니다.
1. SDK 설치
@mysten/sui
패키지에 필요한 모든 zklogin
헬퍼가 포함되어 있습니다.
pnpm add @mysten/sui
2. 키와 Nonce 생성
먼저 임시 키페어와 현재 Sui 네트워크 epoch에 연결된 nonce를 생성합니다.
const keypair = new Ed25519Keypair();
const { epoch } = await suiClient.getLatestSuiSystemState();
const nonce = generateNonce(keypair.getPublicKey(), Number(epoch) + 2, generateRandomness());
3. OAuth 리다이렉트
사용 중인 제공자(예: Google, Facebook, Apple)에 맞는 OAuth 로그인 URL을 구성하고 사용자를 리다이렉트합니다.
4. JWT 디코드 및 사용자 Salt 조회
사용자가 로그인하고 돌아오면 URL에서 id_token
을 가져옵니다. 이를 이용해 백엔드에서 사용자 전용 salt를 조회한 뒤 Sui 주소를 파생합니다.
const jwt = new URLSearchParams(window.location.search).get('id_token')!;
const salt = await fetch('/api/salt?jwt=' + jwt).then(r => r.text());
const address = jwtToAddress(jwt, salt);
5. ZK 증명 요청
JWT를 증명 서비스에 보내 ZK 증명을 받습니다. 개발 단계에서는 Mysten의 퍼블릭 prover를 사용할 수 있습니다. 프로덕션에서는 자체 호스팅하거나 Enoki와 같은 서비스를 이용하세요.
const proof = await fetch('/api/prove', {
method:'POST',
body: JSON.stringify({ jwt, ... })
}).then(r => r.json());
6. 서명 및 전송
이제 트랜잭션을 구성하고, 발신자를 사용자의 zkLogin 주소로 설정한 뒤 실행합니다. SDK가 zkLoginInputs
(증명)를 자동으로 첨부합니다. ✨
const tx = new TransactionBlock();
tx.moveCall({ target:'0x2::example::touch_grass' }); // 任意的 Move 调用
tx.setSender(address);
tx.setGasBudget(5_000_000);
await suiClient.signAndExecuteTransactionBlock({
transactionBlock: tx,
zkLoginInputs: proof // 여기서 마법이 일어납니다
});
7. 세션 유지
보다 부드러운 사용자 경험을 위해 키페어와 salt를 IndexedDB 또는 로컬 스토리지에 암호화하여 저장합니다. 보안을 강화하려면 몇 epoch마다 회전시키는 것을 잊지 마세요.
KPI 예측 템플릿
zkLogin이 가져오는 차이는 정성적인 것이 아니라 정량적인 것입니다. 일반 온보딩 퍼널과 zkLogin 적용 퍼널을 비교해 보세요:
퍼널 단계 | 지갑 팝업 사용 시 일반 | zkLogin 사용 시 | 차이 |
---|---|---|---|
Landing → Sign-in | 100 % | 100 % | – |
Sign-in → Wallet Ready | 15 % (설치, 시드 구문) | 55 % (소셜 로그인) | +40 pp |
Wallet Ready → First Tx | \ 23 % | \ 90 % | +67 pp |
전체 Tx 전환율 | \ 3 % | ≈ 25‑40 % | \ 8‑13× |
👉 의미: 10,000명의 고유 방문자를 유도하는 캠페인이라면, 첫날 온체인 행동이 300건에서 2,500건 이상으로 증가합니다.
모범 사례 & 주의점
보다 매끄러운 경험을 위해 다음 팁을 기억하세요:
- 스폰서드 트랜잭션 사용: 사용자의 첫 몇 번 트랜잭션 수수료를 여러분이 부담하세요. 모든 마찰이 사라지고 강력한 “아하” 순간을 제공할 수 있습니다.
- Salt 관리에 신중: 사용자의 salt를 변경하면 새로운 주소가 생성됩니다. 복구 경로를 확실히 제어할 수 있을 때만 수행하세요.
- Sui 주소 노출: 가입 후 사용자의 온체인 주소를 보여 주세요. 이는 고급 사용자가 원한다면 전통적인 지갑으로 가져갈 수 있게 합니다.
- 리프레시 루프 방지: JWT와 임시 키페어를 만료될 때까지 캐시해 두어 반복 로그인 요청을 피하세요.
- Prover 지연 모니터링: 증명 생성 라운드 트립 시간이 2초를 초과하면 지역 프로버를 호스팅해 응답성을 유지하세요.
BlockEden.xyz가 제공하는 가치
zkLogin이 사용자 경험을 완성한다면, 이를 확장하는 과정에서 새로운 백엔드 과제가 등장합니다. 여기서 BlockEden.xyz가 역할을 합니다.
- API 레이어: 고처리량, 지리적 라우팅이 적용된 RPC 노드가 사용자 위치와 무관하게 zkLogin 트랜잭션을 최소 지연으로 처리합니다.
- 관찰 가능성: 증명 지연, 성공/실패 비율, 전환 퍼널 건강 지표 등을 한눈에 볼 수 있는 대시보드를 제공합니다.
- 컴플라이언스: fiat 연동 앱을 위해 선택 가능한 KYC 모듈이 있어, 검증된 사용자 신원에서 직접 온‑램프를 구현할 수 있습니다.
바로 배포할 준비가 되셨나요?
거추장스럽고 위협적인 지갑 흐름은 이제 끝났습니다. zkLogin 샌드박스를 띄우고 BlockEden의 풀노드 엔드포인트를 연결하면, 사용자는 “지갑”이라는 단어조차 듣지 못한 채 가입 그래프가 상승하는 모습을 확인할 수 있습니다. 😉