가상자산 보안 가이드라인은 “디파이 예치를 이용한 뒤에는 스마트 컨트랙트 승인을 즉시 해제(Revoke)하라”고 체크리스트 한 줄로 경고했고, 하드웨어 지갑 가이드는 “서명 요청 내용을 제대로 읽지 않고 습관적으로 승인하면 자산 접근 권한이 잘못 부여될 수 있다”고 짚었습니다. 두 글 모두 위험을 경고했지만, 정작 토큰 승인이 정확히 무엇에 대한 권한을 얼마나 넘기는 행위인지는 설명하지 않았습니다. 이 글은 그 빈틈을 채웁니다 — 토큰 승인의 작동 원리, 무제한 승인이 위험한 구조적 이유, 실제 피싱 피해 사례, 그리고 승인을 확인·해제하는 실전 방법까지 공식 자료로 짚습니다.
토큰 승인이란 무엇인가: 자산이 아니라 권한을 넘기는 절차
토큰 승인(Token Approval)은 Revoke.cash의 공식 설명에 따르면 “스마트 컨트랙트가 사용자를 대신해 토큰을 소비할 수 있도록 허락하는” 메커니즘입니다. 탈중앙화 거래소(DEX)에서 코인을 스왑하거나 디파이 프로토콜에 자산을 예치하려면, 그 스마트 컨트랙트가 사용자의 지갑에서 토큰을 직접 옮길 수 있어야 합니다. 블록체인은 이 허락 여부를 승인 기록(allowance)으로 저장해 두고, 컨트랙트가 토큰을 옮기려 시도할 때마다 이 기록을 확인해 권한 범위 안에서만 움직이도록 만듭니다.
핵심은 토큰 승인 자체가 자산 이동이 아니라는 점입니다. 승인은 “이 컨트랙트가 앞으로 내 토큰을 이만큼 가져가도 된다”는 사전 허락일 뿐이고, 실제 이동은 승인 이후 별도 트랜잭션(transferFrom)으로 실행됩니다. 문제는 이 허락의 “이만큼”이 얼마로 설정되느냐입니다.
무제한 승인이 위험한 이유: 한도가 없으면 한 번의 사고가 전 재산이 된다
많은 지갑·dApp 인터페이스는 사용자 편의를 위해 기본값으로 무제한 승인(Unlimited Approval)을 요청합니다. 매번 소량만 승인하면 거래할 때마다 가스비를 내며 다시 승인해야 하니, 한 번에 최댓값을 승인해 두는 편이 번거롭지 않기 때문입니다. 문제는 이 무제한 승인을 내준 컨트랙트가 해킹되거나 처음부터 악의적으로 설계된 경우, 사용자가 보유한 해당 토큰 전량이 순식간에 빠져나갈 수 있다는 점입니다.
실제 사례도 있습니다. 보안 분석 매체 DroomDroom의 정리에 따르면 2022년 SHOPX 프로토콜은 버그로 인해 사용자들이 내준 무제한 승인이 악용당해 약 700만 달러 규모의 토큰이 탈취됐습니다. 승인 범위를 필요한 만큼으로 제한했다면 피해가 그 한도 안에 그쳤을 상황이었습니다.

