
MetaMask Snap 기술 해설: 개발 경험, 기능 제한, 보안성 및 상업적 잠재력 분석
글 작성: 리다마오, Bruce
MetaMask Snap이란?
며칠 전 ConsenSys는 일반 대중에게 MetaMask Snaps Open Beta를 공식 출시한다고 발표했다. MetaMask Snaps는 지갑의 기능을 확장할 수 있으며, 제3자 개발자가 만든 앱(Snap)을 설치함으로써 새로운 기능을 추가할 수 있다.
만약 ConsenSys가 MetaMask를 위챗에 비유한다면, Snap은 위챗 소형 프로그램(小程序)과 같다. 이처럼 MetaMask의 야심찬 포부를 엿볼 수 있으며, ConsenSys의 규모와 MetaMask의 사용자 기반을 고려하면, 지갑 분야의 판도가 크게 변화할 것으로 예상된다.
현재 공식적으로 35개의 사용 가능한 Snap을 공개했으며, Snap 앱스토어 https://snaps.metamask.io/도 함께 출시되었다.

일부 Snap들 미리보기
그렇다면 기술적 관점에서 MetaMask Snap은 구체적으로 어떤 것일까? 어떤 능력 제한이 있는지, 안전한지, 개발 경험은 어떠한지 등 이러한 요소들이 바로 MetaMask Snap의 미래 잠재력을 결정할 것이다.
작년부터 LXDAO는 Snap의 구현 방식에 대해 심층적으로 연구해 왔으며, 현재 여러 팀원들이 Snap 개발에 참여하고 관련 해커톤에도 적극적으로 참가하고 있다. 오늘 우리는 기술적인 시각에서 위 질문들을 심층적으로 탐구해보고, 실제로 하나의 Snap을 직접 개발하여 개발자 경험을 체험해 볼 것이다.
MetaMask Snap 첫 체험
MetaMask Snap 설치하기
일반적으로 MetaMask Snap 공식 마켓플레이스를 통해 설치할 수 있으며, 프로젝트 측 웹사이트에서도 직접 설치 가능하다. UniPass를 예로 들면, 어플리케이션 페이지 방문 시 MetaMask 연결 버튼이 제공된다.

클릭하면 Snap 설치 절차가 진행된다:

MetaMask Snap 사용하기
설치가 완료되면 해당 제품과 기능을 사용할 수 있다. 이 애플리케이션에서는 UniPass가 스마트 컨트랙트 계정(SCA)을 생성해주고, 사용자는 MetaMask의 EOA 계정을 통해 이를 쉽게 조작할 수 있다.

송금을 실행할 때, UniPass는 Snap 창을 띄워서 UniPass AA 지갑에 대한 해당 작업 수행 여부를 확인한다.

MetaMask로 승인하면 관련 작업이 실행된다. 이 시나리오에서 MetaMask는 Snap을 통해 UniPass AA 지갑을 제어할 수 있게 되었으며, UniPass는 자체 지갑 플러그인을 개발하지 않아도 사용자가 지갑을 조작할 수 있고, MetaMask를 통해 매우 낮은 비용으로 사용자를 유입할 수 있게 되었다!
이러한 설치 및 사용 과정을 통해 무엇을 알 수 있을까?
-
Snap은 상당히 세밀한 권한 제어 기능을 갖추고 있으며, 지갑 연결 권한이나 네트워크 요청 등까지 포함된다. 전체적으로 최소권한 원칙(Principle of Least Privilege)을 따르는 설계로 보안을 최우선으로 한다.
-
npm:@unipasswallet/unipass-snap을 보면 Snap은 NPM 기반의 패키지 및 버전 관리를 사용한다는 것을 알 수 있다. 아래에서 보안성에 대해 더 자세히 설명하겠다.
-
Snap은 높은 유연성을 가지며, 프로젝트 요구에 따라 자유롭게 개발하고 화면 구성 및 로직을 결정할 수 있다. 다만 UI는 다소 단순하여 개선의 여지가 있다.
-
Snap의 사용 경험은 매우 간단하고 신뢰할 만하며, 베타 버전임에도 불구하고 이미 실서비스 수준에 도달했다고 볼 수 있다.
지갑 제품의 경우 항상 보안이 최우선이다. 다음으로 Snap의 보안 설계를 분석해보자.
Snap은 안전한가?
Snap 코드 실행 환경 분석
앞서 언급했듯이 Snap은 NPM 기반의 패키지 및 버전 관리를 사용하고 있어, 사실상 Web 및 JavaScript 기반의 애플리케이션이라 할 수 있다. 잘 알려진 바와 같이 JS 문법은 매우 자유롭고 유연하여 XSS 및 피싱 공격 등의 위험이 존재한다. MetaMask Snap은 어떻게 이러한 문제를 해결할까?
몇 가지 조사를 통해 MetaMask가 Agoric를 후원하고 있으며, Agoric 팀의 Hardened JavaScript(또는 Secure EcmaScript)를 깊이 통합하여 "완전 가상화" 샌드박스 솔루션으로 사용하고 있다는 것을 알 수 있다. Agoric은 JavaScript 제한 API를 설계하여 TC-39(JS 표준화 협회)에 Draft 제안서를 제출했는데, 그 주소는 https://github.com/tc39/proposal-ses 이다.
간단히 말해, Hardened JavaScript는 더욱 안전한 표준 JavaScript의 하위 집합이다. 일부 JS 기능과 메커니즘을 활용하면서도, 특정 JS API 호출 권한과 방법을 제한함으로써 위험을 줄였다. 이는 해당 코드를 위한 안전한 샌드박스 환경을 조성하며, 동시에최소권한 원칙(Principle of Least Privilege)을 준수하여 코드 권한을 관리한다.

