개요

ERC-721에서 전송 권한 위임을 처리하는 두 가지 승인 방식 정리 권한 범위와 사용 시나리오가 달라 오용 시 과권한 위험 발생 가능 핵심 동작과 권한 확인 패턴 중심으로 정리

핵심 개념

approve(address to, uint256 tokenId)

  • 특정 NFT 1개에 대한 전송 권한만 부여
  • 예 123번 토큰만 지정한 대상이 전송 가능
  • 토큰별 개별 승인 필요

setApprovalForAll(address operator, bool approved)

  • 소유한 모든 NFT에 대한 전송 권한 일괄 부여
  • 한 번 승인 시 현재 보유분 + 이후 수령분까지 포함
  • 관리 편의성 높지만 권한 범위 큼

권한 확인 패턴

컨트랙트에서 호출 주체가 대상 토큰에 대해 승인 받았는지 확인 필요 두 방식 모두 대응하는 조건을 만족해야 안전

require(
    nftContract.getApproved(tokenId) == address(this) ||
    nftContract.isApprovedForAll(owner, address(this)),
    ERROR_NOT_APPROVED
);

사용 시나리오

1:1 교환 무료 시나리오

  • approve 권장 교환 대상 토큰만 제한적으로 승인 안전성 우선이나 매번 승인 필요
  • setApprovalForAll 사용 시 한 번만 승인 후 재사용 가능 편의성 높으나 과권한 주의

N:M 교환 유료 시나리오

  • setApprovalForAll 권장 다수 토큰을 한 번에 처리하기 용이 수수료와 UX 측면 유리

주의 사항

  • setApprovalForAll은 광범위 권한 부여 피싱 컨트랙트나 오용 위험 존재
  • 불필요해지면 승인 철회 권장 approved false로 재호출 또는 개별 approve 초기화
  • 권한 확인 로직에서 두 조건을 모두 커버하지 않으면 특정 케이스 전송 실패 가능

참고자료