2장 · 노드, 신원증명과 키
분산 장부라는 아이디어는 훌륭했다. 그런데 막상 구현하려고 하니 곧바로 벽에 부딪혔다. 누구나 이 네트워크에 메시지를 보낼 수 있다면, 누군가 "철수가 영희에게 100만원 보냄"이라는 가짜 메시지를 만들어 뿌리면?
❓ 이 챕터의 질문
기존 방식의 문제
은행 시스템에서는 신원 증명이 단순했어요. 비밀번호를 서버에 보내면, 서버가 "맞다/틀리다"를 판단해줬어요. 그런데 블록체인에는 이 비밀번호를 받아줄 중앙 서버가 없어요. 비밀번호를 네트워크에 뿌리는 순간 누구나 볼 수 있고, 탈취될 수 있어요.
완전히 다른 접근이 필요했어요.
공개키 암호화: 자물쇠와 열쇠를 분리한다
해결책은 이미 암호학에 있었어요. 공개키 암호화(비대칭 암호화)예요. 핵심 아이디어는 자물쇠와 열쇠를 분리하는 거예요.
- 개인키(Private Key): 나만 갖고 있는 비밀 열쇠. 서명을 만드는 데 쓴다.
- 공개키(Public Key): 세상에 공개해도 되는 자물쇠. 서명이 진짜인지 검증하는 데 쓴다.
작동 방식은 이래요. 철수가 "영희에게 1 ETH 보냄"이라는 메시지를 자신의 개인키로 서명하면 서명값(v, r, s)이 나와요. 이 서명값을 메시지와 함께 네트워크에 뿌리면, 누구나 철수의 공개키로 "맞다, 철수가 서명한 게 맞다"고 검증할 수 있어요. 개인키는 절대 네트워크 밖으로 나가지 않아요. 서명된 결과물만 나가요.
그런데 개인키를 어떻게 보관하나
여기서 새로운 문제가 생겼어요. 개인키는 256비트 난수예요.
a3f1c2d4e5b6...8b9e0f1a이걸 사람이 외우거나 종이에 적는 건 사실상 불가능해요. 그리고 잃어버리면 자산이 영구 소멸해요. 복구할 방법이 없어요. 은행은 비밀번호를 잊어버리면 신분증으로 재발급해줬지만, 블록체인에는 그런 창구가 없어요.
니모닉 코드: 12개 영단어로 키를 백업한다
해결책은 개인키를 사람이 읽을 수 있는 형태로 변환하는 거예요. BIP-39 표준은 랜덤 숫자를 12개(또는 24개)의 영단어로 변환해요.
army van defense carry jealous true
garbage claim echo media make crunch이 12단어만 안전하게 보관하면 언제든 개인키를 복원할 수 있어요. 그리고 하나의 니모닉에서 수천 개의 개인키와 주소를 계층적으로 파생할 수 있어요. 이게 HD 지갑(Hierarchical Deterministic Wallet) 이에요.
공개키에서 지갑 주소로
개인키가 생겼으니 공개키도 나와요. 그런데 공개키는 512비트로 너무 길어요. 이걸 주소로 쓰면 오타 하나로 돈이 사라질 수 있어요. 그래서 공개키를 Keccak-256 해시 함수에 넣고 마지막 20바이트를 꺼내면 40자 지갑 주소가 나와요.
0x742d35Cc6634C0532925a3b844Bc454e4438f44e해시는 단방향이라 주소만 보고 공개키를 역산하는 건 불가능해요. 주소를 공개해도 개인키가 노출되지 않아요.
기관은 어떻게 키를 관리하나
개인이 니모닉 12단어로 키를 관리한다면, 수백억 원의 자산을 다루는 기관은 어떻게 할까요?
| 방식 | 키 관리 | 보안 | 복구 | 용도 |
|---|---|---|---|---|
| Single Key | 단일 개인키 | ★☆☆☆☆ | 복구 불가 | 개인 소액 |
| HD Wallet | 니모닉 기반 계층 파생 | ★★☆☆☆ | 니모닉 복구 | 개인/소규모 |
| HSM | 하드웨어 보안 모듈 | ★★★★☆ | 백업 HSM | 금융기관/거래소 |
| 멀티시그 | N개 키 중 M개 서명 필요 | ★★★★☆ | 임계값 복구 | 기관/기업 |
| MPC | 키를 조각으로 분산 | ★★★★★ | 임계값 복구 | 기관/기업 |
HSM은 키가 하드웨어 칩 안에서만 존재해요. 물리적으로 탈취해도 키를 꺼낼 수 없어요.
멀티시그는 "3개 중 2개(2-of-3)" 방식으로, A·B·C 세 명 중 두 명이 서명해야 트랜잭션이 실행돼요. 스마트 컨트랙트 레벨에서 온체인으로 검증해요.
MPC는 겉으로 보기엔 멀티시그와 비슷하지만 작동 방식이 근본적으로 달라요. 키를 여러 조각(샤드)으로 나눠서 분산 보관하는데, 완전한 키는 어디에도 존재하지 않아요. 서명할 때 샤드들이 오프체인에서 수학적 연산에 참여하고, 온체인에는 최종 서명값만 올라가요.
실습: MetaMask 지갑 만들기
개념을 직접 확인해볼 수 있어요. MetaMask는 가장 널리 쓰이는 HD 지갑이에요. 설치하면 니모닉 12단어가 생성되고, 그로부터 지갑 주소가 파생되는 전 과정을 직접 경험할 수 있어요.
그런데 새로운 문제가 생겼어요
신원 증명과 키 체계가 완성됐어요. 이제 "철수가 영희에게 보낸다"는 걸 증명할 수 있어요. 그런데 이 요청을 네트워크에 보낼 때 세 가지 문제가 동시에 생겼어요.
- 같은 메시지를 복사해서 100번 뿌리면 100번 출금될 수 있어요.
- 중간에 누군가 금액만 바꿔치기할 수 있어요.
- 노드마다 메시지를 다르게 파싱하면 합의가 깨져요.
❓ 다음 챕터의 질문
→ 3장에서 트랜잭션이 이 세 가지 문제를 한 번에 어떻게 해결하는지 알아볼게요.
핵심 요약
| 개념 | 역할 | 비유 |
|---|---|---|
| 개인키 | 서명 생성. 절대 공개 불가 | 도장 |
| 공개키 | 서명 검증. 공개해도 안전 | 도장 이미지 |
| 니모닉 | 개인키 백업·복원용 12단어 | 마스터 열쇠 복사본 |
| 지갑 주소 | 공개키를 해시한 40자 식별자 | 계좌번호 |
| ENS | 주소에 붙이는 이름 | 도메인 |
| HSM | 키가 칩 밖으로 나가지 않는 하드웨어 | 금고 |
| 멀티시그 | N개 키 중 M개 서명 필요, 온체인 검증 | 공동 인감 |
| MPC | 키를 조각으로 분산, 완전한 키는 없음 | 분산 금고 |
📚 참고자료 보기
- BIP-39 표준: 니모닉 코드 공식 표준
- BIP-32 HD Wallet: 계층적 결정론적 지갑 표준
- BIP-44: 다중 계정 계층 표준
- ENS 공식 문서: Ethereum Name Service
- Keccak-256: 이더리움이 사용하는 해시 함수
- MetaMask 공식 사이트: 설치 및 공식 문서