🔑챕터 2

2장 · 신원증명과 키

1장에서 본 것처럼, 이 네트워크는 자격 심사 없이 누구나 노드를 띄울 수 있다. 그건 누구나 메시지를 보낼 수 있다는 뜻이기도 하다. 누군가 "철수가 영희에게 100만원 보냄"이라는 가짜 메시지를 만들어 뿌리면?

이 챕터의 질문

신원을 확인해줄 중앙 기관이 없는 네트워크에서, 이 메시지를 보낸 사람이 정말 본인인지 어떻게 증명할까?

기존 방식의 문제

은행 시스템에서는 신원 증명이 단순했어요. 비밀번호를 서버에 보내면, 서버가 "맞다/틀리다"를 판단해줬어요. 그런데 블록체인에는 이 비밀번호를 받아줄 중앙 서버가 없어요. 비밀번호를 네트워크에 뿌리는 순간 누구나 보고, 그대로 가져가요.

완전히 다른 접근이 필요했어요.

기존: 비밀번호블록체인: 디지털 서명사용자비밀번호전송중앙 서버맞다 / 틀리다비밀번호 자체가 내 기기 밖으로 나간다→ 탈취 위험판단을 서버 한 곳이 독점→ 블록체인엔 그 서버가 없다사용자개인키 🔑 보관개인키는 절대 밖으로 안 나감노드 1공개키 검증 ✓노드 2공개키 검증 ✓노드 3공개키 검증 ✓메시지 + 서명값중앙 서버 없이 누구나 진위를 검증
비밀번호 방식은 비밀을 서버에 넘겨야 하고, 서명 방식은 비밀을 넘기지 않고 본인을 증명한다

공개키 암호화: 자물쇠와 열쇠를 분리한다

해결책은 이미 암호학에 있었어요. 공개키 암호화(비대칭 암호화)예요. 핵심 아이디어는 자물쇠와 열쇠를 분리하는 거예요.

  • 개인키(Private Key): 나만 갖고 있는 비밀 열쇠. 서명을 만드는 데 쓴다.
  • 공개키(Public Key): 세상에 공개해도 되는 자물쇠. 서명이 진짜인지 검증하는 데 쓴다.

작동 방식은 이래요. 철수가 "영희에게 1 ETH 보냄"이라는 메시지를 자신의 개인키로 서명하면 서명값(v, r, s)이 나와요. 이 서명값을 메시지와 함께 네트워크에 뿌리면, 누구나 철수의 공개키로 "맞다, 철수가 서명한 게 맞다"고 검증할 수 있어요. 개인키는 절대 네트워크 밖으로 나가지 않아요. 서명된 결과물만 나가요.

