EIP-7272 이더리움 접근 토큰(EAT) (Ethereum Access Token)
콜 결정 없음 · 보안·프라이버시 · 원문 상태 Draft · 2023-07-03 작성
오프체인 서비스가 심사를 통과한 계정에 EIP-712 서명 토큰을 발급하고 스마트 컨트랙트가 그 토큰을 온체인에서 검증해 특정 함수 호출을 한시적으로 허용하는 표준입니다.
왜 필요한가
지금 스마트 컨트랙트의 접근 제어는 보통 컨트랙트에 역할을 미리 등록해 두거나, 특정 NFT를 가진 주소만 통과시키는 방식입니다. 그런데 이런 방식은 짧은 시간만 유효한 허가나 자주 바뀌는 심사 기준에는 맞지 않습니다. 온체인 명부를 쓰면 운영자가 명부를 항상 최신으로 유지해야 하고 갱신이 늦어진 사이 자격이 없는 사람이 통과할 수 있습니다. 또 자격 심사에 신원 정보 같은 민감한 정보가 필요하다면, 누구나 볼 수 있는 블록체인에 그 정보를 올려 두고 조회하는 것은 바람직하지 않습니다. 이 제안은 심사를 오프체인(블록체인 밖) 서비스에 맡기고 통과한 계정에만 짧게 유효한 서명 토큰을 발급해 온체인에서 검증하게 합니다. 이용자가 허가를 요청하러 올 때마다 발급자는 기록을 점검하고 갱신할 기회가 생기며 개인정보는 체인에 남지 않습니다.
무엇이 바뀌나
지금
- 컨트랙트가 역할 등록이나 NFT 보유 확인 같은 온체인 정보로만 접근을 제어합니다
- 허가 기준을 바꾸려면 온체인 상태를 고쳐야 하고 명부 관리 부담이 운영자에게 있습니다
- 민감한 자격 정보를 근거로 쓰려면 그 정보가 체인에 노출될 위험이 있습니다
EIP-7272 이후
- 오프체인 서비스가 심사를 통과한 계정에 EIP-712 서명 토큰(EAT)을 발급합니다
- 허가 기준은 오프체인에서 바꾸면 되고 온체인 변경이 필요 없습니다
- 컨트랙트는 서명, 만료 시각, 호출 조건이 맞는지만 온체인에서 검증하고 개인정보는 체인에 올라가지 않습니다
누구에게 영향이 있나
- 디앱 개발자: 기존 함수에 최소한의 수정만으로 접근 제어 층을 붙일 수 있습니다. AccessTokenConsumer 컨트랙트를 상속해 쓰는 구조입니다.
- 서비스 운영자(발급자): EAT를 발급하는 오프체인 서버의 보안이 곧 게이트 전체의 보안입니다. 서버가 뚫리면 자격 없는 계정에 토큰이 발급될 수 있습니다.
- 사용자: 자격 심사는 오프체인에서 받고 발급받은 토큰을 트랜잭션에 실어 허가된 기간 안에 직접 함수를 호출합니다.
심층 설명
토큰 구조: 서명과 만료 시각
EAT는 서명값 v, r, s(uint8, bytes32, bytes32)와 만료 시각 expiry(uint256)로 구성됩니다. 서명은 EIP-712 구조화 데이터 서명으로 만들며 서명 대상 페이로드는 AccessToken { uint256 expiry; FunctionCall functionCall } 구조체입니다. FunctionCall은 functionSignature(bytes4, msg.sig와 일치해야 하는 함수 식별자), target(호출 대상 컨트랙트 주소), caller(msg.sender와 일치해야 하는 현재 호출자 주소), parameters(calldata에서 앞쪽의 v, r, s, expiry 파라미터를 떼어 낸 나머지)로 구성됩니다. 이렇게 발급 시점에 구체적인 파라미터에 토큰을 묶어 세밀한 접근 제어를 보장합니다.
온체인 검증이 보장하는 여섯 가지
온체인 EAT 검증은 다음을 확인합니다. 호출된 함수가 예상한 함수인지, 함수 파라미터가 예상한 값인지, 호출자가 예상한 계정인지, 허가된 기간 안의 호출인지(토큰이 만료되지 않았는지), 호출 대상 컨트랙트가 예상한 컨트랙트인지, 그리고 허가를 내준 주체가 유효한 발급자인지(예상된 발급자 중 하나가 서명했는지)입니다. 이 여섯 조건이 모두 맞아야 함수 실행이 허용됩니다.
Consumer와 Verifier 두 컨트랙트
참조 구현은 두 컨트랙트로 나뉩니다. 함수를 보호하려는 컨트랙트가 상속하는 AccessTokenConsumer와 EAT 검증을 전담하는 AccessTokenVerifier입니다. Consumer가 Verifier를 호출해 토큰의 무결성을 확인합니다. Verifier의 verify() 함수는 서명과 AccessToken을 입력으로 받아 토큰이 만료되지 않았는지 확인하고 재구성한 EIP-712 다이제스트와 서명으로부터 서명자를 복원한 뒤, 그 서명자가 유효한 발급자인지 검증합니다. receive와 fallback 특수 함수를 제외하면 어떤 함수에도 EAT 게이트를 붙일 수 있습니다.
JWT와 닮았지만 온체인 검증용
EAT는 웹에서 쓰이는 JWT(JSON Web Token)처럼 짧은 기간의 인가에 쓰이지만 처음부터 온체인 검증과 스마트 컨트랙트 함수 호출 인가에 맞게 설계되었습니다. EIP-712를 따르므로 기존 이더리움 인프라와 호환되고 토큰이 특정 체인에 묶이는 효과도 얻습니다. 참조 구현은 토큰을 한 번만 쓸 수 있게(single-use) 보장하지만 다른 구현은 다른 방식을 택할 수 있습니다. 영지식 증명(ZKP) 대신 단순한 서명 메시지를 택한 이유도 밝힙니다. ZKP는 복잡성이 더해지고 종류가 많아 상호운용성을 해치는 반면, ecrecover는 어떤 이더리움 스마트 컨트랙트에서도 기본으로 쓸 수 있기 때문입니다.
보안 고려사항
세 가지가 핵심입니다. 첫째, 리플레이 공격입니다. 구현은 _consumeAccessToken 함수에서 토큰을 사용됨으로 표시해 소비된 EAT가 재사용되지 않게 할 수 있습니다(MAY). 둘째, 오프체인 발급의 보안입니다. EAT로 보호된 함수의 보안은 발급 서비스의 보안에 달려 있어 서비스가 뚫리면 악의적 행위자가 접근해서는 안 되는 온체인 자원에 접근할 수 있는 토큰을 받을 수 있습니다. 셋째, 만료 시각의 균형입니다. 만료가 너무 길면 토큰 오남용 위험이 커지고 너무 짧으면 애플리케이션의 사용성이 떨어집니다.
Draft 상태와 논의 현황
이 제안은 Standards Track의 ERC이며 상태는 Draft입니다. 명세가 아직 바뀔 수 있습니다. 코어 개발자 콜 기록으로는 09.16 AMA #15에서 논의가 있었고 결정은 없었습니다.