토큰 승인 확인 방법은? 지갑 보안을 지키는 방법
토큰 승인(Token Approval)은 DeFi 상호작용에서 가장 일반적인 작업 중 하나이며, 지갑 보안에서 가장 쉽게 간과되는 위험 요소이기도 합니다. DEX에서 토큰을 교환하거나 DeFi 프로토콜에 참여할 때마다 보통 먼저 컨트랙트에 토큰 사용을 승인해야 합니다. 악성 컨트랙트를 승인하거나 승인 한도가 과도하게 높으면 자산이 도난당할 위험에 처할 수 있습니다. 본 글에서는 토큰 승인 메커니즘과 안전 관리 방법을 종합적으로 해설합니다.
1. 토큰 승인 메커니즘 상세 해설
1.1 토큰 승인이란
이더리움 및 EVM 호환 체인에서 ERC-20 토큰 표준에는 approve 함수가 정의되어 있습니다. 특정 DApp(예: Uniswap)에서 토큰을 교환할 때 프로세스는 다음과 같습니다:
- 승인 단계(Approve): Uniswap의 Router 컨트랙트에 지갑의 특정 토큰 사용을 승인
- 거래 단계(Swap): Uniswap의 컨트랙트가 지갑에서 토큰을 가져와 교환 완료
왜 두 단계가 필요한가? ERC-20 토큰 자체가 스마트 컨트랙트이며, 잔액이 토큰 컨트랙트에 기록되기 때문입니다. 다른 컨트랙트(예: DEX 라우터 컨트랙트)가 토큰을 조작하려면 먼저 토큰 컨트랙트의 승인을 받아야 합니다.
1.2 승인의 기술 원리
approve(spender, amount)
- spender: 승인을 받는 컨트랙트 주소
- amount: 승인 한도
spender가 transferFrom을 호출하여 주소에서 토큰을 전송할 때, 토큰 컨트랙트는 승인 한도가 충분한지 확인합니다.
1.3 무제한 승인 문제
대부분의 DApp은 기본적으로 무제한 승인(Maximum Approval)을 요청합니다:
amount = 2^256 - 1 (천문학적 숫자)
이것은 다음을 의미합니다: 승인된 컨트랙트가 언제든지 지갑에 있는 해당 토큰의 전체 잔액을 전송할 수 있으며, 다시 승인을 받을 필요가 없습니다.
DApp이 무제한 승인을 사용하는 이유:
- 사용자가 한 번만 승인하면 이후 거래에서 반복 승인이 불필요
- Gas 수수료 절약(매번 승인마다 온체인 트랜잭션이 필요)
- 사용자 경험 개선(작업 단계 감소)
하지만 위험은:
- 승인된 컨트랙트에 취약점이 있으면 공격자가 이를 이용하여 토큰을 전송할 수 있음
- 실수로 악성 컨트랙트를 승인하면 토큰이 즉시 전송될 수 있음
- 해당 DApp을 더 이상 사용하지 않아도 승인이 유효한 상태로 유지
2. 승인 위험 사례
2.1 실제 보안 사건
사례 1: BadgerDAO 공격(2021년)
- 공격자가 프론트엔드에 악성 스크립트를 주입
- 사용자가 악성 컨트랙트를 승인하도록 유도
- 승인을 이용하여 사용자 자산을 전송
- 약 1.2억 달러 손실
사례 2: Transit Swap 공격(2022년)
- 애그리게이터 컨트랙트 취약점이 악용
- 공격자가 사용자의 무제한 승인을 이용
- 취약점을 통해 사용자 토큰을 전송
- 약 2,300만 달러 손실
2.2 일반적인 승인 위험 시나리오
| 시나리오 | 위험 등급 | 설명 |
|---|---|---|
| 유명 프로토콜(Uniswap 등) 승인 | 낮음 | 감사를 받았지만 제로 리스크는 아님 |
| 새 프로젝트 컨트랙트 승인 | 중간-높음 | 컨트랙트에 취약점이나 백도어가 있을 수 있음 |
| 피싱 사이트의 컨트랙트 승인 | 극히 높음 | 악성 컨트랙트가 즉시 토큰을 전송 |
| 무제한 승인을 장기간 철회하지 않음 | 중간 | 원래 컨트랙트가 안전해도 공격 표면 증가 |
3. 토큰 승인 확인 도구
3.1 Revoke.cash
정의: 가장 유명한 토큰 승인 관리 도구입니다.
지원 체인: 이더리움, BSC, Polygon, Arbitrum, Optimism, Avalanche 등 50개 이상의 체인.
사용 방법:
revoke.cash방문- 지갑 연결 또는 주소 직접 입력
- 확인할 블록체인 네트워크 선택
- 페이지에 모든 토큰 승인 기록이 나열됨
표시 정보:
- 토큰명: 승인된 토큰
- 승인 한도: 무제한(Unlimited) 또는 구체적인 수량
- 승인 대상: 승인을 받은 컨트랙트 주소 및 레이블
- 마지막 업데이트: 승인 시점
승인 철회 단계:
- 철회할 승인 기록을 찾음
- "Revoke" 버튼 클릭
- 지갑에서 트랜잭션 확인
- 소량의 Gas 수수료 지불
- 승인이 철회됨
3.2 Etherscan Token Approval Checker
접속 주소: etherscan.io/tokenapprovalchecker
사용 방법:
- 위 주소 방문
- 지갑 연결 또는 주소 입력
- ERC-20 및 ERC-721의 승인 목록 확인
- "Revoke"를 클릭하여 불필요한 승인 철회
장점: Etherscan 공식 도구로서 데이터 정확성이 보장됩니다.
3.3 BscScan Token Approval Checker
접속 주소: bscscan.com/tokenapprovalchecker
기능은 Etherscan 버전과 동일하며, BSC 체인 전용입니다.
3.4 DeBank 승인 관리
DeBank의 자산 패널에서도 승인 관리 기능을 제공합니다:
- DeBank에서 주소를 확인
- "Approval" 또는 "승인" 탭을 찾음
- 모든 승인을 확인하고 관리
3.5 도구 비교
| 도구 | 지원 체인 수 | 인터페이스 | 철회 기능 | 무료 |
|---|---|---|---|---|
| Revoke.cash | 50+ | 간결 | 지원 | 예 |
| Etherscan | 이더리움만 | 표준 | 지원 | 예 |
| BscScan | BSC만 | 표준 | 지원 | 예 |
| DeBank | 100+ | 종합 | 지원 | 기본 무료 |
| Rabby Wallet | 멀티체인 | 통합 | 지원 | 예 |
4. 승인 관리 모범 사례
4.1 승인 전 확인
컨트랙트를 승인하기 전에:
- 웹사이트 진위 확인: URL이 정확한지 확인하여 피싱 사이트를 방지
- 컨트랙트 검증 확인: 블록체인 탐색기에서 컨트랙트 코드가 공개되었는지 확인
- 승인 대상 파악: 어떤 컨트랙트를 승인하는지 확인
- 승인 한도 고려: 정말로 무제한 승인이 필요한지 고려
4.2 정확한 승인 사용
많은 지갑과 DApp이 커스텀 승인 한도를 지원합니다:
MetaMask에서 승인 한도 수정:
- 승인 팝업이 나타나면 "권한 편집" 클릭
- "커스텀 지출 한도"에 이번 거래에 필요한 정확한 금액 입력
- 수정된 승인을 확인
정확한 승인의 장점:
- 컨트랙트가 공격받아도 손실 한도가 승인 한도로 제한
- 매번 사용할 때마다 재승인이 필요하여 Gas가 더 들지만 더 안전
정확한 승인의 단점:
- 매번 두 건의 트랜잭션이 필요(승인+작업)
- Gas 수수료 지출 증가
- 작업 단계가 더 많음
4.3 정기적인 승인 정리
정기적으로 승인을 확인하는 습관을 들이는 것이 좋습니다:
확인 빈도 권장:
- 활발한 DeFi 사용자: 주 1회
- 일반 사용자: 월 1회
- 대액 자산 지갑: 매 작업 후 확인
우선 철회할 승인:
- 더 이상 사용하지 않는 DApp
- 미확인 또는 식별할 수 없는 컨트랙트
- 보안 사건이 발생한 프로젝트
- 승인 한도가 무제한인 오래된 승인
4.4 지갑 격리 전략
용도별로 자산을 다른 지갑에 분산:
| 지갑 유형 | 용도 | 승인 전략 |
|---|---|---|
| 핫 월렛(소액) | 일상 DeFi 상호작용 | 승인 가능, 정기적으로 정리 |
| 웜 월렛(중액) | 대액 DeFi 작업 | 정확한 승인, 자주 정리 |
| 콜드 월렛(대액) | 장기 보관 | 가능하면 어떤 컨트랙트도 승인하지 않음 |
4.5 보안 지갑 기능 활용
일부 지갑은 승인 관리 기능을 내장하고 있습니다:
Rabby Wallet:
- 트랜잭션 전 승인 위험 평가 표시
- 고위험 승인 요청 표시
- 내장 승인 관리 페이지
MetaMask Snaps:
- 일부 보안 관련 Snaps가 승인 전 경고를 발송
- 악성 컨트랙트 식별에 도움
5. ERC-721(NFT) 승인
5.1 NFT 승인 유형
NFT 승인은 ERC-20보다 더 복잡하며 두 가지 유형이 있습니다:
단일 NFT 승인:
approve(operator, tokenId)
특정 하나의 NFT에 대한 조작만 승인합니다.
전체 컬렉션 승인(setApprovalForAll):
setApprovalForAll(operator, true)
해당 NFT 컨트랙트에서 보유한 모든 NFT에 대한 조작을 승인합니다.
5.2 NFT 승인 위험
setApprovalForAll의 위험은 매우 높습니다:
- 한번 승인하면 상대방이 해당 컬렉션의 모든 NFT를 전송 가능
- 이것은 NFT 피싱 공격의 주요 수단
- 많은 NFT 마켓플레이스(예: OpenSea)에서 NFT 판매를 위해 이 승인이 필요
방어 권장사항:
- 신뢰할 수 있는 NFT 마켓플레이스에서만
setApprovalForAll승인 - NFT 거래 완료 후 승인 철회를 고려
- Revoke.cash 등의 도구로 NFT 승인 확인
- 고가치 NFT는 별도의 콜드 월렛에 보관
6. Permit 서명 위험
6.1 Permit이란
ERC-20 Permit(EIP-2612)은 새로운 유형의 승인 방식입니다. 전통적인 approve와 달리 Permit은 오프체인 서명으로 승인하며, 온체인 트랜잭션을 전송할 필요가 없습니다.
작동 흐름:
- 사용자가 지갑으로 Permit 메시지에 서명(온체인에 올리지 않으며 Gas를 소비하지 않음)
- 서명을 컨트랙트에 전달
- 컨트랙트가 서명을 검증한 후 승인을 획득
6.2 Permit의 위험
Permit 서명은 "서명 요청"처럼 보여 쉽게 간과됩니다:
- 사용자가 토큰을 승인하고 있다는 사실을 모를 수 있음
- 피싱 사이트가 사용자에게 Permit 서명을 유도할 수 있음
- 서명 자체가 온체인에 올라가지 않으므로 Revoke.cash 등의 도구가 사용되지 않은 Permit 서명을 감지할 수 없음
6.3 Permit 피싱 방어
- 서명 내용을 주의 깊게 읽기: MetaMask가 Permit 서명의 상세 정보를 표시
- 서명 유형에 주의: "Permit" 또는 "allowance" 등의 문구가 보이면 각별히 주의
- 이해할 수 없는 내용에 서명하지 않기: 확실하지 않은 서명 요청은 거부
- 보안 지갑 사용: Rabby 등의 지갑이 Permit 서명에 대해 명확한 경고를 표시
7. 긴급 상황 대처
7.1 의심스러운 승인 발견 시
지갑에 알 수 없는 승인이 있는 것을 발견하면:
- 즉시 철회: Revoke.cash를 사용하여 모든 의심스러운 승인을 철회
- 자산 확인: 자산이 전송되었는지 확인
- 자산 이전: 남은 자산을 새로운 안전한 지갑으로 이전
- 원인 조사: 의심스러운 웹사이트를 방문했거나 불명의 요청에 서명했는지 회상
7.2 자산이 이미 도난된 경우
승인 취약점을 통해 자산이 전송된 경우:
- 모든 승인을 즉시 철회: 추가 자산 도난 방지
- 남은 자산 이전: 아직 남아있는 자산을 새 지갑으로 이전
- 증거 기록: 트랜잭션 해시, 공격자 주소 등의 정보 보존
- 신고: 관련 체인의 보안 팀 및 커뮤니티에 보고
- 방어 의식 강화: 교훈을 얻고 이후의 승인 관리를 강화
7.3 철회 경쟁
일부 상황에서 공격자가 승인을 철회하기 전에 자산을 전송할 수 있습니다. 이 경우:
- 승인 철회 트랜잭션이 최대한 빨리 온체인에 올라야 함
- Gas 수수료를 높여 트랜잭션 확인을 가속화
- Gas가 높은 체인(예: 이더리움)에서는 시간과의 경쟁
8. 승인 보안 체크리스트
매 DeFi 상호작용 전:
- [ ] 웹사이트 URL이 정확한지 확인
- [ ] 승인하는 컨트랙트 주소가 합리적인지 확인
- [ ] 무제한 승인 대신 정확한 승인 사용 고려
- [ ] 서명하는 내용을 이해하고 있는지 확인
매주/매월:
- [ ] Revoke.cash를 사용하여 모든 체인의 승인 확인
- [ ] 더 이상 사용하지 않는 DApp의 승인 철회
- [ ] 알 수 없는 승인 기록이 있는지 확인
- [ ] 특히 NFT의
setApprovalForAll승인을 확인
지갑 보안:
- [ ] 대액 자산은 별도의 보관 지갑 사용
- [ ] 일상 DeFi 상호작용에는 소액 핫 월렛 사용
- [ ] 대액 트랜잭션 서명에 하드웨어 지갑 사용
- [ ] 지갑의 보안 경고 기능 활성화
요약
토큰 승인은 DeFi 운영의 기반 메커니즘이지만, 지갑 보안에서 가장 자주 악용되는 공격 입구 중 하나이기도 합니다. 승인 메커니즘의 원리를 이해하고, Revoke.cash 등의 도구로 정기적으로 승인을 확인하고 정리하며, 정확한 승인 및 지갑 격리 등의 전략을 채택하면 승인으로 인한 보안 위험을 크게 줄일 수 있습니다.
기억하세요: 모든 승인은 제3자 컨트랙트에 대한 신뢰입니다. 블록체인 세계에서 검증은 항상 신뢰보다 중요합니다.
안드로이드 사용자는 APK를 직접 다운로드할 수 있습니다. VPN 불필요.