ERC-20과 NFT(ERC-721), 승인 방식은 어떻게 다른가
토큰 승인의 구조는 자산 종류에 따라 조금 다릅니다.
| 항목 | ERC-20(코인·토큰) | ERC-721(NFT) |
|---|---|---|
| 승인 함수 | `approve()` | `approve()` 또는 `setApprovalForAll()` |
| 제한적 승인 | 특정 수량만 지정 가능 | 특정 NFT 1개만 지정 가능 |
| 무제한 승인 | 최댓값으로 수량 지정 | `setApprovalForAll()`로 컬렉션 전체 승인 |
| 해제 방법 | 승인 수량을 0으로 재설정 | 해당 승인을 false로 재설정 |
| 위험 범위 | 승인한 토큰 종류의 보유량 전체 | 승인한 컬렉션의 NFT 전체 |
NFT 마켓플레이스에 컬렉션을 한 번에 올리려고 `setApprovalForAll()`을 눌러본 적이 있다면, 그 순간 해당 컬렉션의 NFT 전체에 대한 권한을 마켓플레이스 컨트랙트에 넘긴 것입니다. 마켓플레이스 자체가 안전하더라도, 그 승인 기록이 남아 있는 한 나중에 발생하는 별도의 피싱 서명과 결합해 악용될 여지가 남습니다.
NFT(ERC-721)란 무엇인가부터 짚고 넘어가야 두 표준의 승인 방식 차이도 명확해집니다.
최근 승인 피싱 사고들: 이제는 서명 한 번으로도 털린다
토큰 승인은 피싱 공격의 핵심 표적이 됩니다. 보안 기업 CertiK의 공식 2025년 Web3 보안 리포트에 따르면 2025년 한 해 피싱 공격으로 인한 손실은 총 7억 2,288만 5,398달러, 248건으로 집계됐습니다. 승인 피싱은 이 피싱 피해 통계의 상당 부분을 차지하는 대표적인 유형으로 꼽힙니다.
최근 사례는 공격이 더 정교해졌음을 보여줍니다. Crypto Briefing의 2026년 7월 9일 보도에 따르면, 한 트레이더가 가짜 디파이 화면으로 위장한 피싱 사이트에서 Permit2 서명에 속아 약 100만 달러를 도난당했고, 같은 수법으로 다른 사용자도 약 19만 6,000달러를 잃었습니다. Permit2는 한 번의 서명으로 여러 토큰에 걸친 지출 권한을 한꺼번에 승인하도록 설계된 구조라, 서명 한 번이 잘못되면 지갑 전체 포트폴리오가 노출될 수 있습니다. 온체인 트랜잭션 없이 오프체인 서명만으로 권한이 넘어가기 때문에, 지갑이 별다른 경고 없이 서명을 요청해도 사용자가 위험을 알아채기 더 어렵다는 점이 최근 승인 피싱의 특징입니다.

승인 내역은 어떻게 확인하고 해제하나
Revoke.cash는 지갑 주소를 입력하거나 지갑을 연결하면 해당 네트워크에서 지금까지 내준 모든 토큰 승인 내역을 한눈에 보여주는 도구입니다. 목록에서 더는 쓰지 않는 dApp이나 낯선 컨트랙트에 내준 승인을 찾아 Revoke 버튼을 누르면 그 권한이 즉시 취소됩니다. 무제한 승인을 완전히 취소하는 대신 필요한 만큼으로 한도를 줄이는 것도 가능합니다. 이더스캔(Etherscan) 같은 블록 탐색기에서도 같은 작업을 할 수 있지만, Revoke.cash가 100개 이상의 네트워크를 지원하며 알려진 익스플로잇과 승인 내역을 자동으로 대조해 준다는 점에서 더 널리 쓰입니다. 해제도 블록체인 트랜잭션이므로 소액의 가스비가 듭니다.
승인 해제 비용을 읽기 어렵다면 가스비 계산과 전송 시점 선택을 참고해 예상 수수료를 확인하되, 비용을 아끼려다 위험한 권한을 그대로 남기지는 마세요.

