01

가스비가 들지 않는 서명이 위험한 이유

지갑을 쓰다 보면 거래가 아니라 ‘서명 요청’이 뜨는 경우가 있습니다. 로그인이나 주문 등록처럼 가스비가 들지 않고 블록체인에 바로 기록되지도 않아 가볍게 승인하기 쉽습니다. 하지만 일부 서명은 나중에 다른 사람이 내 토큰을 가져갈 수 있는 권한으로 쓰일 수 있습니다.

이 글은 EIP-712라는 구조화 데이터 서명에서 지갑 화면에 나오는 도메인과 메시지 항목을 읽는 법을 설명합니다. 토큰 사용 권한을 서명 하나로 넘겨주는 permit 서명을 가상의 요청으로 분석하고, 서명 전에 확인할 항목을 정리합니다.

02

EIP-712가 정하는 것

EIP-712는 사람이 읽기 어려운 임의의 데이터 대신, 항목 이름과 타입이 정해진 구조화된 데이터를 해시해서 서명하는 방식을 정의합니다. 그래서 지갑은 ‘이 서명은 어떤 앱의 어떤 메시지이며 각 항목의 값이 무엇인지’를 화면에 보여줄 수 있습니다.

서명 데이터는 크게 도메인과 메시지로 나뉩니다. 도메인에는 앱 이름(name), 버전(version), 체인 ID(chainId), 검증 계약 주소(verifyingContract)가 들어갈 수 있고, 이 정보 덕분에 같은 메시지가 다른 앱이나 다른 네트워크에서 재사용되는 위험이 줄어듭니다. 메시지에는 실제로 허락하는 내용이 들어갑니다.

03

가상 permit 서명 요청

ERC-2612는 토큰 보유자가 가스비를 내는 승인 거래 대신 서명 하나로 다른 주소에 토큰 사용 권한을 줄 수 있게 하는 permit 기능을 정의합니다. 아래 표는 가상의 permit 서명 요청을 항목별로 읽은 것입니다.

permit 서명 요청 항목 읽기 (가상 예시)
구분항목요청에 나온 값확인할 점
도메인name / versionUSD Coin / 2실제로 보유한 토큰인지
도메인chainId1 (이더리움 메인넷)현재 쓰는 네트워크와 같은지
도메인verifyingContract0xA0b8…eB48공식 토큰 계약 주소와 일치하는지
메시지spender0x9f3c…71aa모르는 주소라면 서명하지 않음
메시지value115792…(2²⁵⁶ − 1)사실상 무제한 승인
메시지deadline2099년만료가 매우 먼 미래

이 서명은 가스비 없이 서명만으로 모르는 주소에 토큰 무제한 사용 권한을 오랫동안 넘겨주는 내용입니다. 서명 자체로는 토큰이 움직이지 않지만, 받은 쪽이 언제든 이 서명을 제출해 권한을 쓸 수 있습니다.

04

서명이 권한이 되는 과정

permit 서명을 받은 쪽은 이 서명을 토큰 계약에 제출해 승인을 등록하고, 곧바로 승인 한도까지 토큰을 옮길 수 있습니다. 서명할 때는 블록체인에 아무 기록도 남지 않기 때문에, 사용자는 권한을 넘겼다는 사실을 토큰이 사라진 뒤에야 알게 되는 경우가 많습니다.

Ethereum.org의 보안 안내도 출처가 불분명한 사이트에서 서명 요청을 승인하지 말라고 강조합니다. 일반 거래에는 지갑이 경고를 보여주는 경우가 많지만, 서명 요청은 상대적으로 가볍게 보이는 화면으로 표시돼 주의가 흩어지기 쉽습니다.

05

도메인과 메시지 확인 순서

서명 요청이 뜨면 아래 순서로 확인해 보세요.

  1. 서명을 요청한 사이트 주소가 내가 이용하려던 공식 사이트인지 확인합니다.
  2. 도메인의 chainId가 지금 쓰는 네트워크와 같은지, verifyingContract가 공식 계약 주소와 같은지 대조합니다.
  3. 메시지에 spender, to, recipient 같은 받는 주소가 있다면 그 주소가 누구인지 확인합니다.
  4. value, amount 같은 수량이 필요한 만큼인지, 무제한에 가까운 값은 아닌지 봅니다.
  5. deadline, expiry 같은 만료 시각과 nonce를 확인하고, 내용을 이해할 수 없으면 서명하지 않습니다.
06

정상적인 쓰임과 구분하기

구조화 데이터 서명 자체는 유용한 기술입니다. 탈중앙 거래소의 주문 등록, 가스비 없는 승인, 로그인처럼 많은 정상 서비스가 이 방식을 씁니다. 정상적인 요청은 보통 사용자가 방금 한 행동과 내용이 맞고, 수량과 만료 시각이 그 행동에 필요한 만큼으로 제한돼 있습니다.

반대로 단순히 ‘지갑 연결 확인’이나 ‘에어드롭 받기’를 눌렀는데 토큰 사용 권한을 넘기는 서명이 뜬다면 행동과 내용이 맞지 않는 것입니다. 지갑이 데이터를 사람이 읽을 수 있게 보여주지 못하고 긴 16진수 문자열만 보여준다면, 무엇에 서명하는지 확인할 수 없으므로 더 조심해야 합니다.

07

이미 서명했다면

의심스러운 permit 서명을 했다면, 그 서명이 아직 제출되지 않았을 수 있습니다. 같은 토큰 계약에서 nonce를 소모하는 다른 승인 거래를 보내거나, 해당 토큰을 다른 지갑으로 옮겨 서명이 쓸모없게 만드는 방법이 있습니다. 이미 제출돼 승인이 등록됐다면 승인 한도를 0으로 바꾸는 거래로 권한을 취소할 수 있습니다.

이런 조치에는 가스비가 들고 시간이 중요합니다. 평소에 블록 탐색기의 승인 관리 기능으로 내 주소에 등록된 승인 목록을 확인하는 습관을 들여 두면, 문제가 생겼을 때 빠르게 대응할 수 있습니다.

08

단순화한 부분

이 글의 주소와 값은 서명 구조를 보여주기 위한 가상의 예시입니다. 실제 서명 요청은 앱마다 항목 이름과 구성이 다르고, 지갑마다 표시 방식과 경고 기준도 다릅니다.

실제로 서명할 때는 EIP-712, ERC-2612와 Ethereum.org의 최신 자료, 지갑의 공식 안내를 기준일 표시와 함께 확인하세요. 이 내용을 매매 판단의 근거로 삼지는 마세요.