암호화폐에서 논스(Nonce)란 무엇인가요? 비트코인 채굴, 이더리움, 암호화
2010년 12월, 베를린에서 열린 카오스 커뮤니케이션 컨퍼런스에서 fail0verflow라는 소규모 그룹이 소니의 플레이스테이션 3 마스터 서명 키를 추출했다고 발표했습니다. 이 익스플로잇은 256비트 타원 곡선 암호화를 해독한 것도 아니고, AES 암호화를 해킹한 것도 아니었습니다. 소니의 코드 서명 시스템이 모든 서명에 동일한 숫자를 재사용한다는 사실을 이용한 것이었습니다. 그 숫자는 바로 논스(nonce)였습니다.
"nonce"라는 단어는 암호화폐 세계에서 거의 공통점이 없는 세 가지 영역에서 공통적으로 등장합니다. 비트코인 채굴자는 유효한 블록 해시를 찾기 위해 초당 수조 번씩 이 변수를 순환시킵니다. 이더리움 지갑은 이 변수를 사용하여 발신 거래의 순서를 정하고, 거래가 지연되면 이후의 모든 거래가 차단됩니다. 또한 AES-GCM 암호는 이 고유한 값을 사용하여 암호화된 두 메시지의 내용이 서로 유출되지 않도록 합니다. 하나의 단어가 세 가지 역할을 하지만, 이 세 가지는 서로 대체할 수 없습니다. 초보자들이 "nonce too low" 오류를 잘못 해석하거나, 채굴자들이 불가능한 설정을 설계하거나, PS3와 같은 시스템이 신뢰의 근원을 잃는 이유는 바로 이 세 가지를 혼동하기 때문입니다.
"한 번 사용되는 숫자"라고 불리는 32비트 논스: 출처
역두문자어는 도처에 있습니다. "Nonce는 한 번 사용된 숫자를 의미합니다." 대략적으로는 맞지만 역사적으로는 틀렸습니다. 이 영어 단어는 암호학보다 약 750년 앞서 존재했습니다. "For the nonce"라는 표현은 1200년대경 중세 영어 필사본에 등장하며, "이 특별한 경우를 위한"이라는 뜻입니다.
암호학은 1978년 니덤-슈뢰더 인증 프로토콜에서 이 용어를 차용했습니다. 여기서 핵심 속성은 무작위성이 아니라, 정의된 범위 내에서의 고유성입니다. 위키피디아는 실제 관행을 따라 논스(nonce)를 "암호 통신에서 단 한 번만 사용할 수 있는 임의의 숫자"라고 정의합니다. 카운터, 타임스탬프, 난수, 또는 이 세 가지를 조합한 값 모두 논스에 해당합니다. 중요한 것은 시스템 내에서 동일한 논스가 동일한 키나 동일한 컨텍스트에서 다시 나타나지 않는다는 것입니다.
하나의 단어가 모든 작업을 처리하고, 그 작업은 세 부분으로 나뉩니다. 비트코인의 채굴 논스는 블록 해시값이 목표 난이도 아래로 떨어질 때까지 계속 변동합니다. 이더리움의 계정 논스는 네트워크에서 재사용을 허용하지 않는 카운터입니다. 대칭 암호화에서 암호화 논스는 키와 쌍을 이루는 값이며, 한 번 재사용하면 암호화가 무너집니다.
그 단어는 널리 쓰이지만, 문맥은 그렇지 않다.