서명: 철수만 가능검증: 누구나 가능메시지"영희에게 1 ETH"개인키 🔑나만 보관서명 생성ECDSA네트워크 전파메시지 + 서명값(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 지갑

니모닉에서 키가 하나만 나온다면, 주소를 여러 개 쓰려고 할 때마다 니모닉을 새로 만들어 따로 백업해야 해요. 그래서 실제 지갑은 니모닉 하나에서 키와 주소를 계층적으로 뻗어나가게 만들어요. 이게 HD 지갑(Hierarchical Deterministic Wallet) 이에요.

니모닉으로 Seed를 만들고, Seed에서 Master Key를 만들고, 그 마스터 키에서 Account #0, #1, #2… 를 얼마든지 파생해요. 같은 니모닉이면 언제 계산해도 같은 순서로 같은 주소가 나오니까(Deterministic), 주소가 수천 개여도 백업은 여전히 12단어 하나로 끝나요.

니모닉 12단어army van defense …BIP-39 · 이것만 백업Seed512비트Master KeyBIP-32Account #00x742d…Account #10x9f3a…Account #Nm/44'/60'/0'/0/N
HD 지갑: 니모닉 12단어 하나에서 수천 개의 키와 주소가 계층적으로 파생된다

공개키에서 지갑 주소로

개인키가 생겼으니 공개키도 나와요. 그런데 공개키는 512비트로 너무 길어요. 이걸 주소로 쓰면 오타 하나로 돈이 사라질 수 있어요. 그래서 공개키를 Keccak-256 해시 함수에 넣고 마지막 20바이트를 꺼내면 40자 지갑 주소가 나와요.

0x742d35Cc6634C0532925a3b844Bc454e4438f44e

해시는 단방향이라 주소만 보고 공개키를 역산하는 건 불가능해요. 주소를 공개해도 개인키가 노출되지 않아요.

개인키256비트 난수ECDSA공개키512비트Keccak-256해시값32바이트마지막20바이트지갑 주소 (40자)0x742d35Cc…✗ 역산 불가: 해시·서명 모두 단방향, 주소를 공개해도 개인키는 안전
개인키에서 주소까지, 모든 단계가 단방향이라 주소에서 개인키를 역산할 수 없다

기관은 어떻게 키를 관리하나

개인이 니모닉 12단어로 키를 관리한다면, 수백억 원의 자산을 다루는 기관은 어떻게 할까요?

방식키 관리보안복구용도
Single Key단일 개인키★☆☆☆☆복구 불가개인 소액
HD Wallet니모닉 기반 계층 파생★★☆☆☆니모닉 복구개인/소규모
HSM하드웨어 보안 모듈★★★★☆백업 HSM금융기관/거래소
멀티시그N개 키 중 M개 서명 필요★★★★☆임계값 복구기관/기업
MPC키를 조각으로 분산★★★★★임계값 복구기관/기업

HSM은 키가 하드웨어 칩 안에서만 존재해요. 물리적으로 탈취해도 키를 꺼낼 수 없어요.

멀티시그는 "3개 중 2개(2-of-3)" 방식으로, A·B·C 세 명 중 두 명이 서명해야 트랜잭션이 실행돼요. 스마트 컨트랙트 레벨에서 온체인으로 검증해요.

MPC는 겉으로 보기엔 멀티시그와 비슷하지만 속을 보면 완전히 달라요. 키를 여러 조각(샤드)으로 나눠서 분산 보관하는데, 완전한 키는 어디에도 없어요. 서명할 때 샤드들이 오프체인에서 수학적 연산에 참여하고, 온체인에는 최종 서명값만 올라가요.

멀티시그 (2-of-3)MPC키 A 🔑서명 ✓키 B 🔑서명 ✓키 C 🔑미참여서명 2개각각 온전한 서명온체인: 컨트랙트가 2-of-3 검증서명 구조가 체인에 드러남완전한 키가 3개 있음조각 1샤드조각 2샤드조각 3샤드오프체인 MPC 연산조각들이 함께 계산온체인: 최종 서명값 1개만 올라감일반 서명과 구분되지 않음완전한 키는 어디에도 없음
멀티시그는 완전한 키 N개의 서명을 온체인에서 검증하고, MPC는 키 조각으로 오프체인에서 서명 하나를 만든다

실습: MetaMask 지갑 만들기

개념을 직접 확인해볼 수 있어요. MetaMask는 가장 널리 쓰이는 HD 지갑이에요. 설치하면 니모닉 12단어가 만들어지고, 거기서 지갑 주소가 파생되는 과정까지 직접 볼 수 있어요.

그런데 새로운 문제가 생겼어요

신원 증명과 키 체계가 완성됐어요. 이제 "철수가 영희에게 보낸다"는 걸 증명할 수 있어요. 그런데 이 요청을 네트워크에 보낼 때 세 가지 문제가 동시에 생겼어요.

  • 같은 메시지를 복사해서 100번 뿌리면 100번 출금될 수 있어요.
  • 중간에 누군가 금액만 바꿔치기할 수 있어요.
  • 노드마다 메시지를 다르게 파싱하면 합의가 깨져요.

다음 챕터의 질문

서명한 요청이 복사되거나 변조되거나 노드마다 다르게 읽히지 않도록 전달하려면 어떻게 해야 할까?

3장에서 트랜잭션이 이 세 가지 문제를 한 번에 어떻게 해결하는지 알아볼게요.

핵심 요약

개념역할비유
개인키서명 생성. 절대 공개 불가도장
공개키서명 검증. 공개해도 안전도장 이미지
니모닉개인키 백업·복원용 12단어마스터 열쇠 복사본
지갑 주소공개키를 해시한 40자 식별자계좌번호
ENS주소에 붙이는 이름도메인
HSM키가 칩 밖으로 나가지 않는 하드웨어금고
멀티시그N개 키 중 M개 서명 필요, 온체인 검증공동 인감
MPC키를 조각으로 분산, 완전한 키는 없음분산 금고
📚 참고자료 보기