토큰 승인은 왜 이런 구조로 설계됐나: 2015년 ERC-20 표준
토큰 승인 함수는 새로 생긴 개념이 아닙니다. 파비안 포겔스텔러(Fabian Vogelsteller)가 비탈릭 부테린과 함께 2015년 11월 19일 이더리움 공식 표준 문서(EIP-20)로 제안한 ERC-20 토큰 표준에 처음부터 포함된 필수 함수입니다. 스마트 컨트랙트가 사람의 개입 없이도 정해진 규칙에 따라 토큰을 주고받아야 탈중앙화 거래소나 디파이 프로토콜이 작동할 수 있는데, 그 규칙을 사용자가 사전에 위임하는 절차가 바로 승인입니다. 즉 토큰 승인은 편의를 위한 부가 기능이 아니라, 스마트 컨트랙트 기반 금융 서비스 자체가 성립하기 위한 구조적 전제 조건입니다.
초보자가 특히 자주 하는 실수
지갑이 기본으로 제시하는 무제한 승인을 그대로 승인합니다. 대부분의 dApp 화면은 무제한 승인을 기본값으로 띄우는데, 이 화면에서 승인 수량을 직접 원하는 만큼으로 줄일 수 있다는 사실 자체를 모르는 경우가 많습니다.
한 번 승인한 뒤 다시는 확인하지 않습니다. 몇 달 전 한 번 써 본 뒤 잊어버린 dApp에 여전히 무제한 승인이 남아 있는 경우가 흔하고, 그 dApp이 나중에 해킹되면 그 오래된 승인이 공격 경로가 됩니다.
시드 구문 유출과 승인 피싱을 같은 위험으로 착각합니다. 시드 구문이 유출되면 지갑 전체가 통째로 노출되지만, 승인 피싱은 시드 구문을 몰라도 서명 한 번으로 특정 토큰만 노출시킬 수 있는 별개의 위험입니다. 둘 다 막으려면 시드 구문 보관(하드웨어 지갑)과 승인 내역 점검(Revoke)을 각각 따로 챙겨야 합니다.
서명 요청 화면을 읽지 않고 습관적으로 승인 버튼을 누릅니다. 지갑이 띄우는 서명 요청에는 어떤 컨트랙트에 어떤 권한을 주는지가 표시되지만, 이 내용을 확인하지 않고 넘기는 습관이 최근 Permit2 서명 피싱이 통하는 가장 근본적인 이유입니다.
사이트에서 이 흐름은 어떻게 다뤄져 왔나
가상자산 보안 가이드라인이 체크리스트 한 줄로 짚은 “이용 후 스마트 컨트랙트 승인 즉시 해제”가 이 글에서는 Revoke.cash 사용법으로 구체화됩니다. 하드웨어 지갑 가이드가 경고한 “서명 요청을 제대로 읽지 않는 습관”은 이 글의 최근 Permit2 피싱 사례가 실제로 어떻게 그 습관을 파고드는지 보여줍니다. 디파이를 이용하는 순간마다 반복해서 마주치는 것이 바로 이 승인 절차이므로, 디파이 가이드를 먼저 읽었다면 이 글의 위험 설명이 더 구체적으로 와닿을 것입니다.
승인하기 전, 그리고 이미 승인했다면 확인할 것
승인 화면에서 수량을 직접 확인합니다. 무제한으로 뜬 기본값을 그대로 두지 말고, 지금 필요한 만큼으로 수량을 줄일 수 있는지 먼저 확인합니다.
분기별로 승인 내역을 점검합니다. Revoke.cash에 지갑 주소를 넣어 더는 쓰지 않는 dApp에 남아 있는 오래된 승인을 찾아 해제합니다.
서명 요청 화면의 권한 범위를 읽습니다. 특히 여러 토큰을 한 번에 아우르는 Permit2류 서명 요청은 그만큼 노출 범위도 넓다는 뜻이므로 더 신중하게 확인합니다.
시드 구문 보관과 승인 관리를 별개의 작업으로 취급합니다. 하드웨어 지갑으로 시드 구문을 안전하게 보관하고 있어도, 승인 내역을 점검하지 않으면 이 글이 다루는 위험은 그대로 남습니다.
“매번 최소 금액만 승인하면 되지 않나”: 편의와 보안의 트레이드오프
토큰 승인 위험을 줄이는 가장 단순한 원칙은 항상 필요한 만큼만 승인하는 것입니다. 다만 이 원칙을 문자 그대로 지키려면 거래할 때마다 승인 트랜잭션을 다시 실행해야 하고, 그때마다 가스비가 추가로 듭니다. 자주 이용하는 디파이 프로토콜이라면 매번 소액 승인을 반복하는 번거로움과 비용이 무제한 승인 한 번보다 누적 부담이 클 수 있다는 반론도 있습니다.
이 반론에도 일리는 있습니다. 다만 그 판단은 “이 프로토콜을 얼마나 신뢰하는가”와 “승인 내역을 정기적으로 점검할 것인가”라는 두 가지 조건이 함께 충족될 때만 성립합니다. 오래도록 검증된 대형 프로토콜에 자주 쓰는 소액이라면 무제한 승인 후 주기적 점검이 합리적인 절충일 수 있지만, 처음 써 보는 dApp이나 큰 금액이라면 매번 제한된 수량으로 승인하는 쪽이 여전히 더 안전한 기본값입니다.
자주 묻는 질문 (FAQ)
Q1. 토큰 승인을 하면 바로 자산이 이동하나요?
A1. 아닙니다. 토큰 승인은 스마트 컨트랙트에 앞으로 토큰을 옮길 수 있는 권한을 미리 부여하는 절차이며, 실제 이동은 승인 이후 별도의 거래로 실행됩니다.
Q2. 무제한 승인을 이미 해버렸다면 어떻게 하나요?
A2. Revoke.cash나 이더스캔에서 지갑 주소를 확인해 해당 승인을 찾아 해제(Revoke)하거나 필요한 수량으로 한도를 줄이면 됩니다. 해제도 하나의 블록체인 거래이므로 소액의 가스비가 듭니다.
Q3. NFT도 토큰 승인처럼 위험한가요?
A3. 네. NFT 마켓플레이스에서 `setApprovalForAll()`을 누르면 해당 컬렉션의 NFT 전체에 대한 권한이 그 컨트랙트에 넘어갑니다. 코인의 무제한 승인과 같은 구조의 위험입니다.
Q4. 지갑이 위험을 미리 경고해주지 않나요?
A4. 일부 지갑은 무제한 승인이나 낯선 컨트랙트에 경고 문구를 표시하지만, 모든 지갑이 이를 강제하지는 않습니다. 특히 Permit2 같은 오프체인 서명 방식은 온체인 거래보다 경고가 약하게 뜨는 경우가 많아 사용자가 직접 확인하는 습관이 여전히 중요합니다.
Q5. Permit2가 뭔가요?
A5. 한 번의 서명으로 여러 토큰에 걸친 지출 권한을 한꺼번에 승인할 수 있도록 설계된 구조입니다. 편리하지만, 서명 한 번이 잘못되면 노출되는 범위도 그만큼 넓어집니다.
Q6. 승인 해제(Revoke)를 하면 그 dApp을 다시 쓸 수 없나요?
A6. 다시 쓸 수 있습니다. 다음에 그 dApp을 이용할 때 승인 절차를 한 번 더 거치면 되며, 해제는 영구적인 이용 제한이 아니라 현재 남아 있는 권한을 취소하는 것입니다.
Q7. 승인 내역 점검은 얼마나 자주 해야 하나요?
A7. 정해진 규칙은 없지만, 디파이나 NFT 마켓플레이스를 자주 이용한다면 분기에 한 번 정도 Revoke.cash로 점검하는 것이 실용적인 주기로 권장됩니다.
Q8. 시드 구문만 안전하게 보관하면 승인 문제는 신경 쓰지 않아도 되나요?
A8. 아닙니다. 시드 구문 유출과 토큰 승인 악용은 서로 다른 공격 경로입니다. 시드 구문이 안전해도 오래된 무제한 승인이 남아 있다면 그 경로로 자산이 빠져나갈 수 있습니다.
정리하며
토큰 승인은 자산 이동이 아니라 권한 위임이고, 그 권한이 무제한으로 설정되는 순간 한 번의 사고가 보유 자산 전체로 번질 수 있으며, 이 위험을 관리하는 유일한 실전 방법은 승인 수량을 스스로 확인하고 Revoke.cash 같은 도구로 오래된 권한을 정기적으로 해제하는 것입니다. 지금 확인할 것 한 가지 — 지갑 주소를 Revoke.cash에 넣어, 잊고 있던 무제한 승인이 남아 있는지부터 확인하십시오.
#토큰승인 #Approve #무제한승인 #Revoke #스마트컨트랙트보안 #승인피싱 #Permit2 #지갑보안 #가상자산보안 #코인공부