Agoric는 MetaMask와 협력하여 Snap의 보안성을 강화하기 위해 LavoMoat 프로젝트를 개발했다. LavaMoat은 JS 프로젝트의 외부 의존성에 따른 보안 위험을 해결하는 일련의 도구이며, 일부 API 및 로직에 대한 제한을 추가한다.
또한 Agoric과 MetaMask는 공동으로 블랙박스 및 화이트박스 보안 테스트를 진행하였으며, 상세한 보안 보고서를 발행하였다. 따라서 코드 실행 시점에서 Snap이 안전하다는 데 충분한 근거가 있다.
Snap 코드는 반드시 오픈소스이며 감사되어야 함
명확한 사용자 승인 절차와 최소권한 설계 외에도, 공식 인증된 Snap이 되기 위해서는 반드시 코드를 오픈소스로 공개해야 하며, 이는 커뮤니티의 힘을 통해 악성 코드 내장 가능성을 크게 낮춘다.
또한, 공식 웹사이트에 등록된 Snap들은 모두 제3자 보안 회사의 코드 감사를 거쳐야 게시될 수 있다. 이는 Snap의 신뢰성을 크게 높이는 요소이며, 감사기관으로는 모두가 잘 아는 SlowMist(만무) 등이 있다.

현재 발견된 Snap의 보안 위험
현재 Snap은 NPM 기반의 패키지 및 버전 관리를 사용하고 있기 때문에, 코드 수준에서 변경 가능성은 존재하며, 감사가 필수가 아니므로 일정한 보안 위험이 발생할 수 있다.
MetaMask는 NPM 플랫폼의 버전 배포를 제어할 수 없으므로, 프로젝트 측은 언제든지 새 버전을 출시하여 사용자에게 설치하도록 유도할 수 있다. 그러나 감사 비용 문제로 인해 감사 회사는 모든 버전을 감사하지 않기 때문에, 최신 버전의 변경사항이 오픈소스로 공개되지 않았거나 감사를 받지 않은 경우가 생길 수 있다.
다만 실행 환경이 샌드박스이며 최소권한 설계를 따르기 때문에, 사용자가 수동으로 새로운 권한을 승인하지 않는 한, 새 버전의 Snap은 이전 버전의 권한만을 유지하게 된다. 하지만 만약 어떤 Snap이 과도한 권한을 요청한다면 여전히 위험을 초래할 수 있으므로, Snap 설치 및 사용 시에는 여전히 경계심을 가져야 한다.
MetaMask Snap의 기술적 기능과 제한 사항
최근 MetaMask Snap이 정식 발표되었지만, 사실상 이미 4년간 개발되어 왔다! 초기 MetaMask Snap의 아이디어는 Dan Finlay가 2019년 10월 10일 Medium에 처음 소개했다.
보안성, 유연성, 효율성을 동시에 균형 있게 맞추는 것은 매우 큰 도전이며, MetaMask가 이 순간을 위해 막대한 비용과 준비 작업을 했다는 것을 알 수 있다.
현재 주로 다음과 같은 세 가지 API를 공개하고 있다:
-
상호운용성(Interoperability): 개발자가 MetaMask 기반으로 다른 체인 지갑을 개발할 수 있도록 허용
-
거래 인사이트(Transaction Insights): 사용자의 거래 요청 전에 거래 데이터를 가져와 거래 위험 여부를 분석할 수 있도록 허용
-
알림(Notifications): Snap을 통해 사용자에게 직접 메시지를 푸시할 수 있음 (다만 이 기능은 웹사이트 지원이 필요해 다소 제한적임)

