Tech/EIPs/#191
ERC 191카테고리 · ERC유형 · 표준 트랙상태 · 최종

Signed Data Standard

쉬운 설명

이더리움에서 트랜잭션이 아닌 임의의 데이터에 서명할 때의 표준 형식을 정해요. 지갑 연결 로그인, 오프체인 승인 등에서 서명을 안전하게 사용할 수 있어요.

EIP-191은 이더리움에서 트랜잭션이 아닌 임의의 데이터에 서명할 때의 표준 형식을 정의합니다. \x19 접두사와 버전 바이트를 조합하여 서명 데이터의 유형을 명확히 구분하고, 서명된 메시지가 실제 트랜잭션으로 오인되어 악용되는 것을 방지합니다.

\x19 접두사의 역할

이더리움 트랜잭션 RLP 인코딩은 절대 0x19 바이트로 시작할 수 없습니다. 따라서 서명 데이터 앞에 \x19를 붙이면 "이것은 트랜잭션이 아님"을 보장할 수 있습니다. 이를 통해 악의적인 DApp이 사용자에게 메시지 서명처럼 보이지만 실제로는 트랜잭션 전송인 데이터에 서명하게 하는 공격을 차단합니다.

세 가지 버전 형식

① 버전 0x00 (검증자 포함): \x19\x00 + validatorAddress + data. 특정 컨트랙트 주소를 서명에 바인딩합니다. ② 버전 0x01 (구조화 데이터, EIP-712): \x19\x01 + domainSeparator + hashStruct. 가장 널리 사용되며 MetaMask에서 이해할 수 있는 서명을 보여줍니다. ③ 버전 0x45 (personal_sign): \x19Ethereum Signed Message:\n + 데이터 길이 + data. eth_sign 및 personal_sign API에서 사용됩니다.

personal_sign (0x45) 상세

personal_sign은 가장 단순한 형태로, "\x19Ethereum Signed Message:\n32" + 32바이트 메시지 해시 형식을 사용합니다. 지갑 연결 로그인(Sign-In with Ethereum), 단순 오프체인 메시지 서명 등에 사용됩니다. 사용자는 지갑에서 "Ethereum Signed Message" 텍스트를 보지만 내용이 16진수 해시로 표시되어 가독성이 낮습니다. EIP-712가 이 문제를 해결합니다.

버전 0x00 (컨트랙트 검증자)

버전 0x00은 메시지를 특정 컨트랙트(validator)에 바인딩합니다. 서명 데이터 = keccak256(\x19\x00 + validatorAddress + data). validatorAddress가 다르면 같은 데이터라도 서명이 달라지므로, 다른 컨트랙트에서 이 서명을 재사용할 수 없습니다. 멀티시그 컨트랙트나 커스텀 검증 로직에서 활용됩니다.

EIP-191과 EIP-712의 관계

EIP-712는 EIP-191의 버전 0x01을 구체화한 것입니다. EIP-191이 "\x19와 버전 바이트를 쓰자"는 프레임워크를 제공하면, EIP-712는 0x01 버전의 데이터를 domainSeparator + hashStruct로 구조화하는 방법을 상세히 정의합니다. 즉 EIP-191 없이 EIP-712는 존재하지 않습니다.

공식 ERC 문서open_in_new