Consensys가 구축한 선도적인 자기 보관형 암호화폐 지갑이자 Web3로 가는 관문입니다.
모든 글 읽기모든 DeFi 상호작용은 토큰 승인으로 시작되며, 모든 토큰 승인은 해당 트랜잭션이 종료된 후에도 유지될 수 있는 권한입니다.

토큰 승인(token approval)은 탈중앙화 앱(dapp)이 지갑에서 특정 유형의 토큰에 접근하고 이동할 수 있도록 허용하는 스마트 컨트랙트 권한입니다. 승인이 없으면 어떤 앱도 셀프 커스터디 지갑의 토큰에 접근할 수 없습니다. 지갑이 앱 인터페이스에 연결되어 있더라도 마찬가지입니다. 토큰 승인은 지갑 연결과 프로토콜이 실제로 자산을 사용하는 것 사이의 간극을 메워주는 역할을 합니다.
토큰 승인은 탈중앙화 거래소에서의 토큰 스왑, 대출 프로토콜에 예치, 풀에 유동성 추가, 마켓플레이스에 NFT 등록 등 거의 모든 DeFi 상호작용에 필요합니다. 동시에 크립토 보안에서 가장 많이 악용되는 메커니즘 중 하나이기도 합니다. MetaMask의 월간 크립토 보안 리포트는 이러한 위협을 상세히 추적합니다. 예를 들어, 2026년 2월 크립토 보안 리포트에서는 "서명 피싱" 공격, 즉 승인 피싱이 207% 증가한 사례를 다루었습니다. 셀프 커스터디 지갑을 사용하는 누구에게나 토큰 승인의 기능, 지속 방식, 그리고 공격자가 이를 악용하는 방법을 이해하는 것은 필수적입니다.
면책 고지: 이 콘텐츠는 교육 목적으로만 제공됩니다. 재정적 조언, 권유가 아니며, 영국 독자를 대상으로 하지 않습니다. 크립토 지갑과 디지털 자산은 위험성이 있으며 모든 사용자에게 적합하지 않을 수 있습니다.
토큰 승인의 일반적인 예시로 탈중앙화 거래소에서 USDC를 ETH로 스왑하는 경우를 들 수 있습니다. 앱의 스마트 컨트랙트는 지갑에서 USDC를 가져와 거래를 실행하기 위한 권한이 필요합니다. 이 권한이 바로 토큰 승인입니다.
컨트랙트 수준에서 사용자는 USDC 토큰 컨트랙트의 approve() 함수를 호출합니다. 이 함수는 두 가지 입력값을 받습니다: spender(승인된 스마트 컨트랙트 주소)와 amount(spender가 이동할 수 있는 토큰 수량)입니다. 승인 트랜잭션이 블록체인에서 확인되면, spender 컨트랙트는 transferFrom()을 호출하여 사용자의 지갑에서 승인된 수량만큼의 토큰을 사용자의 추가 확인 없이 이동할 수 있습니다.
토큰 승인에 관해 모든 사람, 특히 초보자가 알아야 할 두 가지 중요한 사항이 있습니다. 첫째, 승인은 하나의 토큰과 하나의 spender에 한정됩니다. 탈중앙화 거래소(DEX)에 USDC 사용을 승인해도 ETH, BTC 또는 다른 토큰에 대한 접근 권한은 부여되지 않습니다. 둘째, 승인은 네트워크 수수료가 발생하는 블록체인 트랜잭션입니다. 실제 스왑과는 별개의 단계이기 때문에 DeFi 상호작용에서 두 번의 확인이 필요한 경우가 많습니다: 한 번은 승인, 한 번은 실행입니다.
승인의 amount 필드는 spender가 접근할 수 있는 토큰 수량을 결정합니다.
제한적 승인은 spender가 특정 수량의 토큰만 이동하도록 승인합니다. 예를 들어, 특정 스왑에 필요한 정확히 500 USDC만 허용하는 방식입니다. 해당 500 USDC가 전송되면 허용량이 소진됩니다. 다음 스왑에는 새로운 승인이 필요하며, 이는 추가 블록체인 트랜잭션과 네트워크 수수료를 의미합니다.
무제한 승인은 spender가 해당 토큰의 최대 가능 수량(기술적으로 2^256 − 1로, 어떤 토큰의 총 공급량보다도 훨씬 큰 숫자)을 이동하도록 승인합니다. 이는 컨트랙트가 현재와 미래에 걸쳐 추가 승인 없이 해당 토큰의 전체 잔액에 접근할 수 있음을 의미합니다. 대부분의 앱은 사용자 편의를 위해 기본적으로 무제한 승인을 요청합니다. 한 번의 승인으로 해당 토큰의 모든 미래 트랜잭션이 사전 승인되기 때문입니다.
편리함은 분명하지만, 위험도 그만큼 실재합니다. 무제한 승인은 만료되지 않습니다. 승인된 컨트랙트가 나중에 해킹되거나 악의적으로 업그레이드되거나, 사용자가 정상적인 앱을 모방한 피싱 사이트에서 승인에 서명한 경우, 공격자는 사용자의 추가 개입 없이 승인이 적용된 모든 토큰을 탈취할 수 있습니다. 피해자는 토큰이 사라지고 나서야 해당 승인이 존재했다는 사실을 알게 될 수도 있습니다.
고려 사항 | 제한적 토큰 승인 | 무제한 토큰 승인 |
승인 수량 | 특정 수량 (예: 500 USDC) | 최대 가능 수량 (전체 잔액, 무기한) |
지속성 | 지정된 수량 전송 후 소진 | 수동으로 취소할 때까지 유효 |
사용자 불편 | 트랜잭션마다 새 승인 필요 (추가 네트워크 수수료) | 한 번의 승인으로 모든 미래 트랜잭션 처리 |
컨트랙트 해킹 시 위험 | 손실이 승인된 수량으로 제한 | 전체 토큰 잔액 위험 |
일반적 사용 | 보안을 중시하는 사용자, 고액 트랜잭션 | 대부분의 앱 기본값 |
2022년 11월, Uniswap Labs는 기존 토큰 승인의 불편함과 위험을 해결하기 위해 Permit2라는 컨트랙트를 배포했습니다. 2025년까지 300만 개 이상의 이더리움 메인넷 주소가 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 익스텐션은 요청된 승인 수량을 표시하고 확인 전에 사용자가 지출 한도를 맞춤 설정할 수 있도록 합니다. 한도를 실제 트랜잭션에 필요한 수량으로 설정하면 컨트랙트가 나중에 침해되더라도 손실을 제한할 수 있습니다.
서명 요청을 꼼꼼히 읽으세요. Permit2 서명에는 토큰 이름, 수량, spender 주소, 만료 기한이 표시됩니다. "메시지 서명" 요청에 토큰 세부 정보가 표시된다면 로그인이 아닌 승인입니다. 수량이 예상 트랜잭션 규모가 아닌 전체 잔액과 일치한다면 위험 신호입니다.
연결 전에 사이트를 확인하세요. 드레이너 사이트는 정상적인 앱 인터페이스를 복제합니다. 신뢰할 수 있는 URL을 북마크하고 검색 결과, 소셜 미디어 링크, DM이 아닌 북마크에서 접속하면 가장 일반적인 유인 메커니즘을 차단할 수 있습니다.
정기적으로 승인을 검토하세요. 활성 승인은 수개월의 DeFi 사용으로 쌓입니다. 블록 익스플로러의 승인 확인 도구나 지출 한도 대시보드를 사용한 분기별 검토를 통해 더 이상 필요하지 않은 권한을 파악할 수 있습니다.
AI가 번역했습니다. 오류가 있을 수 있습니다. 항상 정보를 확인하시기 바랍니다.