
SSP에서 토큰 승인 취소하기
EVM 체인에서 swap, 입금, NFT 리스팅을 승인할 때마다 당신은 dApp에게 특정 ERC-20 토큰을 당신을 대신해 옮길 수 있는 권한을 부여합니다. 이 권한 — 승인(approval) 또는 allowance라 부릅니다 — 은 거래가 정산된 뒤에도 on-chain에 남습니다. 몇 달이 지나도, 3월에 신뢰했던 컨트랙트가 6월에 그 토큰을 그대로 비워갈 권한을 가지고 있을 수 있습니다. 해결책은 명확합니다. 더 이상 필요하지 않은 승인을 취소하세요. 본 가이드는 SSP에서 그것을 수행하는 방법을 보여줍니다. SSP는 self-custodial 2-of-2 wallet으로, 모든 트랜잭션(취소 포함)을 SSP Key가 함께 서명합니다.
이 개념이 처음이라면 먼저 토큰 승인: 당신이 계속 부여하고 있는 권한 을 읽어 보세요. 왜 승인이 존재하는지, 왜 무제한 allowance가 DeFi에서 기본 공격 표면이 되는지 설명합니다. 이 글은 그 정리편에 해당합니다.
빠른 복습
approve(spender, amount) 호출에 서명하면, 토큰 컨트랙트는 spender(보통 라우터, vault, 마켓플레이스 컨트랙트)가 당신의 주소에서 해당 토큰을 최대 amount만큼 옮길 수 있다는 사실을 기록합니다. 많은 dApp은 이후 상호작용에서 gas를 아끼기 위해 2^256 - 1 — 사실상 무제한 — 을 요청합니다. 이 편리함이 곧 위험입니다. 나중에 spender 컨트랙트가 침해되거나, dApp을 더 이상 쓰지 않더라도 allowance가 남아 있다면, 공격자는 언제든 잔액 전체를 비워갈 수 있습니다.
취소는 그 부여를 되돌립니다. 과거 전송을 되돌리지도, 무언가를 "삭제"하지도 않습니다. 단지 allowance를 다시 0으로 만드는 것뿐입니다.
취소가 기술적으로 어떻게 동작하는가
취소도 그저 또 하나의 트랜잭션입니다. 원래 승인이 발급된 것과 동일한 토큰 컨트랙트에, 동일한 체인에서 approve(spender, 0)을 호출합니다. 이 단일 함수 호출이 컨트랙트의 allowance[owner][spender] 매핑에 새 0을 써넣어 이전 값을 덮어씁니다.
내재화할 만한 몇 가지 기술적 포인트:
- 체인마다, token-spender 쌍마다 한 번의 취소. Ethereum에서 USDC spender를 승인했고 Polygon에서도 같은 spender를 승인했다면, 취소 트랜잭션이 두 번 필요합니다 — 체인당 하나씩. Allowance는 체인 간에 공유되지 않습니다.
- 취소는 독립된 트랜잭션입니다. 다른 전송과 마찬가지로 gas가 듭니다. 미리 준비하세요. 수수료를 충당하기 위해 해당 체인의 네이티브 자산(Ethereum에서는 ETH, Polygon에서는 MATIC 등)을 갖춰 두세요.
- 걱정보다 저렴할 수 있습니다. 취소는 단순한 쓰기 작업이고, swap보다 저렴한 경우가 많습니다. Base 같은 Layer 2에서는 보통 푼돈입니다.
- SSP는 여전히 함께 서명합니다. SSP는 2-of-2 wallet이기 때문에, 취소 트랜잭션도 다른 트랜잭션과 같은 흐름을 거칩니다. extension이 제안하고, SSP Key가 검토하여 함께 서명합니다. 당신의 보호는 정리 작업 그 자체에까지 확장됩니다 — 어느 단일 기기도 일방적으로 취소할 수 없고, 어느 단일 기기도 취소로 가장한 무언가를 승인하도록 속을 수 없습니다.
취소로 가는 두 가지 경로
SSP에서 승인을 취소하는 방식은 똑같이 유효한 두 가지가 있습니다. 상황에 맞는 쪽을 고르세요.
경로 1: 신뢰할 만한 블록 익스플로러 사용
수동적이고 투명한 길입니다. 어떤 토큰의 어떤 spender를 취소할지 정확히 알고 있을 때, 또는 제3자 도구에 연결하고 싶지 않을 때 유용합니다.
- 해당 토큰의 컨트랙트 페이지를 적절한 익스플로러에서 엽니다:
- Ethereum: etherscan.io
- Polygon: polygonscan.com
- Base: basescan.org
- BNB Smart Chain: bscscan.com
- Avalanche: snowtrace.io
- Contract 탭으로 가서 Write Contract(토큰이 프록시 컨트랙트라면 Write as Proxy — 주요 스테이블코인 대부분이 그렇습니다)로 이동합니다.
approve함수를 찾습니다. 입력값은spender(취소하려는 주소)와amount(새 allowance)입니다.amount를0으로 설정합니다. Spender 주소는 붙여넣으세요 — 이전 거래 기록에서 복사하세요. 절대 외워서 입력하지 마세요.- 지갑을 연결합니다. 대부분의 익스플로러는 WalletConnect를 지원하며, 이것이 SSP를 연결하는 권장 방식입니다. extension에서 연결 요청을 승인합니다.
- Write를 클릭합니다. 익스플로러가
approve(spender, 0)트랜잭션을 구성하여 SSP로 전달합니다. SSP의 extension이 호출 세부 정보를 보여주고, SSP Key가 함께 서명하며, 취소가 브로드캐스트됩니다.
이 경로는 다소 장황하지만, 당신이 무엇에 서명했는지에 대한 모호함이 전혀 없습니다.
경로 2: 전용 취소 도구 사용
대부분의 사용자에게는 이쪽이 실용적입니다. revoke.cash는 이 작업에 널리 쓰이는 오픈 소스 도구입니다. 지원되는 체인 전반에서 당신의 주소를 스캔하고, 활성 allowance를 모두 나열하며, 위험한 것(무제한 금액, 익숙하지 않은 컨트랙트)을 표시하고, 연결된 지갑을 통해 — 개별 혹은 일괄 — 취소할 수 있게 합니다.
흐름:
- 브라우저에서 직접
revoke.cash를 엽니다. 진짜 도메인을 북마크하고 그 북마크로만 접속하세요. 취소 도구의 피싱 복제본이 존재하는 이유는 사용자들이 거기에 도착했을 때 이미 트랜잭션 서명을 할 준비가 되어 있기 때문입니다. - WalletConnect로 연결한 다음, QR 코드를 스캔하거나 URI를 SSP에 붙여넣습니다.
- 체인 선택기를 감사하고 싶은 체인으로 전환합니다. revoke.cash가 그 체인에서의 당신의 승인을 가져옵니다.
- 목록을 확인합니다. 각 행은 토큰, spender, allowance 수량, 그리고 보통은 dApp의 라벨을 보여줍니다.
- 더 이상 쓰지 않는 항목 옆의 Revoke를 클릭합니다. 각 취소는 별도의
approve(spender, 0)트랜잭션이며 SSP가 함께 서명합니다.
실용적인 감사 워크플로
매년 한두 번, 20분을 따로 떼어내서 이 흐름을 거치세요:
- WalletConnect로 SSP를 revoke.cash에 연결하세요.
- 사용했던 각 체인의 활성 승인을 검토하세요. 역사적으로 가장 빽빽한 승인 그래프인 Ethereum부터 시작해서 Polygon, Base, BNB Smart Chain, Avalanche로 진행합니다.
- 가장 위험한 항목을 먼저 잡으세요. 무제한 allowance와 낯선 dApp 이름을 기준으로 정렬하거나 훑어보세요. 2024년에 한 번 swap하고 다시 손대지 않은 프로토콜이 일순위 후보입니다. 정체가 전혀 파악되지 않는 컨트랙트도 마찬가지입니다.
- 취소합니다. SSP extension에서 트랜잭션을 확인합니다. SSP Key가 함께 서명할 것을 요청합니다. 취소가 브로드캐스트됩니다.
- SSP Key에서 함께 서명하세요. 이 순간이 목적지를 한 번 더 확인하는 때입니다. SSP Key는 당신이 호출 중인 컨트랙트와 함수를 보여줍니다 — 둘 다 의도한 것과 일치하는지 확인하세요.
- 체인마다 반복합니다. Allowance는 체인 단위입니다. Ethereum에서의 취소가 Polygon까지 정리해 주리라 가정하지 마세요.
처음부터 다 비울 필요는 없습니다. 목표는 활발히 사용하는 컨트랙트의 allowance는 유지하고 나머지는 0으로 만드는 것입니다.
주의 사항
- 도메인 위생. 공식 도메인
revoke.cash만 사용하세요. 피싱 복제본은 사용자가 이미 트랜잭션 서명 모드에 들어와 있기 때문에 정확히 이 흐름을 노립니다. 북마크하고, 연결 전에 URL 표시줄을 확인하세요. - 체인별 현실. Ethereum에서 USDC 승인을 취소해도, 포트폴리오에서 토큰이 "같아 보여도" Polygon의 USDC 승인은 건드리지 않습니다. 체인마다 명시적으로 돌아보세요.
- gas 예산. 취소는 gas가 듭니다. Ethereum에서는 미뤄둔 취소가 누적되면 비용이 늘 수 있습니다. gas가 잔잔할 때 하세요. Layer 2에서는 비용이 거의 무시할 만한 수준입니다.
- 항상 spender를 확인하세요. 어떤 "취소" 트랜잭션이든 서명하기 전에, 호출 안의 spender 주소가 당신이 취소하려던 컨트랙트와 일치하는지 확인하세요. 악성 사이트는 가짜 취소 UI를 보여주면서 실제로는 공격자에게 새로운 승인을 발행할 수 있습니다. SSP Key 프롬프트에서 함수 이름(
approve)과 수량(0)을 읽는 것이 당신의 마지막 방어선입니다. - permit은 다른 이야기입니다. 일부 토큰(USDC, DAI 변종 등)은
permit— 승인처럼 동작하는 off-chain 서명 — 을 지원합니다. revoke.cash는 알고 있는 범위에서 permit 기반의 부여를 표시해 줍니다. 인식하지 못하는 것은 모두 on-chain allowance처럼 다루세요.
정리에서의 2-of-2 강점
자주 놓치는 지점은 이것입니다. SSP에서의 취소는 단일 기기에서의 단일 클릭이 아닙니다. extension이 취소를 기안하지만, 그것만으로 브로드캐스트할 수 없습니다. SSP Key가 함께 서명해야 하며, 바로 그 함께 서명하는 단계가 실제로 무엇이 제출되는지 점검하는 자리입니다. 만약 extension이 침해되어 실제로는 새로운 승인인 악성 "취소"를 제출하려 한다면, SSP Key는 자신의 화면에서 진짜 함수와 진짜 수량을 보여줄 것입니다. 두 기기, 문제를 잡아낼 두 번의 기회.
정기적인 승인 위생은 대부분의 사용자가 빠뜨리는, 가장 레버리지가 높은 DeFi 습관입니다. 캘린더에 알림을 설정하고, 감사를 진행하고, 더 편하게 잠드세요. 그리고 시리즈를 계속 읽어 보세요 — 체인 고유의 세부 사항을 단단히 잡고 싶다면 SSP의 Ethereum 에서 시작하고, 왜 이것이 중요한지 다시 떠올리고 싶다면 토큰 승인: 당신이 계속 부여하고 있는 권한 으로 돌아가세요.


