1. 들어가며
DApp을 개발하다 보면 한 번쯤은 겪는 문제가 있습니다. 사용자가 "지갑이 연결이 안 돼요"라고 하는데, 알고 보니 MetaMask와 Coinbase Wallet을 동시에 설치해서 생긴 문제더군요. 저도 처음에는 "하나만 켜놓으세요"라고 안내했지만, 이게 정말 좋은 사용자 경험일까 고민이 되었습니다.
실제로 Web3 사용자의 상당수가 용도에 따라 여러 지갑을 사용합니다. NFT는 MetaMask, DeFi는 Coinbase Wallet, 게임은 Phantom 이런 식으로요. 그런데 브라우저에서 이 지갑들이 서로 충돌하면서 원하는 지갑으로 연결되지 않는 문제가 발생했습니다.
EIP-6963는 바로 이 문제를 해결하기 위해 등장한 표준입니다. 2023년 10월에 승인되어 2025년 2월에 정식 Final 상태가 되었고, 현재는 대부분의 주요 지갑이 지원하고 있습니다.
2. 기존 방식의 문제점
window.ethereum의 한계
기존에는 모든 지갑 확장 프로그램이 window.ethereum이라는 단일 객체에 자신의 provider를 주입하는 방식을 사용했습니다. 이게 어떤 문제를 일으키는지 실제 상황으로 설명해보겠습니다.
사용자가 MetaMask와 Coinbase Wallet을 모두 설치했다고 가정해봅시다. 브라우저가 페이지를 로드할 때:
- MetaMask 확장 프로그램이 먼저 로드되어
window.ethereum에 자신의 provider를 주입 - 그다음 Coinbase Wallet이 로드되어
window.ethereum을 덮어씀 - 결과적으로 사용자는 Coinbase Wallet만 사용할 수 있음
문제는 이 로딩 순서가 완전히 예측 불가능하다는 점입니다. 브라우저 확장 프로그램의 로드 순서는 매번 달라질 수 있고, 사용자가 제어할 수도 없습니다. 이를 race condition(경쟁 상태)이라고 부릅니다.
실제로 겪었던 이슈
제가 DeFi 거래 플랫폼을 개발할 때 이 문제로 고객 문의가 정말 많이 들어왔습니다.
해결책으로 각 지갑이 자신만의 네임스페이스를 주입하는 방식(예: window.coinbaseWallet, window.phantom)도 있었지만, 이것도 문제가 있었습니다:
- DApp 개발자가 모든 지갑의 네임스페이스를 알아야 함
- 새로운 지갑이 나올 때마다 코드를 수정해야 함
- 지갑마다 다른 인터페이스를 사용하면 통합이 더 복잡해짐
3. EIP-6963 등장 배경
이 문제를 해결하기 위해 2023년 4월에 EIP-6963 제안이 제출되었습니다. 커뮤니티에서 활발한 논의를 거쳐 2023년 10월 12일에 공식 승인되었고, MetaMask가 같은 날 바로 지원을 시작했습니다. eips.ethereum
핵심 목표
EIP-6963는 다음 세 가지를 목표로 했습니다:
- 단일 장애점 제거: MetaMask에 대한 과도한 의존성을 줄이고 다양한 지갑 선택 가능
- 사용자 제어권 강화: 사용자가 직접 원하는 지갑을 선택할 수 있도록
- 개발자 편의성 향상: 새로운 지갑을 지원하기 위해 코드를 수정할 필요 없이
실제로 MetaMask가 해킹당하거나 서비스 장애가 발생하면 엄청난 수의 사용자가 영향을 받을 수 있습니다. EIP-6963는 이런 리스크를 분산시키는 효과도 있습니다.
4. EIP-6963 작동 원리
EIP-6963의 핵심은 이벤트 기반 통신입니다. window.ethereum 객체를 두고 경쟁하는 대신, 각 지갑이 자신을 "발표(announce)"하고 DApp이 이를 "듣는" 방식으로 바뀌었습니다.
이벤트 흐름
작동 방식을 단계별로 설명하면:
1단계: DApp이 지갑을 요청
DApp → window.dispatchEvent('eip6963:requestProvider')
DApp이 페이지에 로드되면 "지갑들아, 너희가 누구인지 알려줘"라는 이벤트를 발송합니다.
2단계: 지갑들이 응답
각 지갑 → window.dispatchEvent('eip6963:announceProvider')
설치된 모든 지갑이 자신의 정보를 담아 응답합니다. MetaMask도 응답하고, Coinbase Wallet도 응답하고, Phantom도 응답합니다.
3단계: 사용자가 선택
DApp은 받은 모든 지갑 정보를 UI에 표시하고, 사용자가 원하는 지갑을 선택하도록 합니다.
EIP6963ProviderInfo 구조
각 지갑이 제공하는 정보는 표준화된 인터페이스를 따릅니다:
interface EIP6963ProviderInfo {
uuid: string; // 고유 식별자 (UUIDv4 형식)
name: string; // 지갑 이름 (예: "MetaMask")
icon: string; // 지갑 아이콘 (base64 또는 SVG)
rdns: string; // 역방향 DNS (예: "io.metamask")
}
여기서 주의할 점은 icon 필드입니다. 대부분 base64로 인코딩된 이미지나 SVG를 사용하는데, 96x96px 이상의 해상도가 권장됩니다. 실무에서는 SVG 사용 시 보안 취약점이 있을 수 있다는 지적도 있어서, 신뢰할 수 있는 지갑만 연결하도록 필터링하는 것도 고려해볼 만합니다.
기존 방식과의 차이
기존 방식과 비교하면 이렇습니다:
| 항목 | 기존 (window.ethereum) | EIP-6963 |
|---|---|---|
| 지갑 개수 | 1개만 사용 가능 | 모든 설치된 지갑 사용 가능 |
| 선택 방식 | 로딩 순서에 따라 자동 결정 | 사용자가 직접 선택 |
| 통신 방식 | 전역 객체 덮어쓰기 | 이벤트 기반 통신 |
| 하위 호환성 | N/A | window.ethereum 폴백 지원 |
5. 현재 채택 현황
2026년 1월 현재, EIP-6963는 업계 표준으로 빠르게 자리 잡았습니다.
주요 지갑 지원
다음 지갑들이 EIP-6963를 지원하고 있습니다:
- MetaMask (2023.10.12부터)
- Coinbase Wallet (2023.10.16부터)
- Phantom
- Trust Wallet
- Rainbow
- OKX Wallet
- Brave Wallet
총 16개 이상의 주요 지갑이 지원하고 있어, 실제 프로덕션 환경에서 적용해도 대부분의 사용자를 커버할 수 있습니다.
라이브러리 및 프레임워크 지원
개발자 도구 측면에서도 지원이 탄탄합니다:
- wagmi: React Hooks 기반 지갑 연결 라이브러리
- RainbowKit: UI 컴포넌트와 함께 제공되는 지갑 연결 솔루션
- Web3Modal: WalletConnect의 공식 모달 라이브러리
- Web3.js: 이더리움 JavaScript API
특히 wagmi나 RainbowKit을 사용하면 EIP-6963를 직접 구현하지 않아도 자동으로 지원됩니다. 하지만 내부 동작 원리를 이해하는 것은 트러블슈팅이나 커스터마이징 측면에서 큰 도움이 됩니다.
6. 마무리
EIP-6963는 단순한 기술적 개선이 아니라, Web3 사용자 경험을 크게 향상시키는 중요한 표준입니다. 여러 지갑을 사용하는 것이 당연해진 지금, 사용자가 원하는 지갑을 자유롭게 선택할 수 있도록 하는 것은 필수가 되었습니다.
2026년 현재 대부분의 주요 지갑과 라이브러리가 지원하고 있어, 새로운 DApp을 개발한다면 반드시 고려해야 할 표준입니다. 기존 프로젝트도 하위 호환성을 유지하면서 점진적으로 마이그레이션할 수 있습니다.
다음 편에서는 실제로 EIP-6963를 DApp에 구현하는 방법을 코드와 함께 자세히 다뤄보겠습니다. TypeScript와 React를 사용해 단계별로 구현하면서, 실무에서 주의해야 할 점들도 함께 공유하겠습니다.
참고 자료
'Blockchain' 카테고리의 다른 글
| 암호화폐 지갑의 비밀: 12개 단어가 모든 것을 담는 이유 (0) | 2026.02.08 |
|---|---|
| ERC 토큰 표준 둘러보기 (0) | 2026.02.07 |
| EIP-6963 2편: DApp에 지갑연결 구현하기 (0) | 2026.01.27 |
| Ethers.js 없이 ERC-20 토큰 단위 변환하기 (0) | 2026.01.26 |
| 블록체인 도메인 개발자가 JSON-RPC를 꼭 알아야 하는 이유 (0) | 2026.01.26 |