SSP에서 토큰 승인 취소하기

·7분 읽기·작성자: SSP Editorial Team
SSP 지갑에서 ERC-20 토큰 승인을 취소하는 일러스트. allowance가 0으로 재설정되고 SSP Key가 트랜잭션을 함께 서명하는 모습.

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자 도구에 연결하고 싶지 않을 때 유용합니다.

  1. 해당 토큰의 컨트랙트 페이지를 적절한 익스플로러에서 엽니다:
    • Ethereum: etherscan.io
    • Polygon: polygonscan.com
    • Base: basescan.org
    • BNB Smart Chain: bscscan.com
    • Avalanche: snowtrace.io
  2. Contract 탭으로 가서 Write Contract(토큰이 프록시 컨트랙트라면 Write as Proxy — 주요 스테이블코인 대부분이 그렇습니다)로 이동합니다.
  3. approve 함수를 찾습니다. 입력값은 spender(취소하려는 주소)와 amount(새 allowance)입니다.
  4. amount0으로 설정합니다. Spender 주소는 붙여넣으세요 — 이전 거래 기록에서 복사하세요. 절대 외워서 입력하지 마세요.
  5. 지갑을 연결합니다. 대부분의 익스플로러는 WalletConnect를 지원하며, 이것이 SSP를 연결하는 권장 방식입니다. extension에서 연결 요청을 승인합니다.
  6. Write를 클릭합니다. 익스플로러가 approve(spender, 0) 트랜잭션을 구성하여 SSP로 전달합니다. SSP의 extension이 호출 세부 정보를 보여주고, SSP Key가 함께 서명하며, 취소가 브로드캐스트됩니다.

이 경로는 다소 장황하지만, 당신이 무엇에 서명했는지에 대한 모호함이 전혀 없습니다.

경로 2: 전용 취소 도구 사용

대부분의 사용자에게는 이쪽이 실용적입니다. revoke.cash는 이 작업에 널리 쓰이는 오픈 소스 도구입니다. 지원되는 체인 전반에서 당신의 주소를 스캔하고, 활성 allowance를 모두 나열하며, 위험한 것(무제한 금액, 익숙하지 않은 컨트랙트)을 표시하고, 연결된 지갑을 통해 — 개별 혹은 일괄 — 취소할 수 있게 합니다.

흐름:

  1. 브라우저에서 직접 revoke.cash를 엽니다. 진짜 도메인을 북마크하고 그 북마크로만 접속하세요. 취소 도구의 피싱 복제본이 존재하는 이유는 사용자들이 거기에 도착했을 때 이미 트랜잭션 서명을 할 준비가 되어 있기 때문입니다.
  2. WalletConnect로 연결한 다음, QR 코드를 스캔하거나 URI를 SSP에 붙여넣습니다.
  3. 체인 선택기를 감사하고 싶은 체인으로 전환합니다. revoke.cash가 그 체인에서의 당신의 승인을 가져옵니다.
  4. 목록을 확인합니다. 각 행은 토큰, spender, allowance 수량, 그리고 보통은 dApp의 라벨을 보여줍니다.
  5. 더 이상 쓰지 않는 항목 옆의 Revoke를 클릭합니다. 각 취소는 별도의 approve(spender, 0) 트랜잭션이며 SSP가 함께 서명합니다.

실용적인 감사 워크플로

매년 한두 번, 20분을 따로 떼어내서 이 흐름을 거치세요:

  1. WalletConnect로 SSP를 revoke.cash에 연결하세요.
  2. 사용했던 각 체인의 활성 승인을 검토하세요. 역사적으로 가장 빽빽한 승인 그래프인 Ethereum부터 시작해서 Polygon, Base, BNB Smart Chain, Avalanche로 진행합니다.
  3. 가장 위험한 항목을 먼저 잡으세요. 무제한 allowance와 낯선 dApp 이름을 기준으로 정렬하거나 훑어보세요. 2024년에 한 번 swap하고 다시 손대지 않은 프로토콜이 일순위 후보입니다. 정체가 전혀 파악되지 않는 컨트랙트도 마찬가지입니다.
  4. 취소합니다. SSP extension에서 트랜잭션을 확인합니다. SSP Key가 함께 서명할 것을 요청합니다. 취소가 브로드캐스트됩니다.
  5. SSP Key에서 함께 서명하세요. 이 순간이 목적지를 한 번 더 확인하는 때입니다. SSP Key는 당신이 호출 중인 컨트랙트와 함수를 보여줍니다 — 둘 다 의도한 것과 일치하는지 확인하세요.
  6. 체인마다 반복합니다. 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 에서 시작하고, 왜 이것이 중요한지 다시 떠올리고 싶다면 토큰 승인: 당신이 계속 부여하고 있는 권한 으로 돌아가세요.

이 글 공유하기

관련 글