다음은 MetaMask Snap이 제공하는 구체적인 기능과 효과를 간략히 소개하여, 독자가 보다 직관적으로 이해할 수 있도록 하겠다.
알림(Notification) 기능
snap_notify 인터페이스를 사용하면 MetaMask 또는 브라우저 내에서 알림을 표시할 수 있다. Snap은 이 인터페이스를 통해 사용자에게 직접 메시지를 보낼 수 있으며, 아래 그림과 같다:

거래 인사이트(Transaction Insights) 기능
사용자가 스마트 컨트랙트와 상호작용할 때, MetaMask는 Snap의 onTransaction 이벤트를 트리거하며, 서명되지 않은 원본 거래를 onTransaction 핸들러 메서드에 전달한다. 이후 Snap은 거래 재확인 페이지에서 인터페이스를 반환하고 커스텀 콘텐츠를 표시할 수 있다.

이 기능을 통해 거래 정보의 보안 감사, 추가 정보 표시 등의 기능을 구현할 수 있다.
Dialog 인터페이스 및 커스텀 인터페이스 기능
Dialog 기능을 통해 Snap은 독립된 창을 직접 팝업시켜 전통적인 Alert/Confirm/Prompt 창과 유사한 기능을 제공할 수 있다(아래 그림 참고). 각각 알림, 확인, 정보 입력 등을 위해 사용된다.

Dialog를 통해 간단한 인터랙티브 인터페이스와 조작을 커스터마이징하고 DApp과 연동할 수 있다.
MetaMask Snap이 현재 구현할 수 없는 기능은 무엇인가?
보안 등의 이유로 인해 Snap은 현재 제3자 프론트엔드 프레임워크를 지원하지 않으며, 비교적 적은 수의 UIKit만 제공하고 있다. 아래는 insight 예제를 통해 개발자가 호출할 수 있는 UI 컴포넌트 라이브러리를 모두 보여준다.

그림에서 보듯이 현재 제공되는 UI 컴포넌트는 Heading(큰 글씨), Text(작은 글씨), Panel(카드, 단 한번만 사용 가능), Divider(구분선), Copyable(복사 클릭), 그리고 일부 Markdown 하위 집합(예: 굵게, 기울임)에 불과하다. 따라서 인터랙티브한 기능 구현은 아직 불가능하며, HTML을 내장하여 인터랙션을 구현하는 것도 불가능하다. 다만 공식 Discord에서 질의한 결과, 공식 측은 모두 보안상의 이유라고 답했으며, 향후 버전에서 점차 완화될 것이라고 밝혔다.
또한 보안상의 이유로 외부 요청은 Fetch 메서드만 지원되며, WebSocket과 같은 기타 프로토콜은 지원하지 않는다. 보안, 기능, 개인정보 보호 제한으로 인해 클라이언트 정보(예: 현재 Snap을 실행시킨 웹사이트 주소)를 가져올 수 없어 더욱 다양하고 풍부한 기능을 구현하는 데 한계가 있다.
이러한 대부분의 문제와 제한은 보안을 우선시하기 때문이며, 향후 보안성이 검증되면 더 많은 권한이 개방될 것으로 기대된다.
이러한 API를 제공하는 MetaMask는 사실상 오픈 플랫폼과 같은 제품이 되었다. 마치 당시 위챗이 공식 계정과 소형 프로그램을 출시했을 때처럼, 단순한 채팅 도구를 넘어섰다는 느낌을 준다.
MetaMask는 2019년 이미 오늘날의 시장 구조, 즉 수많은 퍼블릭 체인과 프로젝트, 다양한 맞춤형 지갑 수요를 예견했다. 각 프로젝트가 자체 플러그인을 개발하고 사용자가 여러 개를 설치해야 하는 번거로움보다는, 차라리 MetaMask Snap 기반으로 개발하는 것이 낫다고 판단한 것이다. 초기 공개된 Snap 목록에서 Sui Wallet, Solana Wallet, Arweave Wallet 등 EVM 생태계 외의 지갑들도 확인할 수 있었다. 기존의 방대한 사용자 기반을 바탕으로, MetaMask Snap은 지갑 시장의 판도에 중대한 영향을 미칠 것이다.
실제로 MetaMask Snap의 상상력은 우리가 생각하는 것보다 훨씬 크며, 지갑의 범주를 넘어서기도 한다. EthSign 팀의 사례를 보면, MetaMask Snap 기반으로 범용 비밀번호 관리기 KeyChain을 만들었다. 브라우저 내 모든 비밀번호를 지갑 키로 암호화하여 저장할 수 있는 것이다. 지갑만 잘 관리하면 모든 비밀번호도 함께 관리되는 셈이다.

