﻿---
title: "ERC-20 승인 경쟁 조건"
description: "ERC-20 지출자는 대체 승인이 확정되기 전에 기존 허용량을 사용한 뒤 새 허용량도 사용할 수 있습니다. 경쟁 조건의 작동 방식과 승인을 더 안전하게 변경하거나 철회하는 방법을 알아봅니다."
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ERC-20 승인 경쟁 조건

> 교육 참고용이며 투자 조언이 아닙니다. 투자로 인해 손실이 발생할 수 있습니다.

<a id="answer"></a>

## 직접 답변

ERC-20 승인 경쟁 조건은 소유자가 `approve(spender, newAmount)`를 호출해 영이 아닌 허용량을 다른 영이 아닌 허용량으로 대체할 때 발생할 수 있습니다. 지출자는 대기 중인 변경을 보고 먼저 `transferFrom`으로 기존 허용량을 사용한 뒤, 대체 승인이 확정되면 새 허용량도 사용할 수 있습니다.

따라서 ERC-20 명세는 클라이언트 인터페이스가 동일한 지출자에게 새 값을 설정하기 전에 먼저 허용량을 `0`으로 설정할 것을 권장합니다. 각 트랜잭션은 순서대로 확정되어야 합니다. 토큰이 지원한다면 원자적인 `increaseAllowance` 또는 `decreaseAllowance` 호출을 사용해 영이 아닌 허용량을 직접 대체하는 일을 피할 수 있습니다.

<a id="mechanism"></a>

## 작동 방식

ERC-20은 `approve`를 덮어쓰기 방식으로 정의합니다. 즉, 성공한 `approve(spender, amount)`는 지출자의 허용량을 `amount`로 설정합니다. 이와 별도로 `transferFrom(owner, recipient, amount)`은 해당 지출자가 소유자의 토큰을 옮길 수 있게 하며 일반적으로 남은 허용량을 줄입니다. 대기 중인 트랜잭션은 실행 순서를 보장하지 않으므로, 지출자가 소유자의 승인 변경보다 먼저 실행되는 전송을 제출할 수 있습니다.

위험한 전환은 `N -> M`이며, 여기서 `N > 0`이고 `M > 0`입니다. 대체 승인이 실행되기 전에 지출자가 `N`을 모두 사용하면 이후 승인이 새로운 허용량 `M`을 설정합니다. 따라서 이 과정에서 지출할 수 있는 최대 금액은 소유자의 토큰 잔액과 토큰 구현을 한도로 `N + M`이 될 수 있습니다.

<a id="example"></a>

## 예시

Alice는 한 프로토콜에 `100`개 토큰을 지출하도록 승인했습니다. `approve(protocol, 50)`을 제출해 남은 허용량을 `50`으로 낮추려고 합니다. 그 트랜잭션이 확정되기 전에 프로토콜의 지출자가 `transferFrom(Alice, recipient, 100)`을 제출해 먼저 실행시킵니다. 이어서 Alice의 승인이 허용량을 `50`으로 설정하고, 지출자는 이를 다른 전송에 사용할 수 있습니다. 두 전송의 합계는 `150`개 토큰입니다.

더 안전한 대체 절차는 `approve(protocol, 0)`을 제출하고 확정을 기다린 뒤, 변경된 허용량과 잔액을 확인하고 새 승인이 여전히 적절할 때만 `approve(protocol, 50)`을 제출하는 것입니다. 지출자가 영으로 만드는 트랜잭션이 확정되기 전에 기존 허용량을 사용하면 Alice는 변경된 잔액을 확인하고 새 `50`을 승인하기 전에 중단할 수 있습니다.

<a id="risks"></a>

## 위험

- 허용량을 `0`으로 설정해도 이미 실행된 지출은 철회되지 않으며, 영으로 만드는 트랜잭션이 확정되기 전에 기존 허용량이 사용되는 것도 막지 못합니다.
- 첫 번째 확정을 기다리지 않고 영으로 만드는 승인과 대체 승인을 함께 보내면 실행 순서 위험이 다시 생깁니다.
- `increaseAllowance`와 `decreaseAllowance`는 기본 ERC-20 표준에 포함되지 않습니다. 검증된 토큰 컨트랙트가 지원할 때만 사용하세요.
- 무제한 허용량이 활성화되어 있는 동안 소유자의 전체 토큰 잔액이 위험에 노출될 수 있습니다. 서명 전에 체인, 토큰 컨트랙트, 지출자, 금액을 확인하세요.
- 일부 토큰은 표준과 다른 승인 동작을 보입니다. 지갑 시뮬레이션과 트랜잭션 calldata를 검토하고 각 단계 후 온체인 허용량을 확인하세요.

<a id="misconceptions"></a>

## 흔한 오해

- "가장 최근의 승인 트랜잭션이 기존 승인을 즉시 대체한다." 상태는 해당 트랜잭션이 온체인에서 실행될 때만 변경됩니다.
- "허용량을 낮추면 앞으로의 총지출이 새 금액으로 제한된다." 지출자는 변경이 실행되기 전에 기존 허용량을 사용할 수 있습니다.
- "먼저 영으로 만들면 토큰이 더 이상 빠져나가지 않는다고 보장된다." 영으로 만드는 트랜잭션이 확정될 때까지 기존 허용량은 계속 사용할 수 있습니다.
- "모든 ERC-20에는 `increaseAllowance`와 `decreaseAllowance`가 있다." 이들은 선택적 확장 기능이며 ERC-20의 요구 사항이 아닙니다.
- "웹사이트 연결을 해제하면 토큰 승인도 철회된다." 지갑 연결 상태와 토큰 컨트랙트의 온체인 허용량은 서로 별개입니다.

<a id="related"></a>

## 관련 주제

- [정식 토큰과 래핑 토큰을 구별하는 방법](/ko/crypto/canonical-vs-wrapped-token/)
- [멤풀](/ko/crypto/mempool/)
- [Permit2 서명 위험](/ko/crypto/permit2-signature-risk/)
- [Reduce-only 주문](/ko/crypto/reduce-only-order/)
- [지갑 승인](/ko/crypto/wallet-approval/)

<a id="sources"></a>

## 출처

- [ERC-20: Token Standard](https://eips.ethereum.org/EIPS/eip-20) - Ethereum Improvement Proposals (확인일: 2026-08-20)
- [ERC20 | OpenZeppelin Docs](https://docs.openzeppelin.com/contracts/4.x/api/token/erc20) - OpenZeppelin (확인일: 2026-08-20)

Source: https://wiki.fcontext.com/ko/crypto/erc20-approval-race-condition/index.mdx
