초보자를 위한 이중 지불 설명
초보자를 위한 이중 지불 설명
아티클

초보자를 위한 이중 지불 설명

중급
Published Feb 17, 2020Updated Apr 29, 2021
7m

이중 지불이란 무엇인가요?

이중 지불이란 디지털 현금 시스템 내에서 동일한 자산이 두 명의 수신자에게 동시에 전송될 수 있는 문제를 뜻합니다. 적절한 대응책을 마련하지 못한다면, 이중 지불 문제를 해결하지 못하는 프로토콜은 근본적으로 파괴되는데, 사용자가 자신이 전달받은 자금이 다른 어딘가에서 이미 사용되지 않았다는 것을 검증할 방법이 없기 때문입니다.

디지털 현금에서는 특정 자산이 중복될 수 없도록 하는 것이 가장 중요합니다. 앨리스가 10에 해당하는 자산을 전달받고, 이를 열 번 복제하여, 100에 해당하는 자산을 갖게 된다면 전체 시스템이 붕괴될 것입니다. 이와 유사하게, 만약 앨리스가 밥과 캐롤에게 10에 해당하는 자산을 동시에 전송할 수 있다면 해당 시스템은 제대로 작동할 수 없습니다. 따라서 이러한 행동을 방지할 체계가 있어야만 디지털 현금을 사용할 수 있습니다.


이중 지불을 어떻게 막을 수 있나요?

중앙화된 접근법

중앙화된 방법은 탈중앙화된 방법에 비해 상당히 간단합니다. 일반적으로 시스템을 관리하는 한 명의 감독이 있기 마련이며, 자산의 발행과 분배를 관장합니다. 데이비드 차움(David Chaum)의 eCash는 이중 지불 문제 해결책에 대한 중앙화된 접근법의 좋은 예입니다.

은행은 고객에게 현금처럼 보이는 디지털 자산을 발행하기 위해(익명성을 갖추고 있으며 피어-투-피어 교환이 가능한), 암호학자 데이비드 차움의 논문 Blind Signatures for Untraceable Payments에 기술된 은닉 서명(blind signature)을 사용할 수 있습니다.

이러한 상황에서 사용자(댄이라 하겠습니다)가 디지털 현금으로 100달러를 받기 원한다면, 그는 이를 먼저 은행에 알려야 합니다. 만약 댄의 계좌에 잔액이 있다면, 하나의 임의의 숫자를 생성하게 될 것(또는 더 작은 액면가에 대해서는 더 많은 숫자)입니다. 댄이 다섯 개의 숫자를 생성했다고 하고, 각 숫자가 20달러에 해당한다고 해보겠습니다. 은행이 특정 숫자를 추적할 수 없도록, 댄은 각 숫자에 은닉 요소(blinding factor)를 추가합니다.

이후 댄은 해당 데이터를 은행에 넘겨주며, 은행은 댄의 계좌에서 100달러를 인출하고 5개의 정보 조각들로 20달러씩을 교환할 수 있음을 증명하는 메시지에 서명합니다. 댄은 이제 은행에서 발행된 자금을 사용할 수 있습니다. 댄은 에린의 레스토랑에 가서, 40달러에 해당하는 식사를 합니다.

댄은 은닉 요소를 제거하여 각 디지털 현금 "지폐"와 연관된 각 자산의 고유한 식별자 역할을 하는 임의의 숫자(일련 번호와 상당히 유사한)를 드러낼 수 있습니다. 댄은 에린에게 두 개의 숫자를 보여주며, 에린은 댄이 다른 상점에서 이를 사용하는 것을 방지하기 위해 이를 즉시 은행에 청구해야 합니다. 은행은 서명이 유효한지 확인하고, 모든 것이 정확하다면, 에린에게 40달러를 입금합니다.

사용된 지폐는 이제 근본적으로 소각되었으며, 만약 에린이 같은 방법으로 자신의 잔액을 사용하기 원한다면 더 많은 지폐가 발행되어야 합니다.

