
Permit 서명: 트랜잭션이 아닌 승인
온체인 토큰 승인은 트랜잭션입니다. 가스비를 내면 어떤 컨트랙트가 내 토큰을 옮길 권리를 얻습니다. 토큰 승인 글은 그런 권한이 잊어버린 뒤에도 오랫동안 유효하게 남는 이유를 설명합니다.
Permit 서명은 같은 종류의 권한을 트랜잭션 없이 부여합니다. 가스비도 없고 내역에도 남지 않습니다. 오직 "서명" 버튼 하나뿐이죠. 바로 그 때문에 자산 탈취 도구가 가장 즐겨 쓰는 수법 중 하나가 되었습니다.
Permit이란
Permit은 EIP-712 표준의 구조화 데이터 형식으로 작성된 오프체인 메시지로, "이 주소가 이 토큰을 이 수량까지, 이 시점까지 사용하도록 허용한다"는 내용입니다. 서명만 할 뿐 전송하지는 않습니다. 서명을 가진 사람은 누구든 나중에 직접 가스비를 내고 체인에 제출할 수 있고, 그 순간 권한이 효력을 갖습니다.
흔한 형태는 두 가지입니다.
- EIP-2612 Permit. 토큰 컨트랙트 자체에 내장되어 있습니다(많은 스테이블코인과 최신 토큰이 지원). 토큰이 서명을 검증하고 일반적인 사용 권한을 기록합니다.
approve트랜잭션을 보낸 것과 똑같은 결과입니다. - Uniswap Permit2. 많은 앱이 모든 ERC-20 토큰에 사용하는 별도의 컨트랙트입니다. 먼저 Permit2를 온체인에서 한 번 승인하는데, 대개 한도는 무제한입니다. 그 뒤로 앱들은 서명된 Permit2 메시지를 통해 접근 권한을 얻으며, 이 권한은 토큰이 아니라 Permit2 안에 저장됩니다.
둘 다 트랜잭션 한 번을 줄여 주고, 앱이 "승인 후 스왑"을 한 단계로 묶을 수 있게 해 줍니다. 문제는 서명이 주는 느낌입니다. 트랜잭션 요청은 돈이 움직이는 것처럼 보이고, 서명 요청은 로그인처럼 보입니다.
탈취범들이 좋아하는 이유
가짜 에어드롭, 민팅, "보상 받기" 페이지가 지갑 연결을 요청한 뒤 서명 요청을 띄웁니다. 서명해도 아무 일도 일어나지 않는 것 같아서 탭을 닫습니다. 몇 분 뒤 공격자가 내 Permit을 제출해 자기 주소를 사용자로 지정하고, transferFrom을 호출해 토큰을 가져갑니다. 나는 트랜잭션을 한 번도 보내지 않았고, 가스비 경고도, 취소할 것도 없었지만 잔액은 사라졌습니다.
확인해야 할 항목
구조화 데이터 서명 요청이 나타나면 message 부분에서 다음 항목을 찾으세요.
spender— 사용할 권리를 받는 대상. 잘 알려진 앱의 컨트랙트가 아니라 모르는 주소라면 멈추세요.value(또는amount) — 수량.115792089237316195423570985008687907853269984665640564039457584007913129639935처럼 거대한 숫자는 무제한을 뜻합니다.deadline(또는expiration/sigDeadline) — 서명을 언제까지 쓸 수 있는지. 몇 년 뒤까지인 기한은 위험 신호입니다.nonce— 각 서명이 한 번만 쓰이도록 하는 카운터. 이것이 Permit을 안전하게 만들어 주지는 않습니다.
domain.name과 verifyingContract는 어떤 토큰(또는 Permit2)에 대한 권한인지 알려 주고, primaryType이 모든 것을 드러냅니다. Permit, PermitSingle, PermitBatch, PermitTransferFrom은 모두 사용 권한입니다.
구조화 데이터를 요구하는 "로그인" 페이지
진짜 로그인 요청은 대개 사이트, 내 주소, 임의의 값을 적은 일반 텍스트 메시지입니다. 이것이 무엇을 증명하는지는 메시지 서명 글에서 설명합니다. 로그인에 토큰 컨트랙트, 사용자, 수량, 기한이 들어갈 이유는 없습니다.
따라서 페이지에 "계속하려면 로그인하세요"나 "지갑을 인증하세요"라고 쓰여 있는데 요청이 Permit 같은 primaryType을 가진 구조화 데이터라면, 로그인으로 위장한 승인 요청으로 보고 거절하세요.
Permit 취소하기
서명이 이미 사용되었는지에 따라 다릅니다.
- 사용된 EIP-2612 Permit — 이제 토큰에 있는 일반적인 온체인 권한입니다. 다른 승인과 마찬가지로 0으로 설정해 취소하세요. SSP에서 토큰 승인 취소하기에서 확인하고 제거하는 방법을 안내합니다.
- Permit2 권한 — Permit2 컨트랙트 안에 있습니다. 토큰이 Permit2에 준 승인을 취소하면 여기에 의존하는 모든 앱이 차단되고, Permit2를 지원하는 취소 도구로는 개별 사용자를 제거할 수도 있습니다.
- 서명했지만 아직 사용되지 않음 — 서명은 기한까지, 또는 해당 번호가 소비될 때까지 유효합니다. 그 번호를 먼저 온체인에서 소비하면 무효화할 수 있지만(EIP-2612는 무해한 내 Permit을 직접 제출, Permit2에는 번호를 무효화하는 함수가 있음), 이미 서명을 가진 상대와의 경주입니다. 토큰을 안전한 주소로 옮기는 편이 더 빠른 경우가 많습니다. 확실한 방어는 애초에 서명하지 않는 것입니다.
SSP는 구조화 데이터를 어떻게 다루나
SSP의 EVM 계정은 두 기기가 함께 승인하는 ERC-4337 스마트 계정이며, 이 점이 상황을 바꿉니다.
무엇이 보이나. SSP Wallet에서 구조화 데이터 서명 요청(WalletConnect 경유)은 요청한 사이트, 내 주소와 네트워크, 그리고 서식이 적용된 JSON으로 된 EIP-712 데이터 전체를 보여 줍니다. Permit 전용 해석은 없어서 "이것은 어떤 주소가 USDC를 무제한 사용하도록 허용합니다" 같은 요약이 나오지 않으므로, 위 항목들은 직접 읽어야 합니다. 이어서 SSP Key는 도메인 이름과 primaryType이 담긴 한 줄 요약(예: USD Coin과 Permit)을 보여 주고, 원본 데이터는 토글 뒤에 있습니다. 무엇이든 서명되기 전에 두 기기 모두의 승인이 필요합니다.
Permit이 적용되나. 대부분의 EIP-2612 Permit은 ecrecover로 검증하는데, 이는 단일 개인 키를 가진 일반 주소에서만 작동하므로 SSP의 EVM 금고 같은 스마트 계정은 이 검사를 통과할 수 없습니다. 스마트 계정의 Permit 형식 서명을 지원하는 방식은 앱마다 다르므로, 모든 구조화 데이터 요청은 실제로 효력이 있는 것처럼 다루세요.
솔직한 요약
Permit은 서명의 형태로 전달되는 승인입니다. 무료이고 조용하며, 누군가 제출하는 순간 잔액을 비울 능력을 충분히 갖고 있습니다. 서명하기 전에 사용자, 수량, 기한을 읽고, 이를 담은 "로그인"은 모두 의심하며, 더 이상 필요 없는 권한은 토큰에서든 Permit2에서든 취소하세요.
SSP의 두 기기 승인은 한 번 더 살펴볼 기회를 주고 SSP Key는 도메인과 유형을 보여 주지만, 어느 쪽도 Permit을 대신 해석해 주지는 않습니다. 읽는 일은 여전히 내 몫입니다.