Snap은 개발자와 밀접하게 관련되어 있으며, 개방형 API를 제공함으로써 실제 개발자 경험은 어떨까? 직접 하나의 Snap을 만들어 보면서 체험해보자.
직접 Snap 개발 테스트
아이디어 정리
众所周히 대부분의 사용자는 대부분의 상황에서 자신이 상호작용하고 있는 스마트 컨트랙트가 무엇인지 알지 못한다. 주로 다음과 같은 문제가 있다:
-
거래 중인 컨트랙트가 피싱 사이트에서 교체된 컨트랙트인지 여부
-
거래 중인 컨트랙트가 업그레이드 가능한 컨트랙트인지 여부
-
스마트 컨트랙트가 최근 배포되어 아직 검증된 사용자가 거의 없는지 여부
-
거래 중인 컨트랙트가 오픈소스인지 여부
일반 사용자에게 거래 전에 Solidity 코드를 읽도록 요구하는 것은 불가능에 가깝다. 이럴 때 Transaction Insight 기능을 이용해 스마트 컨트랙트를 분석하는 것이 적합하다. 예를 들어 AI를 사용해 스마트 컨트랙트에 대한 간단한 보안 감사를 수행하면, 아마도 80%의 기초 피싱 공격을 걸러낼 수 있을 것이다.
개발 환경 준비
지갑 다운로드
먼저 MetaMask Flask를 설치해야 한다.

MetaMask Flask는 개발자 중심의 MetaMask 확장판으로, 새로운 기능 미리보기 및 실험적 기능 개발에 주로 사용된다. 이것은 MetaMask의 개발자용 버전이므로, 일상적인 사용에는 사용하지 말고, 개인의 실 사용용 프라이빗 키를 가져오지 않도록 주의하자. 여기서 Flask를 사용하는 이유는 개발 중인 Snap을 로컬에서 즉시 미리보기하기 위함이다.
설치 후에는 기존의 메타마스크 지갑 및 기타 브라우저 지갑을 잠시 종료하거나, 새로운 Chrome Profile을 생성하여 사용하는 것이 좋다. 그렇지 않으면 충돌이 발생할 수 있다.
계정 생성
지갑 설치 후 일반적인 MetaMask 지갑 생성처럼 새 지갑을 생성한다. 주의할 점은 이 지갑은 테스트 전용이므로 본인의 실 지갑을 가져오지 말 것.
다음으로 새로 생성한 지갑에 테스트용 코인을 충전해야 한다. 테스트 코인은 에어드랍(faucet)을 통해 얻을 수 있으며, 본 문서에서 설명하는 Snap은 Goerli 테스트넷을 사용하므로 아래 내용은 Goerli를 기준으로 한다.
Snap 템플릿 초기화
공식 문서에 따라 먼저 @metamask/create-snap CLI 도구를 사용하여 새 Snap 프로젝트를 생성하고, 공식 템플릿으로 초기화한다:

Snap 파일 구조
Snap의 주요 파일은 ./packages/snap 디렉토리에 위치하며, 폴더 구조는 다음과 같다:

Snap 설정 파일은 snap.manifest.json에 위치하며, 주요 코드 파일은 ./src/index.ts이다. 매우 간결한 구조를 확인할 수 있다.
권한 활성화
먼저 권한을 활성화해야 한다. snap.manifest.json 파일에 다음과 같은 세 가지 항목을 추가한다:

Manifest 파일에서 description 및 proposedName을 수정하여 프로젝트의 설명과 이름을 변경할 수 있다.
거래 정보 가져오기
이번 사례에서는 index.ts 파일만 수정하면 모든 기능을 완성할 수 있다. 아래는 간단한 코드 예시이며, 완전히 실행 가능한 코드는 https://github.com/LidamaoHub/insights 에서 확인할 수 있다.

