신뢰 모델과 보안
호패를 쓴다는 것은 무엇을 믿는다는 뜻인지, 그리고 무엇은 믿지 않아도 되는지를 정리했습니다.
누구를 믿어야 하나
| 주체 | 믿어야 하는 것 | 믿지 않아도 되는 것 |
|---|---|---|
| 발급자 (호패) | 심사 결과를 정직하게 어테스테이션으로 옮긴다는 것 | 판정 조회 — 누구나 온체인에서 직접 읽습니다. 발급자 서버가 죽어도 검증은 됩니다. |
| 검증 벤더 | 신원 검증 결과의 정확성 (연동 이후) | 데이터 보관 — 개인정보는 벤더에 남고 호패는 참조와 해시만 받습니다. |
| GIWA · EAS | 체인의 가용성과 프리디플로이 EAS의 무결성 | 호패의 코드 — 네 컨트랙트 모두 소스가 Verified 상태입니다. |
| 사용자 브라우저 | 크리덴셜(값과 salt) 보관 — 잃으면 선택공개·증명을 다시 만들 수 없습니다 | 커밋먼트 계산 — 제3자가 우리 코드 없이 재계산해 검증할 수 있습니다. |
| dApp | 자기 게이트 정책 | 판정 자체 — 같은 레지스트리를 읽으므로 서비스마다 답이 갈리지 않습니다. |
핵심은 발급자를 믿되 검증은 믿지 않아도 되는 구조입니다. 발급자가 거짓 사실을 커밋하면 거짓 어테스테이션이 나오지만, 그 사실은 온체인과 증적에 남아 사후 추적이 됩니다. ZK도 이 성질을 바꾸지는 못합니다.
권한 구조
| 역할 | 할 수 있는 것 | 현재 |
|---|---|---|
owner | 발급 키 등록·해제, 소유권 이전 (2단계) | 단일 키 — 멀티시그 전환은 메인넷 전 과제 |
issuer | 발급, 폐기, UID 직접 폐기 | 서버 환경변수로만 존재. 브라우저에 노출되지 않습니다 |
revoker | 폐기 전용 — 발급 키가 유출돼도 폐기는 살아 있어야 합니다 | 로드맵 |
| 사용자 | 자기 지갑의 발급 요청과 철회 요청 | 소유권 서명으로 증명. 공개 데모의 폐기 체험도 본인 지갑에만 허용됩니다 |
레지스트리 자체가 EAS 어테스터입니다. 발급 키를 교체해도 어테스테이션의 계보와 폐기 권한이 유지되는 이유입니다.
공격 시나리오와 대응
| 시나리오 | 대응 | 상태 |
|---|---|---|
| 남의 주소로 발급받기 | 발급 전 EIP-191 소유권 서명을 서버가 검증합니다. 원문에 주소·등급·claimsRoot·시각이 묶여 있고 10분간만 유효합니다. | 라이브 |
| 재발급으로 구 어테스테이션 남기기 | 재발급 시 살아있는 구 UID를 EAS에서 먼저 폐기합니다. EAS를 직접 읽는 검증자에게도 스테일 어테스테이션이 남지 않습니다. | 라이브 |
| 폐기된 지갑이 예전 증명 재사용 | 게이트가 증명 검증과 별도로 레지스트리 상태를 다시 확인합니다. 폐기 후 유효한 증명은 revert됩니다. | 라이브 |
| 온체인 커밋먼트에서 값 역산 | 필드마다 128비트 난수 salt를 붙입니다. 루트만으로는 생년월일을 되돌릴 수 없습니다. | 라이브 |
| 발급 키 유출 | 키는 서버에만 두고 issuers 매핑으로 즉시 회수합니다. 온체인 발급 한도와 서킷브레이커, 폐기 키 분리는 아직 없습니다. | 개발 중 |
| 제재 대상이 발급 후 명단에 오름 | 일일 재대사로 잡아 폐기하는 것이 설계이지만, 자동화 전이라 현재는 사람이 실행합니다. | 로드맵 |
| 한 사람이 지갑 수백 개로 발급 | 동일인 인덱스로 지갑 수를 제한하고 폐기를 연동합니다. 벤더 CI가 있어야 성립하므로 연동 이후입니다. | 로드맵 |
| 오탐으로 정상 사용자 차단 | SUSPENDED 상태와 케이스·이의제기 절차로 폐기와 방치 사이 단계를 만듭니다. | 로드맵 |
알려진 한계
지금 시점에서 성립하지 않는 것들입니다. 로드맵에 각각 대응 항목이 있습니다.
- ·신원 검증이 없습니다. 발급되는 L1은 본인 선언이며, 입력한 생년월일이 사실인지 확인하지 않습니다. 확인하는 것은 지갑 소유권뿐입니다.
- ·이름 축 상시 모니터링이 없습니다. 발급 시점의 명단 대사는 실데이터로 하지만, 이름을 저장하지 않으므로 매일 도는 재대사는 지갑 주소·온체인 접촉 두 축뿐입니다. 이름 축 상시 감시는 검증 벤더의 웹훅을 받아야 합니다.
- ·증적 저장이 영속적이지 않습니다. 증적 체인은 서버 인스턴스 메모리에 있어 재시작하면 색인이 사라집니다. 사본은 발급 응답으로 대상자에게 전달되므로 검증 자체는 저장소 없이도 가능합니다. WORM 저장소는 다음 단계입니다.
- ·증적 원본을 영구 보존하지 않습니다. 온체인 해시는 있지만 운영용 해시체인 저장소가 아직 없어, 시연분만 저장소에 남아 있습니다.
- ·외부 감사를 받지 않았습니다. 컨트랙트와 ZK 회로 모두 자체 테스트까지 입니다.
- ·“이 지갑은 검증됨”은 공개 정보입니다. 등급과 만료 외에는 아무것도 드러나지 않지만, 검증 사실 자체는 지갑과 연결됩니다. 비연결형 증명이 그 답이고 아직 로드맵입니다.
검증 상태
지금 확인 가능한 것
| 항목 | 내용 |
|---|---|
| 컨트랙트 테스트 | 37종 — 유닛 + fuzz + invariant 2종 + 실제 증명 in-EVM 검증 |
| 소스 공개 | GIWA Sepolia 배포 4개 컨트랙트 모두 Blockscout Verified |
| 해시 패리티 | TypeScript 구현과 Noir 회로의 커밋먼트 다이제스트를 고정 벡터로 대조 |
| 독립 재현 | SDK를 쓰지 않는 검증 스크립트와 cast 절차를 공개했습니다 — 프라이버시와 ZK 문서 참고 |
받지 않은 것
컨트랙트 외부 감사, ZK 회로 외부 리뷰, 침투 테스트. 셋 다 메인넷 이전 필수 항목으로 로드맵에 있습니다.
현재 배포는 테스트넷입니다. 실제 자산이 걸린 게이트에 쓰기 전에는 위 한계 목록과 감사 상태를 그대로 반영해 판단하세요.
취약점 신고
컨트랙트·API·회로에서 문제를 발견하면 science@stabled.ai로 보내주세요. 공개 이슈보다 이메일을 먼저 부탁드립니다.