비트코인 채굴에서 논스(nonce)는 어떻게 작동할까요?
비트코인에서 논스(nonce)는 80바이트 블록 헤더 내의 32비트 필드를 차지합니다. 즉, 4바이트입니다. 값은 0부터 4,294,967,295까지입니다. 이는 약 43억 개의 가능한 숫자로, 사토시 나카모토가 프로토콜을 만들었을 당시에는 엄청나게 큰 숫자였지만, 지금은 책상 크기의 ASIC 장비로도 마이크로초 만에 모두 처리할 수 있습니다.
채굴은 유효한 블록 해시를 생성하는 값을 찾는 경쟁입니다. 80바이트 헤더를 예로 들어 보겠습니다. 이 헤더를 비트코인 블록체인에서 사용되는 암호화 해시 함수인 SHA-256에 두 번 통과시키면 256비트 숫자가 나옵니다. 이 숫자를 네트워크 난이도 목표(작업증명 합의 메커니즘)에서 설정한 목표 해시 값과 비교합니다. 목표 값보다 낮으면 블록이 유효하고 채굴자가 승리합니다. 목표 값보다 높으면 논스 값을 1만큼 증가시키고 다시 해싱합니다. 비트코인 채굴자들은 누군가 유효한 논스를 찾고 새로운 블록이 블록체인에 추가될 때까지 이 과정을 반복합니다.
왜 이렇게 큰 작업에 비해 필드가 너무 작을까요? 구조적인 이유 때문입니다. 논스는 채굴자가 변경할 수 있는 헤더 요소 중 가장 비용이 적게 드는 부분입니다. 다른 모든 필드는 서로 의존성을 가지고 있습니다. 머클 루트는 블록의 트랜잭션을 요약하므로, 이를 변경하면 새로운 해시 값을 시도하기 전에 전체 트랜잭션 트리를 다시 계산해야 합니다. 하지만 논스는 이 모든 과정을 우회합니다. 각 해시 시도는 독립적입니다. 논스를 증가시키는 것은 임의의 값을 선택하는 것과 마찬가지로 블록 진행에 아무런 도움이 되지 않습니다. 합의 알고리즘이라는 가면을 쓴 무차별 대입 공격인 셈입니다.
이 설계는 대략 1년 동안은 유효했습니다. 하지만 그 후 ASIC 채굴기가 등장하면서 문제가 발생했습니다. 최신 채굴기는 43억 개의 논스(nonce) 값을 초 단위가 아닌 마이크로초 단위로 모두 소진합니다. 비트메인 앤트마이너 S21 Pro는 초당 234테라해시(TH/s)의 속도로 작동합니다. 이 하드웨어에서 전체 논스 필드는 약 18마이크로초 만에 소진됩니다. 2026년 5월 기준으로 비트코인 네트워크의 총 해시레이트는 약 996 EH/s이며, 난이도는 132조 4700억입니다. S21 Pro 한 대만으로도 초당 수만 번씩 모든 가능한 논스 값을 소진할 수 있습니다.
사토시의 프로토콜은 32비트 공간이 모두 소진되면 채굴자에게 두 가지 깔끔한 종료 방법을 제공합니다. 첫 번째는 코인베이스 거래의 스크립트 서명(scriptSig) 내부에 숨겨진 "추가 논스(extra nonce)" 필드입니다. BIP34는 이를 코드화합니다. 2바이트에서 100바이트 사이의 크기를 가지며 채굴자가 제어할 수 있습니다. 추가 논스를 변경하면 코인베이스 TXID가 바뀌고, 머클 루트를 다시 계산해야 하며, 블록 헤더가 변경되고, 새로운 32비트 논스 검색이 시작됩니다. 두 번째 종료 방법은 프로토콜에서 허용된 범위 내에서 타임스탬프를 조정하거나 버전 비트를 순환하는 것입니다. 오늘날 채굴 풀은 정상적인 운영의 일환으로 이러한 모든 작업을 순환합니다. 논스 조정은 가장 비용이 적게 드는 변경 방법입니다. 추가 논스 조정은 두 번째로 비용이 적게 드는 방법입니다. 머클과 타임스탬프 순환은 계산에 필요한 작업량이 많은 순서대로 더 나중에 있습니다.
누군가가 목표 해시값보다 낮은 값(채굴자들은 이를 "골든 논스"라고 부릅니다)을 달성하면 새로운 블록이 P2P 네트워크를 통해 전송되고, 모든 경쟁자는 현재 진행 중인 검색을 중단하고 다음 라운드를 다시 시작합니다.
| ASIC 모델 | 해시레이트 | 32비트 nonce를 모두 소진할 시간 | 능률 |
|---|---|---|---|
| 앤트마이너 S21 | 200 TH/s | 약 21마이크로초 | 17.5 J/TH |
| 앤트마이너 S21 프로 | 234 TH/s | 약 18마이크로초 | 15 J/TH |
| 앤트마이너 S21 XP | 270 TH/s | 약 16마이크로초 | 13.5 J/TH |
최근의 실제 사례를 통해 이 추상적인 개념을 뒷받침합니다. 2026년 초에 채굴된 블록 948,000은 블록 해시값이 `00000000000000000001b01841afc366a4f999b291c8563ee0d0db956fc2db44`이고, 최종적으로 선택된 논스 값은 2,582,463,598 입니다. 이 하나의 정수와 블록 헤더의 나머지 요소들이 결합되어 블록체인에 추가될 수 있을 만큼 충분히 낮은 해시값을 생성했습니다. 해당 라운드에서 채굴자가 시도한 다른 모든 논스 값은 너무 컸습니다.
이것이 바로 기계적인 의미의 작업증명입니다. 수수께끼 같은 퍼즐이 아닙니다. 전기료를 지불하고 유효한 논스를 찾는 과정입니다.
해시 논스(Hash nonce)와 계정 논스(Account nonce): 같은 단어지만 다른 역할
암호화폐에서 "nonce"라는 단어는 다른 한 가지 용도로 재사용되는데, 이 둘의 중복이 초보자들이 가장 혼란스러워하는 부분입니다. 비트코인의 채굴 nonce는 검색 변수이고, 이더리움의 계정 nonce는 카운터입니다. 이름만 같을 뿐, 그 외에는 거의 공통점이 없습니다.
| 해시 논스(비트코인) | 계정 논스(이더리움) | |
|---|---|---|
| 직업 | 대상 아래에서 유효한 해시를 검색하세요 | 계좌별 출금 거래 순서 |
| 그것이 사는 곳 | 블록 헤더(32비트) | 계정 상태 (정수, 0부터 시작) |
| 누가 그것을 변이시키는가 | 채굴기는 하드웨어적으로 초당 수십억 달러를 채굴합니다. | 지갑에는 자동으로 전송 건당 하나씩 저장됩니다. |
| "틀렸다"는 말의 의미는 무엇인가 | 복권 구매 실패, 다음 nonce를 시도하세요. | 거래가 거부되었거나 보류되었습니다. |
| 합의와 연관되어 있나요? | 네, 이것은 작업 증명입니다. | 아니요, 이건 리플레이 방지 기능입니다. |
해시 논스는 채굴자가 버리는 임시 숫자입니다. 계정 논스는 네트워크에서 사용자의 주소를 나타내는 영구적인 상태 정보입니다. 이 둘을 혼동하여 비트코인 블록의 블록체인 논스를 마치 순번 카운터처럼 취급하는 것은 사람들이 이더리움에서 "논스 너무 낮음" 오류를 접하고 채굴 설정에 문제가 있다고 오해하는 이유입니다. 서로 다른 블록체인, 다른 역할이지만 같은 용어를 사용합니다. 심지어 동일한 생태계 내에서도 블록체인 운영에서 논스의 역할은 합의 계층을 살펴보는지 계정 계층을 살펴보는지에 따라 완전히 달라집니다.
이더리움 계정 논스(nonce)와 거래 지연 문제
이더리움 네트워크에서 외부 소유의 모든 계정은 고유한 논스(nonce) 값을 가집니다. 이 값은 해당 주소가 처음으로 트랜잭션을 전송할 때 0으로 시작하며, 이후 블록에 포함되는 각 트랜잭션마다 1씩 증가합니다. 트랜잭션을 전송할 때, 지갑은 네트워크에 현재 값을 요청하고, 다음 논스 값을 추가한 후 서명합니다. 네트워크는 엄격한 순서대로만 트랜잭션을 처리합니다. 논스 값은 0, 1, 2 순으로 전송되며, 순서 사이에 공백이 생기면 안 됩니다.
이러한 엄격한 순서 지정이 이더리움에 리플레이 공격 방지 기능을 제공합니다. 서명된 트랜잭션은 특정 논스(nonce)에 연결되며, EIP-155 이후로는 특정 체인 ID에도 연결됩니다. 공격자는 이미 실행된 이전 트랜잭션을 마치 새로운 트랜잭션인 것처럼 재전송할 수 없습니다. 재전송이 도착할 때쯤이면 계정 논스는 이미 이전 논스를 넘어섰기 때문입니다. 체인 ID는 크로스체인 리플레이 공격도 같은 방식으로 차단합니다. 한 체인 내에서 확정된 트랜잭션은 이미 카운터의 특정 지점에 남아 있게 됩니다.
이러한 엄격한 순서 지정 방식은 새로운 이더리움 지갑 사용자들이 끊임없이 겪는 문제점을 야기합니다. 거래가 너무 낮은 팁으로 전송되면 검증자들은 해당 거래를 무시합니다. 멤풀은 우선순위 큐에서 해당 거래를 제거합니다. 그러면 거래는 확정되지도, 실패하지도 않은 채 그대로 멈춰 서게 됩니다. 더 심각한 것은, 동일한 주소로 서명하는 이후의 모든 거래는 더 높은 논스 값을 갖게 된다는 점입니다. 네트워크는 멈춰선 거래가 확정되거나 다른 거래로 대체될 때까지 이러한 후속 거래들을 처리하지 않습니다. 하나의 느린 거래가 전체 큐를 멈추게 하는 것입니다.
이 문제는 '수수료 대체'라는 메커니즘을 통해 해결됩니다. 지갑은 문제가 발생한 트랜잭션과 동일한 논스(nonce)를 사용하지만, 더 많은 가스를 할당하여 새로운 트랜잭션을 다시 전송합니다. 2021년 8월 런던 업그레이드 이후 이더리움에 적용된 가스 가격 모델인 EIP-1559는 다음과 같은 규칙을 정합니다. 새로운 트랜잭션은 기존 트랜잭션보다 `maxFeePerGas`와 `maxPriorityFeePerGas` 값을 최소 10% 이상 높여야 합니다. 문제가 발생한 트랜잭션을 대체하는 대신 완전히 삭제하고 싶다면, 문제가 발생한 논스에 더 높은 팁을 할당하여 0 ETH의 자체 전송을 보내면 됩니다. 그러면 해당 슬롯이 소모되고, 대기열에 있는 이후의 모든 트랜잭션이 다시 활성화됩니다.
참고로 2026년 5월 수치를 살펴보겠습니다. 평균 우선순위 팁은 약 1.875 Gwei입니다. 일반적인 21,000갤런 연료 취소는 교통량이 적은 날에는 약 0.05달러 정도이며, 교통 체증이 심한 날에는 몇 달러까지 올라갑니다. 결국 모든 사람이 뼈아프게 배우게 되는 교훈이 하나 있습니다. 바로 보류 중인 nonce 값이 가장 낮은 거래부터 먼저 처리해야 한다는 것입니다. 이전 거래가 아직 처리되지 않은 상태에서 나중 거래의 수수료를 올리는 것은 아무런 도움이 되지 않습니다.
계정 추상화는 이 이야기를 약간 재구성합니다. ERC-4337 스마트 계정은 2차원 논스를 사용하는데, 이는 정수를 192비트 "키"와 64비트 시퀀스로 분리합니다. 서로 다른 키는 병렬 트랜잭션 스트림을 형성합니다. 한 키에 대한 배치 작업이 중단되더라도 다른 키에 대한 작업은 차단되지 않습니다. 계정 논스는 마침내 단일 선형 카운터를 넘어 확장되었습니다.
마지막으로 바로잡아야 할 잘못된 통념이 하나 더 있습니다. 2022년 9월 머지(Merge) 시점에 이더리움이 지분증명(Proof of Stake) 방식으로 전환되었지만, 계정 논스(Account nonce)는 사라지지 않았습니다. 블록 헤더 안에 있던 마이닝 논스가 없어진 것뿐입니다. 검증자가 해시 퍼즐이 아닌 슬롯 방식으로 선정되기 때문입니다. 계정 논스는 이전과 마찬가지로 계정 상태 트라이(Account State Trie)에 그대로 남아 있습니다.
암호화에서의 암호화 논스: 재앙적인 버전
블록체인 범위를 벗어나면 암호화 논스(nonce)가 훨씬 더 정확한 역할을 합니다. 논스를 잘못 사용하면 모든 것이 무너져 내릴 수 있습니다.
모든 최신 인증 암호화 방식은 비밀 키와 메시지별 논스(nonce) 값을 쌍으로 사용합니다. TLS 1.3의 핵심 암호화 방식인 AES-GCM은 96비트 논스를 사용하며, NIST SP 800-38D에서 해당 사양을 명시했습니다. RFC 8439(2018년 6월)에 규정된 대안인 ChaCha20-Poly1305는 동일한 96비트 논스 길이를 복사하여 256비트 키와 쌍으로 사용합니다. 두 방식 모두 기본적으로 각 (키, 논스) 쌍은 정확히 한 번만 사용됩니다. 키와 논스 쌍의 재사용은 성능 저하를 완화하는 것이 아니라, 급격한 성능 저하를 초래합니다.
절벽은 어떤 모습일까요? AES-GCM에서 하나의 키에 동일한 논스를 재사용한다고 가정해 봅시다. 공격자가 두 개의 암호문을 모두 확보했다고 가정해 보세요. 공격자는 두 암호문을 XOR 연산합니다. 그러면 두 평문의 XOR 연산 결과가 출력됩니다. 기밀성은 단 한 번에 무너집니다. 더 심각한 문제가 발생합니다. GCM의 인증 모드는 내부 인증 서브키(해당 키로 작성된 모든 암호문에 서명하는 값)를 노출시킵니다. 공격자는 이 서브키를 이용해 새로운 인증된 암호문을 생성하고, 정당한 수신자는 이를 진짜로 받아들입니다. 최첨단 암호화 방식이라도 잘못된 논스 하나 때문에 시저 암호보다 취약해질 수 있습니다.
이 모든 것은 가상이 아닙니다. 2016년 USENIX WOOT 보고서인 "Nonce-Disrespecting Adversaries"에서는 실제 운영 중인 HTTPS 엔드포인트를 스캔하여 GCM nonce를 재사용하는 서버 184대를 발견했습니다. 해당 버그가 있는 빌드에는 특정 Cisco IOS XE 이미지와 Radware ADC 펌웨어가 포함되어 있었습니다. CVE-2016-0270 및 이와 관련된 여러 CVE가 이를 추적하고 있습니다.
2010년 12월 소니의 PS3 해킹 사건은 ECDSA라는 다른 암호화 방식에서 발생한 동일한 문제였습니다. 모든 ECDSA 서명에는 고유하고 비밀스러운 값인 'k' 가 필요합니다. 소니의 서명 코드는 이 고유성 부분을 생략했습니다. 상수 k 를 하드코딩하고 모든 서명에 재사용했습니다. 공격자가 동일한 k 값을 가진 서로 다른 메시지에 대한 두 개의 ECDSA 서명을 얻으면, 두 개의 미지수를 가진 두 개의 선형 방정식을 풀 수 있습니다. 이 방정식을 풀면 폐쇄형으로 된 개인 서명 키가 나옵니다. fail0verflow는 베를린에서 열린 제27회 카오스 커뮤니케이션 컨퍼런스에서 이 과정을 자세히 설명했습니다. 소니의 마스터 서명 키는 몇 시간 만에 인터넷에 유출되었고, 지금까지 생산된 모든 PS3는 신뢰 체인을 한순간에 잃었습니다.
2013년 RFC 6979로 공식화된 결정론적 방식은 난수 생성기를 사용하지 않습니다. 메시지와 개인 키의 HMAC를 통해 k 값 을 도출합니다. 동일한 메시지, 동일한 키, 동일한 k 값 이므로 난수 생성기의 오류가 발생하지 않습니다. 최신 비트코인 라이브러리는 결정론적 ECDSA를 기본값으로 제공합니다.
이러한 사례들에서 두 가지 중요한 결론이 도출되는데, 이는 개발자들을 종종 혼란스럽게 합니다. AEAD 암호화 방식(AES-GCM, ChaCha20-Poly1305)에서는 예측 가능한 nonce 값이 문제가 되지 않습니다. 카운터를 사용해도 됩니다. 고유성만이 유일한 요구 사항입니다. 하지만 ECDSA와 Schnorr 서명에서는 규칙이 완전히 반대입니다. 예측 가능한 k 값은 치명적인 결과를 초래합니다. 이러한 서명에 사용되는 nonce는 고유하고 예측 불가능하며 동시에 비밀로 유지되어야 합니다. 이 두 가지 방식을 혼합해서 사용하는 것이 바로 커스텀 지갑 코드에서 nonce 재사용 버그가 계속 발생하는 이유입니다. Kopia 백업 프로젝트의 2024년 감사 보고서에서는 장기 사용 키에서 임의의 GCM nonce 충돌 위험이 발견되었으며, 최신 SDK에 대한 침투 테스트 보고서에서도 매달 유사한 결과가 보고되고 있습니다.
논스 vs. 소금 vs. 정맥주사: 세 가지를 혼동하지 마세요
보안 관련 글에서 사람들은 솔트(Salt), 논스(Nonce), IV라는 세 단어를 마치 같은 의미인 것처럼 사용하는 경우가 많습니다. 하지만 이 세 단어는 동의어가 아닙니다.
솔트는 비밀번호 해싱에 사용됩니다. 사용자별로 임의의 값을 생성하여 해시에 섞으면, "password123"과 같은 비밀번호에 대해 미리 계산된 레인보우 테이블이 더 이상 데이터베이스에 적용되지 않게 됩니다. 솔트는 해시 값과 함께 평문으로 존재하며, 아무도 숨길 수 없습니다. 두 사용자가 동일한 솔트를 공유하는 것은 문제가 될 수 있습니다. 한 사용자의 비밀번호를 해킹한 공격자는 다른 사용자의 비밀번호도 해킹할 수 있기 때문입니다. 하지만 이것이 심각한 보안 문제는 아닙니다.
논스는 메시징과 서명에 사용됩니다. 대칭 암호화에서는 메시지별로, ECDSA에서는 서명별로 사용됩니다. AES-GCM과 같은 AEAD 암호는 솔트가 해시 옆에 있는 것처럼 논스를 평문으로 노출합니다. ECDSA는 논스를 숨기고 비밀로 취급하며, 매번 새로운 난수를 요구합니다. 어느 방식이든 충돌은 단순한 문제가 아니라 치명적인 결과를 초래합니다. 암호화에 대한 모든 보장이 사라지는 것입니다.
IV(초기화 벡터)는 최신 규격에서 논스(nonce)라고 부르는 것을 지칭하는 기존 명칭입니다. CBC 및 CTR 모드에서는 오랫동안 이 용어를 사용해 왔습니다. 최신 AEAD 문서에서는 "벡터"라는 단어가 수학 숙제처럼 들리고 사람들이 이를 계속 재사용하는 경향이 있어 "논스"로 변경했습니다. "논스"는 이러한 규칙에 더 충실한 용어입니다.
포스트잇에 적을 수 있는 규칙 하나만 필요하세요? 솔트는 당신이 저장하는 비밀을 보호하고, 논스는 당신이 보내는 비밀을 보호합니다.