더 복잡한 Snap 제품을 만들기 위해서는 MetaMask Snap 개발자 문서를 참고하자.
설치 후, 모든 거래 시 유사한 위험 경고 메시지를 확인할 수 있다:

현재 Snap 개발 경험은 매우 원활하며, 거의 문제 없이 진행되며, 공식 템플릿도 매우 풍부하다. 풍부한 경험을 가진 개발자는 보통 몇 시간 안에 입문하여 원하는 Snap 개발을 시작할 수 있다. 그러나 정식으로 출시하여 일반 사용자가 사용할 수 있도록 하기 위한 가장 큰 장애물은 보안 감사이다. 모든 독립 개발자나 소규모 팀이 자신의 Snap을 감사받을 수 있는 자원을 가지고 있지는 않다. 따라서 향후 한동안 Snap의 수량과 다양성은 급격한 증가를 기대하기 어렵다.
개발자 지원
위 예제를 성공적으로 실행했다면, 이제 당신은 합격한 Snap 초보 개발자가 된 것이다!
MetaMask는 작년에 MetaMask Grants DAO를 설립하여, MetaMask 생태계 내 고부가가치 프로젝트에 보조금을 지원하고 있다. MetaMask Grants DAO는 직원 주도의 실험적 프로그램으로, 전 세계 외부 개발자들에게 보조금을 지급하여 MetaMask 생태계 내에서 영향력 있는 경험을 구축하도록 장려한다. MetaMask는 분기별 수익의 일부를 이 DAO에 기금으로 충당하며, 현재 매년 예산은 240만 달러이다.
현재 MetaMask 생태계를 풍부하게 하는 모든 프로젝트는 공식 MetaMask Grants DAO(MetaMask Grant)에 신청할 수 있으며, 자세한 정보는 https://metamaskgrants.org/ 에서 확인할 수 있다.
참고로 LXDAO는 올해 운좋게 MetaMask Grants를 성공적으로 신청하여 관련 프로젝트 개발에 참여했으며, 연락 채널도 마련했다. LXDAO 멤버로서 관련 아이디어가 있다면, 더 효율적으로 신청할 수 있다.

마무리
우리는 위에서 기술적 관점에서 Snap이 무엇인지, 안전한지, 기능 제한 및 개발자 경험에 대해 분석했다. 간단히 요약하면 다음과 같다:
-
Snap은 위챗 소형 프로그램과 유사하며, MetaMask의 상상력을 더욱 넓힌다
-
전반적인 보안성은 우수하지만, 여전히 일부 위험이 존재하며, 특히 높은 권한 접근에는 경계심을 가져야 한다
-
보안상의 이유로 현재 공개된 기능은 많지 않지만, 충분한 상상력을 자극할 수 있는 Snap을 만들 수 있다
-
4년간의 정교한 개발과 테스트를 거쳐 개발자 경험은 우수하지만, 보안상의 이유로 화이트리스트 메커니즘과 감사 요건을 두었기 때문에, 향후 한동안 대량의 Snap이 쏟아져 나오기는 어려울 것으로 예상된다
현재 MetaMask Snap은 여전히 빠르게 반복 개선되고 있으며, 앞으로 더 많은 권한과 기능이 개방될 것으로 기대된다. 보다 개방적이면서도 안전한 메커니즘이 도입되기를 기대한다. 예를 들어 애플의 공식 감사(Audit) 심사 메커니즘 또는 공식 코드 저장소의 버전 관리 등이 도입된다면, 더 많은 개발자가 낮은 비용으로 참여할 수 있게 될 것이다. 이러한 문제가 개선된다면, 미래에 큰 수요가 발생할 것이며, 나아가 전담 Snap 개발자라는 직무가 등장할 수도 있다.
엄청난 수의 MetaMask 사용자를 기반으로, 독립 개발자에게도 일정한 기회가 주어질 수 있다. Snap이 가져올 다음의 획기적인 혁신을 기대해보자.
마지막으로, 이 글을 읽어주셔서 감사합니다. 이 글이 더 많은 사람들이 MetaMask Snap의 발전 현황을 이해하는 데 도움이 되기를 바랍니다.
TechFlow 공식 커뮤니티에 오신 것을 환영합니다
Telegram 구독 그룹:https://t.me/TechFlowDaily
트위터 공식 계정:https://x.com/TechFlowPost
트위터 영어 계정:https://x.com/BlockFlow_News














