Advertise수수료 우대 데스크

용어집개념

리플레이 공격이란? 하드포크 뒤 같은 거래가 두 번 실행되는 이유

리플레이 공격(리플레이 어택)은 한 블록체인에서 서명된 유효한 거래를 복사해, 같은 기록·주소·서명 체계를 공유하는 다른 체인에 다시 전파하는 암호화폐 보안 취약점입니다. 주로 하드포크로 거의 똑같은 원장 두 개가 생긴 직후에 나타납니다. 디지털 서명이 두 체인 모두에서 암호학적으로 유효하기 때문에 같은 거래가 두 번 승인되고, 손대지 않으려던 체인의 자금까지 움직입니다. 공격자는 받는 주소나 금액을 바꿀 수 없고, 이미 서명한 거래를 복제할 수만 있습니다. 대응책은 각 원장이 상대 체인의 거래를 거부하도록 체인 고유의 표식을 넣는 리플레이 보호입니다.

작성: COINOTAG Research Desk최종 업데이트 출처

gate.com

암호화폐에서 리플레이 공격이란 한 블록체인에서 이미 서명된 유효한 거래를 복사해 거의 똑같은 두 번째 체인에 다시 전파함으로써, 소유자의 새로운 동의 없이 같은 자금이 두 원장 모두에서 움직이게 되는 현상을 말합니다. 영어 그대로 리플레이 어택이라고도 부릅니다. 이 문제는 거의 항상 논쟁적인 하드포크 직후, 두 체인이 동일한 거래 기록과 주소 형식, 서명 체계를 공유할 때 나타납니다. 내 암호 서명이 두 체인에서 수학적으로 모두 유효하기 때문에, 공격자나 심지어 자동으로 동작하는 노드도 내가 건드릴 생각이 없던 체인에서 거래를 '재생'할 수 있습니다. 방어 수단은 각 체인이 상대 체인의 거래를 거부하도록 코드 수준에서 표식을 넣는 리플레이 보호(replay protection)입니다.

리플레이 공격은 실제로 어떻게 일어나나?

비트코인 같은 블록체인이 하드포크로 갈라지면, 분리 시점의 모든 보유자는 새로 생긴 두 체인 모두에서 같은 잔액을 갖게 됩니다. 두 원장은 포크 블록까지 바이트 단위로 완전히 같으며, 여기에는 지갑 주소와 이를 보호하는 디지털 서명도 포함됩니다.

binance.com

위험은 한쪽 체인에서만 자금을 쓰는 순간 시작됩니다. 서명된 거래는 사실상 공개된 지시문입니다. "주소 A에서 주소 B로 코인 X개를 보낸다, 해당 개인키 소유자가 서명함"이라는 내용이죠. 같은 서명 알고리즘을 쓰는 포크 체인에서는 이 지시문이 그대로 암호학적으로 유효합니다. 네트워크를 지켜보던 누구든 내가 전파한 거래를 가져다 다른 체인에 다시 제출할 수 있고, 두 번째 원장은 이를 정상 거래로 받아들입니다.

다만 피해를 제한하는 중요한 조건이 있습니다. 리플레이 공격은 똑같은 거래를 복제할 수만 있습니다. 받는 사람이나 금액을 바꾸면 서명이 무효가 되므로 공격자는 자금을 새로운 주소로 돌릴 수 없습니다. 따라서 위협의 본질은 공격자 주소로의 도난이 아니라, 내 코인이 어느 체인에서 움직일지에 대한 통제권을 잃는 것입니다. 체인 A에서만 쓰고 체인 B의 코인은 그대로 두려 했다면, 리플레이가 체인 B의 코인까지 조용히 써 버립니다.

bitget.com

포크 지점까지 동일한 블록 기록을 공유하는 체인 A와 체인 B를 나란히 놓고, 서명된 거래 하나가 체인 A에서 체인 B로 복사되는 화살표를 그린 도식

예시로 보기: 포크를 사이에 둔 코인 5개

하드포크로 체인이 '레거시'와 '뉴체인'으로 갈라졌고, 분리 시점에 양쪽에 코인을 5개씩 갖고 있다고 해 봅시다.

  1. 레거시 코인 5개는 거래소에서 팔고, 뉴체인 코인 5개는 콜드 스토리지에 그대로 두려고 합니다.
  2. 레거시 코인 5개를 거래소 입금 주소로 보내는 거래에 서명하고 전파합니다.
  3. 뉴체인도 같은 주소 형식과 서명 체계를 쓰므로, 이 서명된 거래는 뉴체인에서도 유효합니다.
  4. 어떤 노드나 기회를 노리던 참여자가 이 거래를 뉴체인에 다시 전파하고, 네트워크가 승인합니다.
  5. 결과적으로 레거시 코인만 옮기려 했는데 두 체인 모두에서 코인 5개가 거래소 주소로 넘어갔습니다. '손대지 않은' 뉴체인 코인이 사라진 것입니다.