비트코인 채굴 관련 사소한 지식 외에 논스(nonce)가 중요한 이유
논스(nonce)는 작은 객체입니다. 비트코인에서는 32비트, 이더리움에서는 카운터, AES-GCM에서는 12바이트입니다. 하지만 그 크기에 비해 엄청난 중요성을 지닙니다. 일반 사용자에게는 모든 이더리움 거래 오류, 은행 사이트와의 TLS 핸드셰이크, 하드웨어 지갑이 생성하는 모든 서명이 논스의 정확한 처리에 달려 있습니다. 개발자에게는 논스 처리 오류는 사용자 정의 암호화 코드에서 치명적인 버그가 발생하는 가장 흔한 원인입니다. PS3 사건은 극단적인 사례였지만, 동일한 오류 유형이 최신 지갑 SDK와 백업 도구에서도 계속해서 나타나고 있습니다. 비트코인 경제에서 32비트 논스와 추가 논스 메커니즘은 ASIC 채굴이 공정한 복권처럼 작동할 수 있도록 만든 핵심 요소입니다. 사토시 나카모토의 가장 중요한 설계 선택 중 하나가 평범해 보이는 헤더 필드 안에 숨겨져 있는 것입니다.
논스는 어떤 일이 이 순서대로, 정확히 이런 방식으로 한 번만 발생했음을 보장하는 요소입니다. 논스를 제거하면 고유성에 의존하는 모든 시스템은 공격자가 손쉽게 재구축할 수 있는 형태로 무너집니다. 합의 메커니즘이 무너지고, 재실행 방지 기능이 사라지며, 암호화 정보가 유출되고, 서명이 위조될 수 있습니다.