> For the complete documentation index, see [llms.txt](https://whs3-doge5k.gitbook.io/smartcontract-security-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://whs3-doge5k.gitbook.io/smartcontract-security-docs/basics/3.-evm/msg.sender-and-tx.origin.md).

# msg.sender & tx.origin

> 누가 호출했는가?

| 변수             | 의미                               | 보안 관련 주의      |
| -------------- | -------------------------------- | ------------- |
| **msg.sender** | 지금 이 함수(또는 계약)를 호출한 **직접적인 호출자** | ✅ 안전하게 사용 가능  |
| **tx.origin**  | 트랜잭션을 처음 시작한 **EOA 주소**          | ⚠️ 피싱/스푸핑에 취약 |

`msg.sender`는 EVM 내에서의 직접 호출자 추적용, `tx.origin`은 최초 트랜잭션 발신자 추적용으로 사용된다.

이때, `tx.origin`을 사용할 경우 보안상의 위협이 있을 가능성이 있으므로 주의해야한다.

### 예시

```solidity
contract Wallet {
    address owner;
    //생성자 (계약을 배포할 때만 실행되는 함수)
    constructor() {
        //이 계약의 주인 = 지금 계약을 호출한 사람
        //생성자는 계약을 배포할 때만 실행되므로 배포자가 곧 오너가 된다.
        owner = msg.sender;
    }
    
    //출금 함수 (파라미터 : 출금액)
    function withdraw(uint256 _amount) public {
        //트랜잭션을 시작한 EOA 주소가 owner가 아니라면 "Not owner!"를 출력
        require(tx.origin == owner, "Not the owner!");
        //조건이 충족되면 호출한 컨트랙트에게 이더를 전달
        payable(msg.sender).transfer(_amount);
    }
}
```

해당 계약은 큰 문제가 없어 보인다. 하지만 공격자가 지갑의 원래 주인에게 피싱 공격을 시도한다는 상황을 가정해보자. 공격자는 피해자를 교묘하게 속여 자신이 만든 공격 컨트랙트를 실행하도록 속였다. 피해자는 아무것도 모르고 아래의 컨트랙트를 실행하게 되었다.공격자가 피싱 공격에 사용할 코드는 다음과 같다.

```solidity
contract PhishingContract {
    Wallet wallet;

    //생성자에 wallet = 피해자의 지갑 주소.
    constructor(address _walletAddress) {
        wallet = Wallet(_walletAddress);
    }

    function attack() public {
        //이 공격 컨트랙트를 실행한 주체 = tx.origin = 피해자
        //msg.sender = 공격 컨트랙트
        //피해자가 실행했으므로 tx.origin = owner
        //그러나 돈은 msg.sender = 공격 컨트랙트로 향한다.
        wallet.withdraw(100);
    }
}

```

예시에서 알 수 있듯, `tx.origin`을 사용할 경우 피싱 공격 등에 취약해질 수 있으므로 주의해야한다.

해당 개념을 더 잘 이해하기 위한 Ethernaut 예제이다.

{% content-ref url="/spaces/vLae9iTcYKyLdHhMtRVd/pages/2pDy6ORJpWBKUZZBmpAO" %}
[4. Telephone](/smartcontract-security-docs/ethernaut/4.-telephone.md)
{% endcontent-ref %}
