개요
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 초기화
- 권한 확인 로직에서 두 조건을 모두 커버하지 않으면 특정 케이스 전송 실패 가능