차움의 eCash 구성은 비밀 송금에 유용할 수 있습니다. 그러나 중앙 실패 지점이 은행이기 때문에, 실패시 문제가 됩니다. 발행된 지폐는 그 자체로는 아무런 가치가 없는데, 이는 오로지 은행으로부터 가치가 파생되기 때문입니다. 고객은 은행의 통제 아래에 있으며, 돈을 사용하기 위해서는 은행의 허락을 받아야만 합니다. 이것이 바로 암호화폐가 해결하고자 하는 문제입니다.


탈중앙화된 접근법

감독이 없는 생태계에서 이중 지불을 방지하는 것은 더욱 어려운 일입니다. 균등한 힘을 가진 참여자들은 부정 행위를 방지하고 모든 사용자들이 정직하게 행동하기를 장려하기 위해 일련의 규칙들을 두고 협력해야만 합니다.

이중 지불 문제에 대한 가장 혁신적인 해결책은 비트코인 백서에서 찾아볼 수 있습니다. 비록 직접적으로 언급되지는 않았지만, 사토시(Satoshi)가 제시한 데이터 구조는 오늘날 블록체인이라는 이름으로 널리 알려져 있습니다.
블록체인은 정말이지 몇 가지 특별한 속성을 갖고 있는 데이터베이스에 지나지 않습니다. 네트워크 참여자들은(노드라 함) 특화된 소프트웨어를 실행하며, 이를 통해 자신의 데이터베이스 사본을 다른 동료와 동기화할 수 있습니다. 그 결과 네트워크의 모두가 제네시스 블록에 이르기까지 트랜잭션 기록을 감사할 수 있습니다. 공개적으로 블록체인을 볼 수 있게 되면, 이중 지불을 시도하는 트랜잭션과 같은 부정직한 행동을 감지하고 방지하기란 쉬운 일입니다.
사용자가 트랜잭션을 전송하면, 이는 바로 블록체인에 추가되는 것이 아니며, 마이닝을 통해 먼저 하나의 블록을 포함시켜야 합니다. 따라서 수신자는 블록이 체인에 추가된 다음에야 해당 트랜잭션을 유효한 것으로 간주해야 합니다. 그렇지 않으면, 전송자가 동일한 코인을 다른 곳에서 사용할 수 있어, 자금을 잃게 될 수 있습니다. 
트랜잭션이 확정되면 새로운 사용자에게 소유권이 할당되므로 코인은 이중 지불될 수 없습니다. 이것이 바로 결제를 유효한 것으로 간주하기 전에 많은 이들이 복수의 승인을 기다릴 것을 추천하는 이유입니다. 이어지는 각 블록들은 체인을 수정하거나 다시 쓰는데(51% 공격 중에 발생할 수 있음) 엄청난 노력이 필요하게 만듭니다.

식당 예시로 다시 돌아가 봅시다. 식당을 다시 찾은 댄은, 이번에는 "비트코인 받음"이라는 스티커를 창문에서 발견합니다. 댄은 지난 번에 맛있게 먹었던 음식을 다시 주문합니다. 가격은 0.005 BTC입니다.

에린은 댄이 자금을 전송해야 할 공개 주소를 보여 줍니다. 댄은 트랜잭션을 전송하는데, 해당 트랜잭션은 본질적으로 댄의 소유였던 0.005 BTC가 이제는 에린의 소유라 주장하는 서명된 메시지입니다. 지나치게 자세히 살펴보지 않아도, 누구나 댄의 서명이 된 트랜잭션을 제시하여 그가 실제로 코인의 소유자였으며, 이를 전송할 권한을 갖고 있었음을 검증할 수 있습니다.

그러나 앞서 언급한 것처럼, 트랜잭션은 승인된 블록 안에 있는 경우에만 유효합니다. 승인되지 않은 트랜잭션을 수용하는 것은 이전의 예시에서 은행에서 즉시 입금을 받지 않고 40달러의 eCash를 수용하는 것과 같으며, 전송자는 이를 다른 곳에서 사용할 수 있습니다. 따라서, 에린은 댄의 결제를 수용하기 전에 최소 여섯 블록이 승인되기(대략 1시간)를 기다려야 합니다.


