토큰 승인(token approval)은 탈중앙화 앱(dapp)이 지갑에서 특정 토큰에 접근하고 이동할 수 있도록 허용하는 스마트 컨트랙트 권한입니다. 승인이 없으면 어떤 앱도 자기 수탁(self-custodial) 지갑의 토큰에 접근할 수 없습니다. 지갑이 앱 인터페이스에 연결되어 있어도 마찬가지입니다. 토큰 승인은 지갑 연결과 프로토콜이 실제로 자산을 사용하는 것 사이의 간극을 메워주는 역할을 합니다.
토큰 승인은 거의 모든 DeFi 상호작용에 필요합니다. 탈중앙화 거래소에서의 토큰 스왑, 대출 프로토콜에 예치, 풀에 유동성 공급, NFT 마켓플레이스 리스팅 등이 그 예입니다. 동시에 토큰 승인은 크립토 보안에서 가장 많이 악용되는 메커니즘 중 하나이기도 합니다. MetaMask의 월간 크립토 보안 리포트는 이러한 위협을 상세히 추적합니다. 예를 들어 2026년 2월 크립토 보안 리포트에서는 "서명 피싱" 공격, 즉 승인 피싱이 207% 급증했음을 다루었습니다. 자기 수탁 지갑을 사용하는 누구에게나 토큰 승인의 작동 방식, 지속 방식, 그리고 공격자가 이를 악용하는 방법을 이해하는 것은 필수적입니다.
면책 고지: 이 콘텐츠는 교육 목적으로만 제공됩니다. 금융 조언이 아니며, 권유도 아니고, 영국 독자를 대상으로 하지 않습니다. 크립토 지갑과 디지털 자산은 위험하며 모든 사용자에게 적합하지 않을 수 있습니다.
토큰 승인의 작동 방식
토큰 승인의 일반적인 예시로 탈중앙화 거래소에서 USDC를 ETH로 스왑하는 경우를 들 수 있습니다. 앱의 스마트 컨트랙트는 지갑에서 USDC를 가져와 거래를 실행하기 위한 권한이 필요합니다. 그 권한이 바로 토큰 승인입니다.
컨트랙트 수준에서 사용자는 USDC 토큰 컨트랙트의 approve() 함수를 호출합니다. 이 함수는 두 가지 입력값을 받습니다. spender(승인된 스마트 컨트랙트 주소)와 amount(spender가 이동할 수 있는 토큰 수량)입니다. 승인 트랜잭션이 블록체인에서 확인되면, spender 컨트랙트는 transferFrom()을 호출하여 사용자의 지갑에서 승인된 수량만큼의 토큰을 사용자의 추가 확인 없이 이동시킬 수 있습니다.
토큰 승인에 관해 모든 사람, 특히 초보자가 알아야 할 두 가지 중요한 사항이 있습니다. 첫째, 승인은 하나의 토큰과 하나의 spender에 한정됩니다. 탈중앙화 거래소(DEX)에 USDC 사용을 승인해도 ETH, BTC, 또는 다른 토큰에 대한 접근 권한은 부여되지 않습니다. 둘째, 승인은 네트워크 수수료가 발생하는 블록체인 트랜잭션입니다. 실제 스왑과는 별개의 단계이기 때문에 DeFi 상호작용에서 종종 두 번의 확인이 필요한 이유가 여기에 있습니다. 하나는 승인을 위한 것이고, 다른 하나는 실행을 위한 것입니다.
제한적 승인 vs 무제한 승인
승인의 amount 필드는 spender가 접근할 수 있는 토큰 수량을 결정합니다.
제한적 승인은 spender가 특정 수량의 토큰만 이동하도록 승인합니다. 예를 들어 특정 스왑에 필요한 정확히 500 USDC만 허용하는 방식입니다. 해당 500 USDC가 전송되면 허용량이 소진됩니다. 다음 스왑에는 새로운 승인이 필요하며, 이는 또 다른 블록체인 트랜잭션과 네트워크 수수료를 의미합니다.
무제한 승인은 spender가 해당 토큰의 최대 가능 수량(기술적으로 2^256 − 1로, 어떤 토큰의 총 공급량보다 훨씬 큰 수)을 이동하도록 승인합니다. 이는 컨트랙트가 현재와 미래에 걸쳐 추가 승인 없이 해당 토큰의 전체 잔액에 접근할 수 있음을 의미합니다. 대부분의 앱은 사용자 마찰을 줄이기 위해 기본적으로 무제한 승인을 요청합니다. 한 번 승인하면 해당 토큰의 모든 향후 트랜잭션이 사전 승인됩니다.
편의성은 분명하지만 위험도 그만큼 실재합니다. 무제한 승인은 만료되지 않습니다. 승인된 컨트랙트가 나중에 악용되거나 악의적으로 업그레이드되거나, 사용자가 정상 앱을 모방한 피싱 사이트에서 승인에 서명한 경우, 공격자는 사용자의 추가 개입 없이 승인 범위 내의 모든 토큰을 탈취할 수 있습니다. 피해자는 토큰이 사라질 때까지 해당 승인이 존재한다는 사실조차 모를 수 있습니다.
고려 사항 | 제한적 토큰 승인 | 무제한 토큰 승인 |
승인 수량 | 특정 수량 (예: 500 USDC) | 최대 가능 수량 (전체 잔액, 무기한) |
지속성 | 지정된 수량 전송 후 소진 | 수동으로 취소할 때까지 유효 |
사용자 마찰 | 트랜잭션마다 새 승인 필요 (추가 네트워크 수수료) | 한 번의 승인으로 모든 향후 트랜잭션 처리 |
컨트랙트 악용 시 위험 | 손실이 승인된 수량으로 제한 | 전체 토큰 잔액 위험 |
일반적 사용 | 보안을 중시하는 사용자, 고액 트랜잭션 | 대부분의 앱 기본값 |
Permit2 토큰 승인의 작동 방식
2022년 11월, Uniswap Labs는 기존 토큰 승인의 마찰과 위험을 해결하기 위해 Permit2라는 컨트랙트를 배포했습니다. 2025년까지 이더리움 메인넷 주소 310만 개 이상이 Permit2 컨트랙트를 승인했으며, Permit2는 Uniswap, 1inch, CowSwap 등 수많은 프로토콜이 사용하는 DeFi에서 가장 널리 통합된 승인 시스템이 되었습니다.
핵심 아이디어는 다음과 같습니다. 각 앱의 스마트 컨트랙트에 별도의 블록체인 승인을 부여하는 대신, 사용자는 Permit2 컨트랙트에 단일 승인을 부여합니다. 이후 각 앱 상호작용은 오프체인 서명, 즉 어떤 토큰을, 얼마나, 어떤 spender에게, 그리고 권한이 만료되는 기한을 명시하는 지갑 서명 메시지를 통해 승인됩니다.
기존 승인 방식 대비 개선 사항은 의미 있습니다. Permit2 서명에는 기한이 포함되어 있어 오래된 권한이 영구적으로 유지되는 대신 자동으로 만료됩니다. Nonce는 동일한 서명이 두 번 사용되는 것을 방지합니다. 또한 사용자는 앱마다 하나씩이 아닌 토큰마다 하나의 승인에 서명하므로, 블록체인 승인 트랜잭션 총수와 관련 네트워크 수수료가 줄어듭니다.
단점은 공격 표면의 이동입니다. 기존 승인은 수개월 또는 수년 전에 승인되었다가 나중에 침해된 컨트랙트, 즉 잠재된 블록체인 권한을 통해 악용되었습니다. Permit2 서명은 서명 시점의 피싱을 통해 악용됩니다. Permit2 승인은 EIP-712 타입 데이터 서명을 사용하기 때문에 트랜잭션 확인이 아닌 서명 요청으로 지갑에 표시됩니다. 악성 사이트는 실제로는 사용자의 전체 토큰 잔액 이전을 승인하는 Permit2 서명인데도 일상적인 "메시지 서명" 요청처럼 보이는 화면을 제시할 수 있습니다. 블록체인 트랜잭션도 없고, 사용자 측 네트워크 수수료도 없습니다. 서명 하나만으로 공격자가 transferFrom()을 호출합니다.
드레이너가 토큰 승인을 악용하는 방법
지갑 드레이너(wallet drainer)는 피해자로부터 기존 방식과 Permit2 방식의 토큰 승인을 모두 탈취하도록 설계된 자동화된 피싱 툴킷입니다. 드레이너-서비스형(DaaS, drainer-as-a-service) 방식으로 운영됩니다. 개발자가 악성 스마트 컨트랙트, 피싱 인프라, 자금 세탁 파이프라인을 유지 관리하고, 제휴자들이 탈취 자금의 일정 비율(일반적으로 75~95%)을 받는 조건으로 서비스를 임대합니다.
지갑 드레이너 공격 패턴은 일관된 순서를 따르는 경우가 많습니다.
1단계: 유인. 피해자는 스폰서 검색 결과, 가짜 에어드롭 링크, 침해된 Discord 서버, 또는 복제된 앱 인터페이스를 통해 피싱 사이트에 접근합니다. 사이트는 동일한 브랜딩, 동일한 레이아웃, 종종 거의 동일한 URL을 가진 정상 프로토콜처럼 보입니다.
2단계: 서명 요청. 사이트가 지갑에 트랜잭션 또는 Permit2 서명을 요청합니다. 요청은 표준 앱 연결, 토큰 스왑, 또는 에어드롭 클레임처럼 보일 수 있습니다. 실제로는 해당 서명이 드레이너 컨트랙트에 피해자의 토큰 이동 권한을 부여합니다.
3단계: 탈취. 공격자가 별도의 지갑에서 transferFrom()을 호출하여 승인된 토큰을 인출합니다. 정교한 드레이너 키트는 ERC-20, NFT, Permit2 승인 등 여러 토큰 전송을 단일 멀티콜로 묶어 몇 초 만에 지갑을 비웁니다. 자금은 탈중앙화 거래소와 크로스체인 브리지를 통해 추적을 어렵게 만들며 이동됩니다.
핵심은 블록체인 관점에서 모든 단계가 유효하고 승인된 트랜잭션이라는 점입니다. 피해자가 승인에 서명했고, 컨트랙트는 승인된 작업을 실행했습니다. 이를 되돌릴 수 있는 프로토콜 수준의 메커니즘은 존재하지 않습니다.
일부 지갑은 이제 사용자가 확인하기 전에 트랜잭션과 서명을 시뮬레이션하여 알려진 드레이너 컨트랙트와 의심스러운 승인 수량에 플래그를 표시합니다. MetaMask는 Blockaid 통합을 통해 이를 구현합니다. 이것이 위험을 완전히 제거하지는 않습니다. 새로운 드레이너 컨트랙트는 아직 탐지 데이터베이스에 없을 수 있지만, 피싱 요청과 사용자 확인 사이에 하나의 보호 레이어를 추가합니다.
토큰 승인 검토 및 취소 방법
토큰 승인을 취소한다는 것은 특정 spender에 대한 허용량을 0으로 재설정하는 것을 의미합니다. 이는 블록체인 트랜잭션으로 네트워크 수수료가 발생하며 지갑에서 확인해야 하지만, 해당 컨트랙트가 지정된 토큰을 이동하는 능력을 영구적으로 제거합니다.
세 가지 개념이 중요합니다.
취소 시점. 앱 사용을 마치고 다시 사용할 계획이 없을 때. 더 이상 필요하지 않은 무제한 승인을 부여한 후. 즉각적인 손실이 없더라도 의심스러운 상호작용 이후. 정기적인 관행으로서 활성 승인을 주기적으로 검토하면 목적을 다한 권한을 발견할 수 있습니다.
취소 비용. 각 취소는 자체 네트워크 수수료가 있는 별도의 블록체인 트랜잭션입니다. 이더리움 메인넷에서는 일반적으로 몇 달러가 소요되며, 레이어 2 네트워크에서는 몇 센트의 일부에 불과할 수 있습니다. 비용은 침해된 승인으로 인한 잠재적 손실에 비해 작지만, 수개월의 DeFi 활동으로 수십 개의 승인이 쌓인 경우 합산하면 상당해질 수 있습니다.
취소로 해결되지 않는 것. 승인을 취소하면 해당 권한에 따른 향후 전송을 방지합니다. 이미 발생한 전송은 되돌릴 수 없습니다. 드레이너가 이미 transferFrom()을 호출했다면 토큰은 사라진 것입니다. 취소는 교정적 조치가 아닌 예방적 조치입니다.
자기 수탁 지갑에서 승인을 검토하고 취소하는 단계별 지침은 MetaMask의 스마트 컨트랙트 허용량 취소 방법을 참조하세요.
토큰 승인 위험 줄이는 방법
몇 가지 방법을 통해 DeFi 상호작용의 편의성을 포기하지 않으면서도 노출을 줄일 수 있습니다.
옵션이 있을 때 제한적 승인을 설정하세요. 예를 들어 MetaMask Extension은 요청된 승인 수량을 표시하고 사용자가 확인 전에 지출 한도를 맞춤 설정할 수 있도록 합니다. 한도를 트랜잭션에 실제로 필요한 수량으로 설정하면 컨트랙트가 나중에 침해될 경우 손실을 제한할 수 있습니다.
서명 요청을 읽으세요. Permit2 서명은 토큰 이름, 수량, spender 주소, 기한을 표시합니다. "메시지 서명" 요청에 토큰 세부 정보가 표시된다면 로그인이 아닌 승인입니다. 수량이 예상 트랜잭션 규모가 아닌 사용자의 전체 잔액과 일치한다면 위험 신호입니다.
연결 전에 사이트를 확인하세요. 드레이너 사이트는 정상 앱 인터페이스를 복제합니다. 신뢰할 수 있는 URL을 북마크하고 검색 결과, 소셜 미디어 링크, DM이 아닌 북마크에서 탐색하면 가장 일반적인 유인 메커니즘을 제거할 수 있습니다.
승인을 주기적으로 검토하세요. 활성 승인은 수개월의 DeFi 사용으로 쌓입니다. 블록 탐색기의 승인 확인 도구나 지출 한도 대시보드를 사용한 분기별 검토를 통해 더 이상 목적을 다하지 않는 권한을 발견할 수 있습니다.
토큰 승인에 관한 자주 묻는 질문
아니요. 지갑을 연결하면 공개 주소가 공유되고 앱이 토큰 잔액을 조회할 수 있게 됩니다. 하지만 앱이 토큰을 이동할 수 있는 권한은 부여되지 않습니다. 토큰 승인(approval)을 위해서는 별도의 블록체인 트랜잭션(기존 방식의 approval의 경우) 또는 서명된 Permit2 메시지가 필요하며, 두 경우 모두 지갑에 명시적인 확인 요청으로 표시되어 사용자가 직접 승인해야 합니다.
아니요. ERC-20 approve() 함수와 Permit2는 토큰에만 적용되며, 블록체인의 네이티브 화폐에는 적용되지 않습니다. ETH(및 MATIC, BNB와 같은 기타 네이티브 화폐)는 직접 전송 트랜잭션에 서명해야만 이동할 수 있습니다. 단, 네이티브 화폐의 래핑된 버전(WETH, WMATIC)은 ERC-20 토큰이므로 승인(approval)을 통해 탈취될 수 있습니다.
Permit2는 전통적인 승인 방식의 가장 큰 취약점인 영구적으로 지속되는 무제한 휴면 권한을 마감 기한과 nonce를 추가함으로써 해결합니다. 그러나 이와 동시에 새로운 위험을 초래합니다. 무해해 보이는 오프체인 서명이 대규모 전송을 승인할 수 있다는 점입니다. 두 시스템 중 어느 것이 절대적으로 더 안전하다고 단정할 수 없습니다. Permit2는 오래된 승인 악용에 대해 더 안전하고, 전통적인 승인 방식은 서명 피싱에 대해 더 안전합니다. 전통적인 방식은 지갑이 더 눈에 띄게 표시하는 블록체인 트랜잭션을 필요로 하기 때문입니다.
무제한 토큰 승인은 스마트 컨트랙트에 지갑에서 특정 토큰을 제한 없이 이동할 수 있는 권한을 부여하며, 만료 기간이 없습니다. 대부분의 앱은 필요한 트랜잭션 수를 줄이기 위해 기본적으로 무제한 승인을 요청합니다. 위험성: 승인된 컨트랙트가 해킹될 경우, 공격자는 추가 확인 없이 해당 토큰의 지갑 잔액 전체를 탈취할 수 있습니다. 무제한 승인은 사용자가 직접 취소하기 전까지 계속 유효합니다.