이 예에서 공격자는 금전적 이득을 얻지 못하지만, 나는 지키려던 자산의 보관 통제권을 잃습니다. 다른 상황에서는 공격자가 재생된 거래가 자신에게 유리하도록 조건을 의도적으로 만들 수도 있습니다.

리플레이 보호: 체인은 어떻게 스스로를 지키나?

책임 있게 설계된 포크는 각 체인이 상대 체인용 거래를 거부하도록 리플레이 보호를 넣습니다. 가장 깔끔한 방법은 거래 형식 자체에 체인 고유 식별자를 심는 것입니다.

예를 들어 비트코인의 대규모 하드포크로 별도 체인이 생겼을 때, 새 체인은 전용 서명 해시 플래그('포크 ID' 또는 SIGHASH 표식)를 추가했습니다. 이 표식이 있으면 원래 체인의 노드는 거래를 살펴보고 상대 체인 전용이라는 것을 알아차려 거부합니다. 반대 방향도 마찬가지입니다. 이를 강한 리플레이 보호라고 하는데, 프로토콜 수준에서 의무적으로 적용되기 때문입니다.

이용자가 상대 체인에서는 무효인 거래를 직접 만들어야 하는 약한 선택형 방식도 있지만, 이는 이용자의 주의력과 도구 지원에 좌우됩니다.

리플레이 보호 방식 비교

방식누가 조치하나효과주로 쓰이는 경우
강한 보호(프로토콜 수준 포크 ID)개발자높음, 모든 이용자에게 자동 적용잘 준비된 하드포크
선택형 / 와이프아웃개별 이용자중간, 이용자 숙련도에 좌우자체 보호가 없는 포크
믹싱 / 새 UTXO개별 이용자중간, 거래마다 수동 처리포크 이후 자기 방어
보호 없음아무도 없음없음, 리플레이에 완전히 노출급하게 진행되거나 논쟁적인 포크

왜 어떤 포크는 보호 없이 진행되나?

모든 포크가 리플레이 보호를 넣는 것은 아니며, 이유는 기술적으로 불가능해서라기보다 정치적·실무적인 경우가 대부분입니다. 리플레이 보호를 넣는 것 자체가 합의 메커니즘의 변경이므로 미리 합의하고 코드로 구현해야 합니다. 포크가 급하게 진행되거나 논쟁적이면 개발자가 시간이 부족할 수 있고, 한쪽 진영이 상대편이 구현해야 한다고 고집할 수도 있습니다.

더 근본적인 문제는 시점입니다. 포크 일정이 이미 잡힌 뒤에 리플레이 보호를 덧붙이려면 사실상 또 한 번의 포크가 필요하고, 그러면 네트워크가 두 개가 아니라 세 개의 체인으로 쪼개질 수 있습니다. 그래서 숙련된 엔지니어들은 리플레이 보호를 분리 블록 훨씬 전에 확정해야 하는, 양보할 수 없는 설계 요건으로 봅니다. 보호 없이 발표된 포크는 널리 알려진 위험 신호입니다.

포크 발표, 리플레이 보호를 넣을 수 있는 기간, 포크 블록을 차례로 보여 주고, 보호가 빠진 지점에 경고 표시를 단 타임라인 그래픽

리플레이 공격에서 나를 지키는 방법

체인 분리가 다가오는데 리플레이 보호 여부가 불확실하다면, 몇 가지 습관만으로도 노출을 크게 줄일 수 있습니다.

  • 기다리기. 거래를 거의 하지 않는 장기 보유자라면 포크 뒤 며칠 동안 아무것도 하지 않으면 됩니다. 거래가 없으면 재생될 것도 없습니다.
  • 코인을 의도적으로 분리하기. 한쪽 체인에서만 유효한 거래로 잔액에 '표시'를 남겨 두 체인의 코인을 구분되게 만듭니다. 새로 채굴된 코인베이스 보상이나 믹싱 서비스를 거친 코인은 분리 전에 두 체인에 똑같이 존재하지 않았으므로 원래 재생될 수 없습니다.
  • 직접 노드 운영하기. 어느 체인으로 전파하는지 정확히 확인하고 리플레이 보호가 켜져 있는지 검증할 수 있습니다. 설정 방법은 비트코인 노드 운영 가이드에서 확인하세요.
  • 거래소 정책 확인하기. 신뢰할 만한 거래소는 보통 안전한 처리 방법을 확인할 때까지 포크 전후로 입출금을 멈춥니다. 서둘러 거래하기보다 그 중단을 믿는 편이 낫습니다.
  • 지갑 지원 확인하기. 무엇이든 옮기기 전에 확인하세요. 강한 리플레이 보호가 있을 때 요즘 지갑은 대개 분리를 자동으로 처리합니다.

포크 구조를 더 깊이 알고 싶다면 소프트포크와 하드포크 비교 가이드를, 포크로 생긴 코인을 안전하게 다루는 방법은 하드포크 코인과 에어드롭 받기 가이드를 참고하세요.