비트코인 이중 지불

비트코인은 적어도 정해진대로 프로토콜을 사용할 때, 이중 지불 공격을 방어할 수 있도록 세심하게 설계되어 있습니다. 즉, 개인이 블록에서 트랜잭션이 승인되기를 기다리면, 전송자가 이를 되돌릴 수 있는 방법은 없습니다. 이를 되돌리기 위해서는 블록체인을 "되돌려야 하며", 이를 위해서는 비현실적인 수준의 연산 능력이 필요합니다.

그러나 승인되지 않은 트랜잭션을 승인하는 이들을 겨냥한 소규모 이중 지불 공격이 존재합니다. 예를 들어, 값싼 제품의 경우 상점 주인은 트랜잭션이 블록에 포함되기까지 기다리고 싶어하지 않을 수 있습니다. 바쁜 패스트푸드점에서는 네트워크가 모든 결제를 처리할 때까지 기다릴 수 없을 것입니다. 만약, 어느 기업이 “즉각적인” 결제를 수용한다면, 이중 지불 공격에 노출될 것입니다. 누군가 햄버거를 주문하고, 금액을 지불한 다음, 동일한 금액을 자신의 다른 주소로 즉시 전송할 수 있습니다. 수수료가 더 높을 경우, 새로운 트랜잭션이 먼저 승인될 가능성이 높으며, 따라서 이전 트랜잭션은 무효화될 것입니다.

다음은 이중 지불을 수반하는 세 가지 대표적인 공격 방법들입니다.

  • 51% 공격: 단일 주체나 조직이 50% 이상의 해시율을 통제하게 될 경우, 이들은 트랜잭션을 배제하거나 그 순서를 조작할 수 있게 됩니다. 비트코인에서 해당 공격이 발생할 가능성은 매우 낮지만, 다른 네트워크에서는 발생할 수도 있습니다.
  • 레이스 공격(Race attacks): 동일한 자금을 사용하는 두 개의 충돌하는 트랜잭션이 연속으로 전송되지만, 오직 하나의 트랜잭션만 승인되는 것입니다. 해당 공격의 목표는 자신에게 이익이 되는 트랜잭션만 유효하게 만들어, 결제를 무효화하는 것(동일한 자금을 자신이 관리하는 주소로 보내어)입니다. 레이스 공격은 수신자가 승인되지 않은 트랜잭션 결제를 수용할 때 가능합니다.
  • 핀니 공격(Finney attacks): 공격자는 네트워크에 즉각적으로 트랜잭션을 전송하지 않고 블록에서 이를 미리 채굴합니다. 동일 코인을 다른 트랜잭션에서 사용하는 대신, 그는 이전에 채굴한 블록만을 전송하며, 결제는 무효화됩니다. 핀니 공격을 위해서는 특정한 순서에 따라 사건이 발생해야 하며, 수신자가 승인되지 않은 트랜잭션을 수용해야 합니다.

이처럼 블록이 승인되기 까지 기다리는 것은, 판매자로 하여금 이중 지불의 희생자가 될 위험을 크게 줄여줄 것입니다.


마치며

이중 지불은 전자식 현금 시스템에서 경제적 이익을 얻기 위해 사용자가동일한 자금을 한 번 이상 사용하는 것입니다. 이제까지 이중 지불 문제에 적절한 해결책이 없어 전자식 현금 시스템 발전에 걸림돌이 되어 왔습니다.

그러나 다행히도 은닉 서명이 중앙화된 경제 체계에 흥미로운 해결책을 제시했습니다. 이어, 작업 증명 메커니즘과 블록체인 기술 개발로 탈중앙화된 돈의 형태인 비트코인이 탄생했으며, 이는 수천 개의 암호화폐 프로젝트에 영감을 주었습니다.