토큰 Approve(승인)는 ERC20 토큰이 스마트 컨트랙트와 상호작용하기 위한 표준 메커니즘이지만, 2024~2026년 가장 큰 DeFi 공격 벡터이기도 합니다. 이 글에서는 Approve 메커니즘과 취소 방법을 상세히 다룹니다. 결론부터 말하면 DeFi 상호작용을 할 때마다 Approve 잔여분이 생길 수 있고, 장기간 취소하지 않으면 거대한 위험이 누적되며, 매달 Revoke.cash로 점검하고 불필요한 승인을 취소하는 것이 DeFi 사용자의 필수 습관입니다. 계정은 주계정과 예비계정을 나눠 쓰는 것이 좋은데, 바이낸스 공식 사이트에서 주계정을 등록하고, 안드로이드는 바이낸스 공식 앱을 설치하며, 아이폰 사용자는 해외 Apple ID 전환이 필요하니 iOS 설치 가이드를 참고하세요.
1. Approve 메커니즘의 원리
ERC20 토큰의 두 가지 방식:
ERC20 토큰 표준은 두 가지 전송 방식을 설계했습니다.
- transfer: 사용자가 직접 전송(다른 사람에게 USDC를 보냄)
- transferFrom: 컨트랙트가 대신 전송(스마트 컨트랙트가 내 계정에서 USDC를 인출)
transferFrom을 쓰려면 먼저 Approve가 필요합니다:
1단계: 사용자가 USDC 컨트랙트의 approve(spender, amount)를 호출
- spender = 컨트랙트 주소
- amount = 승인 수량
2단계: 컨트랙트가 transferFrom(user, recipient, amount)을 호출
- amount 범위 내에서만 성공
예를 들어 Uniswap을 사용할 때:
1단계: 사용자가 Uniswap Router에 USDC 인출을 Approve(한 번에 1000 USDC 승인)
2단계: 사용자가 Uniswap에서 USDC → ETH 교환을 시작
3단계: Uniswap Router가 USDC.transferFrom을 호출해 USDC를 인출
4단계: Uniswap Router가 사용자에게 해당 수량의 ETH를 전송
Approve는 DeFi와 ERC20 토큰이 상호작용하는 기본 메커니즘입니다.
Q: 상호작용할 때마다 매번 다시 Approve해야 하나요?
아닙니다. Approve는 지속됩니다:
- 사용자가 Uniswap에 1000 USDC를 Approve하면 → 그 1000 USDC 한도는 영구히 유지됨
- 사용자가 Uniswap에서 반복 거래해도 1000 USDC를 넘지 않으면 다시 Approve할 필요 없음
- Approve는 사용자가 직접 Revoke하거나 한도를 다 쓸 때까지 끝나지 않음
이것이 Approve 누적 위험의 근원입니다. 장기간 취소하지 않으면 → 수많은 과거 Approve가 여기저기 흩어져 남습니다.
2. Approve의 두 가지 유형
한정 승인(Limited Approval):
- 사용자가 특정 수량(예: 1000 USDC)을 승인
- 컨트랙트는 최대 1000 USDC까지만 인출 가능
- 다 쓰면 다시 Approve해야 함
무제한 승인(Unlimited Approval / MaxUint256):
- 사용자가 2^256-1 수량(사실상 무제한)을 승인
- 컨트랙트가 무제한으로 인출 가능
- 영원히 다시 Approve할 필요 없음
무제한 승인이 존재하는 이유:
- 가스 최적화: 사용자는 한 번만 Approve하면 됨(가스 50~200달러 절약)
- 사용자 경험: 상호작용할 때마다 Approve하는 번거로움 회피
- DApp 기본 설정: Uniswap, SushiSwap 등은 기본적으로 무제한 Approve
무제한 승인의 위험:
- 프로토콜이 해킹당하면 지갑 속 토큰이 무제한으로 인출될 수 있음
- 피싱 컨트랙트에 Approve하면 남은 자산이 전부 빠져나갈 수 있음
- 발견하기 어려움(사용자가 스스로 점검하지 않음)
실제 사례:
2024년 12월 한 사용자가 2022년 Uniswap에서 USDC를 Unlimited로 Approve했습니다. 2024년 12월 이 사용자의 지갑에 5만 USDC가 들어왔고, 2시간 후 악성 컨트랙트(Uniswap V3로 위장한 악성 Router)가 transferFrom을 호출해 전부 빼앗아 갔습니다. 사후 조사 결과 피싱 컨트랙트가 사용자의 과거 Approve 취약점을 이용해 공격한 것으로 밝혀졌습니다.
Q: 한정 승인과 무제한 승인 중 어느 쪽을 선택해야 하나요?
보안파(추천): 상호작용할 때마다 구체적인 수량을 직접 Approve
- 장점: 보안성이 높고 단일 손실이 제한적
- 단점: 매번 가스(5~30달러)를 소모
편의파: 기본적으로 무제한 승인
- 장점: 가스 절약 + 한 번 Approve하면 계속 사용 가능
- 단점: 프로토콜이 해킹당하면 손실이 큼
주류 전략:
- 고액 토큰(1만 달러 초과): 한정 승인 + 사용 후 즉시 취소
- 소액 토큰(1만 달러 미만): 무제한 승인 + 정기 점검
3. Approve 공격의 흔한 형태
형태 1: 피싱 사이트의 Approve 공격
피싱 사이트는 UI를 진짜처럼 위장하고, 사용자가 지갑을 연결하면 Approve 거래에 서명하게 만듭니다.
- 표면상: "지갑 인증"이나 "에어드롭 수령"을 요구
- 실제로: USDC / USDT / WETH를 악성 컨트랙트에 Approve
- 이후: 악성 컨트랙트가 transferFrom으로 승인된 토큰을 전부 인출
형태 2: Permit 서명 공격
EIP-2612가 도입한 permit 함수는 서명만으로(온체인 없이) 승인할 수 있게 합니다.
- 사용자가 Permit 메시지에 서명
- 컨트랙트가 그 서명으로 permit + transferFrom을 호출
- 사용자의 지갑 토큰이 인출됨(사전 Approve 불필요)
Permit 공격의 위험성:
- 사용자가 서명할 때 가스를 소모하지 않음(온체인이 아님)
- 지갑의 서명 화면이 Permit 내용을 직관적으로 보여주지 않음
- 사용자가 "무해한 서명"으로 착각하기 쉬움
형태 3: 과거 Approve를 통한 프로토콜 해킹
과거에 Approve한 프로토콜이 해킹당하는 경우:
- 사용자가 2년 전 어떤 DeFi 프로토콜에 Approve
- 프로토콜이 해커에게 장악됨(개인키 유출 / 컨트랙트 업그레이드 탈취)
- 해커가 프로토콜을 통해 transferFrom을 호출해 승인된 토큰을 전부 인출
형태 4: 악성 Token Drainer
피싱 사이트는 서명 시 여러 개의 Approve를 한 번에 승인하게 만듭니다.
- 하나의 서명에 여러 개의 USDC / USDT / WETH 승인이 포함됨
- 사용자는 구체적인 승인 내용을 확인하기 어려움
- 한 번의 서명으로 지갑의 여러 토큰이 승인됨
Q: Permit 서명이 Approve보다 더 위험한가요?
네, Permit이 훨씬 위험합니다:
| 항목 |
Approve |
Permit |
| 온체인 여부 |
예 |
아니오(서명만) |
| 가스 소모 |
예 |
아니오 |
| 지갑 해석 |
비교적 명확 |
직관적이지 않음 |
| 취소 방식 |
Revoke 온체인 거래 |
취소 불가(컨트랙트 nonce 변경 필요) |
| 사용자 경계심 |
높음 |
낮음 |
Permit 서명은 반드시 토큰, 수량, 수신자를 꼼꼼히 확인해야 합니다.
4. Revoke로 Approve 취소하는 방법
주요 취소 도구:
Revoke.cash(가장 대중적, 추천):
- 주소: revoke.cash
- 지원 체인: 이더리움 + 주요 EVM 체인
- 절차: 지갑 연결 → 승인 목록 확인 → Revoke 클릭해 취소
Etherscan Token Approval:
- 주소: etherscan.io/tokenapprovalchecker
- 이더리움 메인넷만 지원
- 승인 상세 정보 표시
Solscan Approval(Solana):
- 주소: solscan.io/account-token-approval
- Solana만 지원
- SPL 토큰 승인 취소
Revoke.cash 사용 절차:
1. revoke.cash 접속
2. "Connect Wallet" 클릭(MetaMask / Rabby 연결)
3. 모든 승인이 자동으로 로드됨(토큰 / 프로토콜별 분류)
4. 목록 확인:
- 토큰 이름(USDC, USDT, WETH 등)
- 승인 대상(컨트랙트 주소 + 유명 프로토콜명)
- 승인 수량(구체적 값 또는 Unlimited)
- 위험 등급(빨간색 = 고위험, 초록색 = 알려진 프로토콜)
5. "Revoke" 클릭해 의심스러운 승인 취소
6. MetaMask 팝업에서 서명 + 가스 지불
7. 온체인 반영 대기(5~30초)
Revoke의 가스 비용:
| 체인 |
건당 취소 가스 |
| 이더리움 메인넷 |
5~30달러 |
| Polygon |
0.01달러 미만 |
| Arbitrum / Optimism / Base |
0.1~1달러 |
| BNB Chain |
0.05~0.30달러 |
| Solana |
0.01달러 미만 |
Q: Approve를 취소할 때도 가스를 내야 하나요?
네. Revoke는 온체인 거래이므로 가스를 지불해야 합니다. 다만:
- 이더리움 메인넷 가스는 비교적 높음(건당 5~30달러)
- L2 / 다른 체인의 가스는 매우 저렴
최적화 팁:
- 네트워크가 한산할 때 취소(심야 / 주말)
- 여러 승인을 한 번에 취소(시간 절약)
- 고위험 승인부터 우선 취소
5. Approve 정기 점검 표준 절차
점검 빈도:
| 사용자 유형 |
점검 빈도 |
| 활발한 DeFi 사용자(주 5회 이상 상호작용) |
매월 |
| 중간 DeFi 사용자(월 5~20회 상호작용) |
3개월마다 |
| 저빈도 DeFi 사용자(월 5회 미만 상호작용) |
6개월마다 |
점검 절차:
1단계: Revoke.cash에 지갑 연결
2단계: 승인 항목 위험도별 분류
위험 등급별 정렬:
- 고위험: 알 수 없는 컨트랙트의 Unlimited 승인
- 중위험: 알려진 프로토콜의 Unlimited 승인
- 저위험: 알려진 프로토콜의 한정 승인
3단계: 불필요한 승인 취소
취소 원칙:
- 알 수 없는 컨트랙트의 승인은 모두 취소
- 더 이상 사용하지 않는 프로토콜 승인 취소(예: 1년 내 상호작용 없음)
- 주로 사용하는 프로토콜 승인은 유지(예: Uniswap, Aave 등)
4단계: 필요한 승인의 기록 보관
유지한 승인 기록:
5단계: 점검 후마다 검증
- 취소 후 Revoke.cash에는 해당 승인이 더 이상 표시되지 않아야 함
- Etherscan으로 컨트랙트의 allowance(user, spender) = 0을 확인
Q: 취소 전에 어떤 프로토콜이 "알려진 것"인지 어떻게 판단하나요?
판단 방법:
- 프로토콜 이름: Revoke.cash에 표시되는 프로토콜명(예: "Uniswap V3 Router")
- 컨트랙트 주소: Etherscan에서 컨트랙트가 검증되었는지, 주류 프로토콜인지 검색
- DefiLlama 프로토콜 페이지: TVL과 운영 기간 확인
- 공식 문서: 프로젝트 측이 공개한 컨트랙트 주소
식별할 수 없는 컨트랙트 + Unlimited 승인 = 고위험이므로 즉시 취소해야 합니다.
6. 체인별 Approve 관리
이더리움 메인넷 + EVM 호환 체인:
- 메커니즘 동일: ERC20 표준 + Approve / transferFrom
- 도구: Revoke.cash 범용
- 가스 비용: 이더리움 메인넷이 가장 비싸고, L2 / Polygon / BSC는 저렴
Solana 체인:
- 메커니즘이 다름: SPL Token은 "Token Account" 모델 사용
- Approve / transferFrom 없음: Solana는 "서명 승인" 방식 사용
- 취소 도구: Solscan / Phantom 내장 Revoke
비트코인 체인:
- 스마트 컨트랙트 없음: BTC는 Approve가 필요 없음
- Lightning / Liquid 등 2계층 네트워크: 다른 메커니즘 존재
Move 계열(Sui / Aptos):
- 메커니즘이 다름: Object 모델
- 다른 취소 로직 필요
Q: Solana에도 Approve 위험이 있나요?
있습니다. Solana의 "서명 승인" 위험도 비슷합니다:
- 피싱 사이트가 사용자에게 "Token Approval" 서명을 요구
- 사용자가 서명하면 악성 컨트랙트가 토큰을 인출할 수 있음
- 취소는 Solscan이나 지갑 내에서 진행해야 함
주요 Solana 피싱 유형:
- "무료 NFT Mint" 페이지
- "Solana 에어드롭" 수령
- 가짜 Jupiter / Raydium 위장 사이트
방어 원칙은 이더리움과 동일합니다.
7. Approve 최적화 모범 사례
1. 매번 Approve할 때 구체적인 수량 사용
MetaMask의 Approve 알림 설정:
- MetaMask에서 Approve에 서명할 때 기본값인 Unlimited를 구체적인 수량으로 수정
- 예: 100 USDC를 거래한다면 100 USDC만 Approve(Unlimited 아님)
2. 주계정과 부계정 분리
- 주지갑(자산의 80%): 어떤 컨트랙트에도 절대 Approve하지 않음
- 부지갑(자산의 20%): 일상적인 DeFi 상호작용
- 테스트 지갑(자산의 1% 미만): 고위험 테스트
3. 오래된 프로토콜 승인 취소
매월 점검:
- 6개월 이상 사용하지 않은 프로토콜 승인 취소
- 이미 폐기된 프로토콜 승인 취소
- 의심스러운 도메인의 승인 취소(과거에는 합법적으로 보였더라도)
4. "조합 서명" 경계
- 여러 Approve가 한 거래에 포함됨
- 사용자가 식별하기 어려움
- 한 번의 서명으로 모두 잃을 수 있음
5. 서명 해석 도구 사용
- Rabby Wallet: 서명의 실제 효과를 표시
- Pocket Universe: 유료, 상세한 해석 제공
- Wallet Guard: 피싱 사이트 + 서명 경고
Q: 한 번에 모든 Approve를 취소할 수 있나요?
"일괄 전체 취소" 기능은 없습니다:
- 각 Approve는 독립적인 온체인 거래
- 하나씩 취소해야 함
- 여러 취소를 같은 블록에 묶을 수는 있지만(여전히 여러 건의 거래)
일부 도구는 "대기열" 방식의 일괄 처리를 제공합니다:
- Revoke.cash: 여러 승인을 선택 → 차례로 서명 → 차례로 온체인 반영
- 건당 여전히 가스 소모
8. 특수 상황: NFT Approve
NFT에도 Approve 메커니즘이 있습니다:
- setApprovalForAll: 특정 컨트랙트가 특정 컬렉션의 모든 NFT를 관리하도록 승인
- 예: OpenSea에서 NFT를 판매하려면 → OpenSea 컨트랙트에 반드시 setApprovalForAll해야 함
NFT Approve의 위험:
- Unlimited 성격: setApprovalForAll은 "해당 컬렉션 전체 NFT에 대한 무제한 승인"
- 프로토콜 해킹: OpenSea / Blur 등이 해킹당하면 모든 사용자의 NFT가 인출될 수 있음
- 피싱 시나리오: OpenSea / Blur를 위장해 사용자에게 setApprovalForAll을 유도
실제 사례:
2024년 5월 한 사용자가 OpenSea를 위장한 사이트에서 setApprovalForAll에 서명해 악성 컨트랙트가 자신의 BAYC NFT를 관리하도록 승인했습니다. 이후 BAYC는 즉시 공격자 주소로 이전되었고, 손실액은 약 12만 달러였습니다.
NFT Approve의 취소:
- Revoke.cash 지원
- Etherscan Token Approval Checker 지원
- ERC20 Approve 취소와 절차가 유사함
Q: OpenSea / Blur에서 NFT를 팔 때 반드시 승인해야 하나요?
네. 주요 NFT 마켓은 판매를 위해 반드시 승인이 필요합니다:
- OpenSea: OpenSea 컨트랙트에 setApprovalForAll
- Blur: Blur 컨트랙트에 setApprovalForAll
- Magic Eden: Magic Eden 컨트랙트에 setApprovalForAll
안전한 방법:
- NFT를 판매한 후에는 즉시 setApprovalForAll을 취소
- 다시 판매할 때 재승인
- 번거롭지만 안전함
9. 자주 묻는 질문
Q: Approve 한 번에 최소 가스는 얼마인가요?
이더리움 메인넷 Approve 표준 가스:
- 기본 Approve: 약 46000 가스
- 현재 가스 가격 30 Gwei 기준: 약 5달러
L2 / Polygon / BSC에서는 Approve가 보통 1달러 미만입니다.
Q: 취소한 Approve를 다시 활성화할 수 있나요?
직접 재활성화는 불가능합니다. 취소하면 "승인한 적 없는 상태"가 되어 다시 Approve해야 합니다:
Q: 모든 ERC20 토큰이 Approve가 필요한가요?
네. 모든 ERC20 표준 토큰은 Approve 메커니즘을 따릅니다:
- USDC / USDT / WETH / DAI 등 스테이블코인
- UNI / LINK / AAVE 등 거버넌스 토큰
- 어떤 프로젝트 토큰이든
예외:
- ETH(이더리움 네이티브 코인): Approve 불필요(직접 transfer)
- BTC: Approve 불필요(스마트 컨트랙트 없음)
- Solana SPL: 메커니즘이 다름("서명 승인")
Q: Approve하면 토큰이 잠기나요?
아닙니다. Approve는 토큰을 잠그지 않습니다:
- Approve는 단지 컨트랙트가 인출하도록 "허용"하는 것
- 토큰은 여전히 사용자 지갑에 있고 정상적으로 사용 가능
- 사용자는 Approve가 있어도 언제든 토큰을 전송할 수 있음
Approve는 "신용카드 한도"와 비슷합니다. 가맹점에 신용 한도를 부여하지만 돈은 여전히 내 은행 계좌에 있는 것과 같습니다.
Q: Permit 서명은 어떻게 취소하나요?
Permit 서명은 직접 "취소"할 수 없지만, 간접적인 방법이 있습니다.
- 컨트랙트 nonce 변경: 컨트랙트의 incrementNonce를 호출해 Permit을 무효화
- 지갑을 사용하지 않음: Permit에는 만료 시간이 있어 만료되면 자동 무효화
- 새 지갑 생성: 자산을 완전히 새 지갑으로 이전
Permit 보안의 핵심은 예방입니다. Permit 서명 전에는 항상 꼼꼼히 확인하세요.
Q: USDT와 USDC의 Approve 위험은 같은가요?
전반적으로 비슷하지만 세부적인 차이가 있습니다.
- USDT: approve(spender, X)를 하려면 먼저 approve(spender, 0)을 해야 함(표준 ERC20은 이 단계가 필요 없음)
- USDC: 표준 ERC20 + Permit 지원(EIP-2612)
- DAI: 초기 버전이 Permit을 지원(독자적인 구현)
Q: 한 지갑의 과거 모든 Approve 기록을 확인할 수 있나요?
가능합니다.
- Etherscan: 주소 페이지 → "Token Txns" → Approve로 필터링
- Revoke.cash: 현재 활성화된 승인만 표시(취소된 것은 표시 안 함)
- DeBank: 주소 프로필 + 승인 기록
Q: Approve를 취소하면 즉시 적용되나요?
네. Revoke가 온체인에서 확인되면 즉시 적용됩니다:
- 온체인 allowance(user, spender)가 즉시 0으로 변경
- 컨트랙트는 더 이상 transferFrom을 호출할 수 없음
- 전체 네트워크 노드에 동기화(5~30초)
Q: 여러 지갑의 승인을 한 번에 Revoke할 수 있나요?
불가능합니다. 각 지갑은 독립적입니다:
- 각 지갑마다 별도로 Revoke.cash에 연결해야 함
- 승인 목록을 독립적으로 점검
- 독립적으로 취소
여러 지갑을 쓰는 사용자: 매달 각 지갑을 개별적으로 점검해야 합니다.
데이터 출처
- ERC20 표준 프로토콜(EIP-20)
- EIP-2612 Permit 표준
- Revoke.cash 도구 문서
- SlowMist Approve 피싱 사례 모음
- Chainalysis 온체인 사건 분석
위험 고지: 이 글은 독립적인 제3자가 정리한 것으로 투자 조언을 구성하지 않습니다. Approve는 DeFi의 주요 공격 벡터이며, 정기 점검과 취소는 기본적인 보안 실천입니다. 모든 데이터는 2026년 4월 기준입니다.