스왑에 approve는 필요 없다: 708초 432건이 보여준 것
커스터디얼 스왑은 지갑 연결도 토큰 승인도 필요 없습니다. 708초 동안 approve 432건, 그중 25.7%가 무제한이었습니다. 무엇을 취소해야 하는지 정리합니다.
서명을 요구하지 않는 폼.2026-11-09에 veilswap.io/exchange를 받아 문자열을 세었습니다. 46,702바이트였고 walletconnect, eth_requestAccounts, ethereum.request, MetaMask, 'connect wallet'은 모두 0회였습니다. 주문 API는 일곱 필드를 받고 다섯 개가 필수 — 페어, 금액, 지급 주소, 환불 주소 — 이며 서명은 없습니다. 같은 시간 이더리움은 다른 이야기를 하고 있었습니다. 09:57:59~10:09:47 UTC(블록 26,376,584–26,376,643, 708초)의 17,849건 거래에 approve 432건과 setApprovalForAll 26건이 포함됐습니다. 하나는 '보내라', 다른 하나는 '허용하라'고 말합니다.
approve가 실제로 쓰는 것.ERC20 토큰에는 allowance라는 매핑이 있습니다: `allowance[owner][spender]`. `approve(spender, value)`는 그 표에 한 줄을 쓸 뿐 코인을 움직이지 않습니다. 승인한 컨트랙트가 나중에 `transferFrom(owner, ...)`를 그 수치까지, 당신의 재서명 없이 호출할 수 있게 합니다. DEX 라우터가 필요한 이유는 스왑 트랜잭션 안에서 지갑의 토큰을 끌어가기 때문입니다. 커스터디얼 스왑은 다릅니다. 입금 주소로 일반 전송을 보내면 풀이 감지하고 목적지 체인에서 자체 보유 자금으로 지급합니다. 지갑은 각 구간마다 일반 전송 한 건만 서명하고, 그 외에는 없습니다.
708초의 인구 조사.approve 432건은 초당 0.61건으로 해당 창 전체 거래의 2.4%입니다. 111건이 uint256 최대값 2^256−1을 썼습니다. 승인의 25.7%, 6.4초마다 무제한 승인 한 건입니다. 53건은 0을 썼고 이는 취소로 12.3%입니다. 취소는 일상이지 특별한 일이 아닙니다. 승인 대상은 143개 서로 다른 토큰 컨트랙트였고 USDT가 106건으로 가장 많았으며 USDC 96건, WETH 11건, LINK 7건, WBTC 7건이었습니다. USDT는 106건 중 12건 무제한(11.3%), 정상 승인액 중앙값 500 USDT. USDC는 96건 중 19건 무제한(19.8%), 중앙값 673.3. 별도 10개 블록의 78건 중 77건 성공(98.7%), 가스 중앙값 48,501, 범위 24,080~120,000이었습니다. (XMR→USDT 출구 루트)
무제한이 이기는 이유와 그 비용.승인은 무료가 아닙니다. 표본 중앙값은 48,501 가스였습니다. 10:10 UTC에 읽은 0.09 gwei 기본료에서 0.00000437 ETH, ETH 2,104달러 기준 약 0.0092달러입니다. 30 gwei에서는 같은 승인이 0.001455 ETH=3.06달러, 100 gwei에서는 10.21달러입니다. 한 번 최대치로 승인하면 같은 토큰·같은 승인 대상과의 향후 거래에서 이 비용을 반복하지 않습니다. 거래는 한 문장으로 정리됩니다. 정상 수수료에서 약 3달러의 트랜잭션 한 건을 아끼는 대신, 컨트랙트에 언제든 전액을 움직일 권리를 넘깁니다. 승인 대상 컨트랙트와 자신의 키 관리를 신뢰할 때만 합리적이고, 둘 중 하나가 무너지면 아낀 몇 달러는 의미가 없습니다.
Permit, Permit2, 그리고 승인처럼 보이지 않는 서명.EIP-2612는 승인을 오프체인으로 옮겼습니다. `permit` 서명이 금액, 승인 대상, nonce, 마감을 담고 토큰 컨트랙트가 `approve` 트랜잭션 없이 받아들입니다. 가스도, 온체인 approve 기록도, '승인'이라고 표시되는 지갑 팝업도 없습니다. Permit2(0x000000000022D473030F116dDEE9F6B43aC78BA3)는 더 나아가 Permit2 컨트랙트에 온체인 승인 한 번을 하고 이후 토큰별 서명으로 전송합니다. 둘 다 정당한 도구이면서 피싱 키트가 원하는 것이기도 합니다. '승인처럼 보이지 않는 승인'을 요구할 때 쓰는 방식입니다. `setApprovalForAll`은 NFT에서 같은 모양으로, 708초에 26건이 있었고 각각 컬렉션 전체 토큰을 한 운영자에게 넘겼습니다. 커스터디얼 스왑에는 이런 것이 필요 없고, permit할 대상이 없습니다.
실제로 무엇이 잘못될 수 있나.승인만으로는 아무것도 움직이지 않습니다. 승인 대상이 `transferFrom`을 호출해야 합니다. 위험은 승인 대상이 악의적이거나, 오늘은 정직하지만 내일 침해되는 경우입니다. 그때 추가 서명 없이 언제든 승인 한도까지 이동할 수 있고, 서명이 필요 없으니 지갑 팝업도 뜨지 않습니다. USDT에서 무제한 승인은 그 주소의 USDT 전액을 뜻합니다. 새 시드로 바꿔도 옛 승인은 취소되지 않습니다. 옛 주소가 토큰을 보유하는 동안 승인은 계속 살아 있으므로 '새 지갑으로 이동'은 절반의 대책입니다. 취소는 트랜잭션 한 건이고 — 이 창의 432건 중 53건이 바로 그것 — USDT는 현재 승인이 0이 아니면 먼저 0으로 되돌려야 하므로 기존 USDT 승인 변경은 한 건이 아니라 두 건입니다. (XMR→USDT 출구 루트)
스왑 쪽도 실측.VeilSwap 주문 흐름은 승인 흐름의 반대입니다. 페어를 고르고 금액을 입력하고 지급 주소와 환불 주소를 붙여넣은 뒤 자기 지갑에서 보냅니다. 서명은 일반 전송 한 건뿐이고, 그것은 노트북이 아니라 서명 기기 화면에서 확인해야 합니다. 주문 페이지는 입금 주소와 `validUntil`을 돌려주며, 이전 실측에서 100 USDT 주문은 601초 창을 가졌고 그 앞의 견적은 120초만 유효했습니다. 주문 API는 지급 주소와 환불 주소를 서버에 보관하고 지갑 연결을 전혀 요구하지 않습니다. dapp 브라우저도, `eth_requestAccounts`도, permit도 없습니다. 흐름의 유일한 비밀은 주문 UUID 링크로, 가진 사람은 상태·금액·입금 주소를 볼 수 있지만 지급 주소와 환불 주소는 볼 수 없고, 종료 상태가 되면 해시도 반환하지 않습니다. 스스로 스왑이라 부르는 페이지가 입금 주소를 보여주기 전에 지갑 연결이나 메시지 서명을 요구하면 그것은 이 흐름이 아닙니다. (XMR→USDT 출구 루트)
승인 일곱 가지 점검.(1) 이번에 거래할 금액만 승인하고 최대치는 승인하지 마십시오. 그 승인 대상을 장기적으로 신뢰할 구체적 이유가 없다면요. (2) 모든 `permit`과 `Permit2` 서명을 승인으로 읽으십시오. 승인 대상, 금액, 마감을 확인해야 합니다. 금액이 들어 있는 '로그인' 팝업은 승인입니다. (3) 거래 후 취소하십시오 — revoke.cash 또는 Etherscan token approval checker — USDT의 0 우선 규칙을 기억하십시오. (4) 거래용 핫월렛을 따로 두십시오. 예금이 있는 지갑에서 승인하면 나쁜 컨트랙트 하나가 전액 손실이 됩니다. (5) `setApprovalForAll`은 NFT 하나가 아니라 컬렉션 전체를 넘기는 것으로 취급하십시오. (6) 승인 대상 주소 자체를 확인하십시오. 비슷한 이름의 가짜 라우터가 공격의 전부입니다. (7) 목적이 스왑 하나라면 연결하지 않는 흐름을 선호하십시오. 연결 없음은 승인 없음이고, 승인 없음은 나중에 취소할 것이 없다는 뜻입니다. (XMR→USDT 출구 루트)
경계와 라이브 스냅숏.이는 트랜잭션 입력 개수이지 보안 감사가 아닙니다. 432는 60개 블록에서 브로드캐스트된 `approve` 호출 수이고, 10개 블록 영수증 표본에서 98.7%가 성공해 약 100건 중 1건은 실패합니다. 요점은 규모이지 귀속이 아닙니다. 승인은 일상이고 그 약 4분의 1이 무제한입니다. 작성 시점(2026-11-09 10:04 UTC) 사이트는 100 USDT-TRC20을 0.14778107 XMR(XMR당 676.68달러 내재), 500을 0.829121(603.05), 1,000을 1.658805(602.84), 5,000을 8.296278(602.68)로 제시했습니다. 1 XMR은 590.223 USDT에 팔렸고, 카탈로그는 448개 자산·65개 네트워크, 그중 6개는 추가 ID가 필요했습니다. 견적은 매분 움직이고 페이지가 기준입니다. 권한 표면은 움직이지 않습니다. 스왑에 필요한 것은 전송이지 승인이 아닙니다. (XMR→USDT 출구 루트)