위험과 흔한 실수

  • "나에겐 일어나지 않는다"는 생각. 보호가 없는 체인에서 리플레이는 자동으로 일어납니다. 정교한 공격자가 없어도 코인이 두 원장에서 모두 움직일 수 있습니다.
  • 너무 일찍 거래하기. 도구와 거래소의 보호 조치가 따라잡기 전인 포크 직후 몇 시간, 며칠이 가장 위험한 구간입니다.
  • 리플레이를 이중 지불이나 도난과 혼동하기. 리플레이는 내가 서명한 거래를 복제할 뿐이며 공격자 주소로 자금을 보낼 수 없습니다. 잃는 것은 어느 체인에서 코인이 움직일지에 대한 통제권이지, 임의의 도난이 아닙니다.
  • 감사받지 않은 포크용 지갑 믿기. 논쟁적인 포크에 맞춰 급히 나온 지갑은 분리를 잘못 처리해 위험을 키울 수 있습니다.
  • 공포와 사실을 구분하지 않기. 포크에는 과장된 공포 조장이 따라붙습니다. 실제 위험은 특정 구간에 집중되어 있고 관리할 수 있으며, 공포에 휩쓸린 거래가 포크 자체보다 더 큰 피해를 주는 경우가 많습니다.

핵심 정리

리플레이 공격은 해킹 기법이라기보다 설계 원칙에 대한 시험으로 이해하는 편이 정확합니다. 포크 개발자들이 분리 전에 보호 장치를 넣을 만큼 이용자 안전을 존중했는지를 드러내기 때문입니다. 정리하면 간단합니다. 강한 프로토콜 수준 리플레이 보호 없이 발표된 포크는 위험이 높다고 보고, 상황이 정리될 때까지 코인을 움직이지 말고, 분리는 거래소와 충분히 감사받은 지갑에 맡기세요. 리플레이 공격을 무력화하는 기술은 오래전부터 있었습니다. 이 문제가 계속 나타나는 것은 거의 언제나 암호학이 아니라 거버넌스의 실패 때문입니다.

투자자 유의사항

한국에서 가상자산 거래는 금융정보분석원(FIU)에 신고한 가상자산사업자를 통해 이루어지며, 2024년 7월 19일부터 「가상자산 이용자 보호 등에 관한 법률」이 시행되고 있습니다.

가상자산은 가격 변동성이 크고 원금 손실이 발생할 수 있습니다. 이 페이지는 정보 제공 목적이며 투자 권유가 아닙니다.

금융정보분석원(FIU) · 국가법령정보센터: 가상자산 이용자 보호 등에 관한 법률

자주 묻는 질문

질문 4개
리플레이 공격이란 무엇인가요?

리플레이 공격은 한 블록체인에서 서명된 유효한 거래를 포크로 생긴 거의 똑같은 두 번째 체인에 다시 전파하는 것입니다. 서명이 두 체인 모두에서 암호학적으로 유효하므로 같은 거래가 두 번 승인되고, 쓰려고 하지 않은 체인의 자금까지 움직입니다. 새로운 수신자에게 보내거나 금액을 바꿀 수는 없고, 이미 서명한 거래를 복제할 수만 있습니다.

리플레이 공격은 어떻게 막을 수 있나요?

가장 강력한 방어는 포크에 프로토콜 수준의 리플레이 보호를 넣어 각 체인이 상대 체인의 거래를 거부하게 하는 것입니다. 이용자로서는 포크 뒤 며칠 동안 거래를 미루고, 새로 채굴됐거나 믹싱을 거친 코인처럼 재생될 수 없는 거래로 코인을 분리하고, 직접 노드를 운영하며, 분리가 안전해질 때까지 활동을 멈추는 거래소와 감사받은 지갑을 활용할 수 있습니다.

리플레이 공격으로 내 코인이 공격자 지갑으로 도난당할 수 있나요?

아닙니다. 리플레이 공격은 이미 서명한 거래를 복제할 수만 있으며, 자금을 임의의 공격자 주소로 돌리거나 금액을 바꾸면 서명이 무효가 됩니다. 실제 피해는 내 코인이 어느 포크 체인에서 움직일지에 대한 통제권을 잃는 것, 예를 들어 두 번째 체인에 그대로 두려던 잔액이 함께 쓰이는 것입니다.

왜 어떤 포크에는 리플레이 보호가 없나요?

리플레이 보호 자체가 포크 전에 코드로 구현하고 합의해야 하는 합의 규칙 변경이기 때문입니다. 급하거나 논쟁적인 포크는 시간이 부족할 수 있고, 경쟁 진영끼리 누가 구현할지 의견이 갈릴 수도 있습니다. 포크 일정이 잡힌 뒤에 덧붙이려면 사실상 또 다른 포크가 필요해 네트워크가 세 체인으로 쪼개질 수 있으므로, 보호가 빠지는 것은 대개 기술적 한계가 아니라 거버넌스의 실패입니다.

최종 업데이트: