
Web3 피싱의 기본 원리를 쉽게 설명해 보겠습니다: 권한 허용 피싱, Permit과 Permit2의 차이점
글: 보차이
단지 서명만 했을 뿐인데, 내 돈은 어떻게 사라진 걸까? 요즘 '서명 낚시(Signature Phishing)'가 Web3 해커들이 가장 좋아하는 수법으로 부상하고 있다. 최근 유셴(余弦) 선생님과 여러 지갑 업체 및 보안 회사들이 줄줄이 서명 낚시에 대한 경각심을 알리고 있지만, 매일 여전히 많은 사람들이 속고 있다.
보차이는 그 원인 중 하나가 대부분의 사용자들이 지갑 상호작용의 근본 로직을 이해하지 못하고, 기술을 잘 모르는 사람들에게는 학습 장벽이 너무 높기 때문이라고 생각한다. 그래서 이번에 그래픽 기반으로 서명 낚시의 작동 원리를 쉽게 설명하려 한다. 기술을 몰라도 완전 초보자도 이해할 수 있도록 최대한 쉬운 말로 풀어보겠다.
우선 우리가 지갑을 사용할 때 수행하는 작업은 오직 두 가지뿐이다. 바로 '서명(Signature)'과 '상호작용(Interaction)'이다. 아주 간단하게 설명하면, 서명은 블록체인 외부(오프체인)에서 이루어지는 작업이며, 가스비(Gas fee)가 들지 않는다. 반면 상호작용은 블록체인 위(온체인)에서 일어나며, 가스비를 소비해야 한다.
일반적으로 서명은 '당신이 당신임'을 증명하기 위해 사용된다. 예를 들어 지갑에 로그인할 때처럼, 유니스왑(Uniswap)에서 토큰을 교환하려면 먼저 지갑을 연결해야 하는데, 이때 웹사이트에 "나는 이 지갑의 주인입니다"라고 알리기 위해 서명을 해야 한다. 이 과정은 블록체인 상태에 아무런 변화도 주지 않으므로 비용이 들지 않는다.

상호작용은 실제로 유니스왑에서 토큰을 교환할 때 발생한다. 예를 들어 USDT를 사용해 보차이코인 1개를 살 경우, 먼저 USDT 스마트 계약에 다음과 같은 명령을 보내야 한다. "내 USDT 100개를 보차이코인과 교환하기 위해 유니스왑이 이 USDT를 이동할 수 있도록 승인합니다." 이를 '승인(Approve)'이라고 부른다. 그리고 또 다른 가스비를 내며 유니스왑 스마트 계약에 "이제 USDT 100개로 보차이코인 1개를 교환하려 합니다. 지금 실행해 주세요"라고 요청한다. 이렇게 해서 거래가 완료된다.

서명과 상호작용의 차이를 간단히 이해했으면, 이제 낚시 공격의 원리를 설명하겠다. 대표적인 세 가지 방식을 소개하는데, 바로 '승인 낚시', 'Permit 서명 낚시', 'Permit2 서명 낚시'다. 이 세 가지는 매우 흔한 낚시 수법들이다.
먼저 승인 낚시부터 알아보자. 이는 과거 Web3에서 가장 전형적인 낚시 수법 중 하나다. 이름에서도 알 수 있듯이 '승인(Approve)' 메커니즘을 악용하는 것이다. 앞서 유니스왑 예시에서 살펴봤듯이, 승인은 스마트 계약에 "내 xxx 토큰 xx 개를 이동할 수 있도록 허용합니다"라고 알려주는 행위다. 해커는 아름다운 프론트엔드를 가진 위조된 NFT 프로젝트 사이트를 만들고, 중앙에 "에어드랍 받기"라는 큰 버튼을 둔다. 하지만 이 버튼을 누르면 지갑에서는 실제로 사용자의 토큰을 해커의 주소로 승인하는 창이 나타난다. 사용자가 확인을 누르면, 해커의 KPI 달성이 성공적으로 완료되는 셈이다.

하지만 승인 낚시에는 한 가지 문제가 있다. 가스비를 지불해야 하기 때문에, 요즘 사람들은 돈이 드는 작업에 대해 경계심이 강하다. 낯선 사이트에서 클릭 후 살짝만 봐도 이상함을 느낄 수 있어 비교적 방어가 쉬운 편이다.
이제 오늘의 주인공인 Permit 및 Permit2 서명 낚시를 소개한다. 이는 Web3 자산 보안 분야의 중점 피해 지역이다. 왜 이렇게 방어하기 어려울까? 이유는 DApp을 사용하기 전 반드시 지갑에 서명 로그인을 해야 하기 때문에, 많은 사람들은 이미 "이 작업은 안전하다"는 고정관념을 형성해버렸다. 게다가 비용이 들지 않고, 각 서명이 의미하는 바를 대부분의 사용자들이 모른다는 점이 문제다.
먼저 Permit 메커니즘을 살펴보자. Permit은 ERC-20 표준의 승인 기능을 확장한 것으로, 우리가 흔히 사용하는 USDT도 ERC-20이다. 간단히 말해, 누군가가 사용자의 토큰을 이동할 수 있도록 서명으로 허가하는 기능이다. 일반적인 승인(Approve)은 사용자가 가스비를 내며 스마트 계약에 "너는 내 토큰 xx 개를 이동할 수 있다"고 직접 알려주는 것이지만, Permit은 마치 종이에 서명해서 "나는 누구누구가 내 토큰 xx 개를 이동할 수 있도록 허락합니다"라고 적어주는 것과 같다. 이후 이 사람이 그 '종이'를 들고 가스비를 내며 스마트 계약에 제출하면, "그 사람이 나에게 토큰 xx 개를 이동할 권한을 주었습니다"라고 되고, 결국 사용자의 자산이 타인에게 넘어가게 된다. 이 과정에서 사용자는 단지 서명만 했을 뿐이지만, 그 이면에는 다른 사람이 승인(Approve)을 호출해 토큰을 옮길 수 있는 권한을 부여한 셈이다. 해커는 로그인 버튼을 Permit 낚시로 위장한 웹사이트를 만들어두고, 사용자가 서명하게 만든다면 자산을 손쉽게 가져갈 수 있다.

그렇다면 Permit2는 무엇일까? 사실 Permit2는 ERC-20의 기능이 아니라 유니스왑이 사용자 편의를 위해 도입한 기능이다. 앞서 언급했듯이, 유니스왑에서 USDT로 보차이코인을 교환하려면 먼저 승인(Approve)을 하고, 그 다음 교환을 해야 해서 두 번의 가스비가 필요했다. 유니스왑은 이를 해결하기 위해 "한 번에 전체 한도를 나에게 승인해주고, 매번 교환 시에는 서명만 하면 내가 처리해줄게"라는 아이디어를 냈다. 덕분에 유니스왑 사용자는 한 번만 가스비를 내도 되며, 이 서명 과정에서 실제로 가스비를 내는 것은 사용자가 아니라 Permit2 컨트랙트다. 다만 이 비용은 최종 교환된 토큰에서 차감된다.

하지만 Permit2 낚시에 걸리려면 조건이 있다. 바로 사용자가 과거에 유니스왑을 사용한 적이 있고, Permit2 스마트 계약에 무제한 승인을 했어야 한다는 점이다. 현재 유니스왑의 기본 설정이 무제한 승인이기 때문에, 이 조건을 충족하는 사용자는 의외로 많다. 따라서 해커는 사용자를 속여 서명만 받아내면 (이미 승인을 준 토큰에 한해) 자산을 옮겨갈 수 있다.
요약하자면, 승인 낚시의 본질은 사용자가 가스비를 내며 스마트 계약에 "내 토큰을 해커에게 넘기도록 승인합니다"라고 직접 말하는 것이고, 서명 낚시의 본질은 사용자가 남의 자산을 이동할 수 있게 해주는 '권한 문서'에 서명해 해커에게 넘기는 것이다. 이후 해커가 가스비를 내며 스마트 계약에 "내가 그의 토큰을 옮기겠습니다"라고 요청하면 끝이다. 현재 Permit과 Permit2가 서명 낚시의 주요 타깃이다. Permit은 ERC-20의 승인 확장 기능이고, Permit2는 유니스왑이 도입한 새로운 기능이다.
원리를 이해했으니, 어떻게 방어해야 할까?
1. 가장 중요한 것은 보안 의식을 갖는 것이다. 지갑에서 어떤 작업을 할 때마다, 내가 지금 정확히 무엇을 하는지 꼭 확인해야 한다.
2. 큰 금액 보관용 지갑과 체인 상에서 활동하는 지갑을 분리하라. 만약 낚였을 때 손실을 최소화할 수 있다.
3. Permit 및 Permit2 서명 형식을 식별하는 법을 익혀라. 아래와 같은 서명 내용을 보면 즉시 경계해야 한다:
-
Interactive: 상호작용 URL
-
Owner: 승인 제공자 주소
-
Spender: 승인 수령자 주소
-
Value: 승인 수량
-
Nonce: 난수
-
Deadline: 만료 시간

TechFlow 공식 커뮤니티에 오신 것을 환영합니다
Telegram 구독 그룹:https://t.me/TechFlowDaily
트위터 공식 계정:https://x.com/TechFlowPost
트위터 영어 계정:https://x.com/BlockFlow_News










