트랜잭션& 지갑주소, 디지털 서명

0Xkong
DOKDO DAO
10 min readApr 14, 2022

--

0. 들어가며

블록체인은 거래내역에 해당하는 블록을 체인으로 이어 그 복사본을 참여자들이 각자 소유하는 방식으로 이루어집니다. 거래내역의 복사본을 모든 참여자가 갖고 있기 때문에 해커가 거래내역을 변조하는 것을 불가능에 가깝게 만드는 것이 핵심이 됩니다. 그리고, 이러한 블록체인의 특성은 흔히 ‘코인’이라 말하는 암호화폐가 필요로 하는 특성이기 때문에 코인을 만들기 위해서는 블록체인이 핵심이 됩니다.​

하지만, 우리는 코인을 사용하면서도 블록체인에 직접적으로 기여하고 있지않습니다. 우리가 코인의 기반이 되는 블록체인 기술의 이점을 누릴 때는 노드라고 하는 대리인을 통해서 블록체인을 이용합니다. 즉, 코인은 결국 돈이기에 우리는 다른 사람의 컴퓨터를 거쳐 돈의 거래를 하고 있다는 것을 알 수 있습니다. 만약 노드가 나를 사칭하면 어떻게 하지? 노드가 내 거래 내역을 조작하면 어떻게 하지? 해커가 나를 사칭하면 어떻게 하지? 내 개인정보가 노출되면 어떻게 하지? 언제나 중요한 일을 남에게 의탁할 때는 불안감이 함께 해왔습니다.

블록체인이라는 기술은 코인이라는 암호화폐를 실현하기 위해 만들어진 기술입니다. 그렇기에 기본적으로 견고한 보안을 가지고 있는 기술이지만, 코인이라는 중요한 요소를 다루기 위해서는 더욱 더 견고한 보안을 갖출 필요가 있습니다. 블록체인은 블록과 체인을 합친 말입니다. 그렇기 때문에 기본적으로 블록을 만들어서 전파하는 것이 블록체인의 기본이 됩니다. 이 글에서는 블록체인의 기본이 되는 블록을 생성/전파하는 과정에서 어떻게 보안이 유지되는지를 다루고자 합니다. 블록체인은 수 없이 많은 기술들로 인해 보안이 유지되지만, 이 글에서는 ‘트랜잭션’과 ‘지갑 주소’라는 키워드에 초점을 맞춰 코인을 거래할 때 사칭이 일어날 수 없는지를 최대한 쉽게 설명하고자 합니다.

1. 트랜잭션

Trans·ac·tion [ trænˈzækʃn ]

[영어ㆍ명사] 거래, 매매, 처리 (과정)

[정보ㆍ통신] 컴퓨터로 처리하는 작업의 단위

출처 : 네이버 사전

블록체인에서 블록이란, 한 번에 일어난 일을 적은 것입니다. 여기서 한 번에 일어난 일은, 보통 거래/송금/출금 등의 코인의 이동에 해당합니다. 이 때, 트랜잭션(transaction)한 번에 일어난 일을 말합니다. 예를 들어 귱이 3비트를 출금하고, 2비트를 입금했다면 출금을 한 번의 트랜잭션으로, 입금을 한 번의 트랜잭션으로 생각합니다. 이 때, 총 두 번의 트랜잭션이 일어난 것이 됩니다. 블록체인에서 블록은 한 번에 일어난 일, 트랜잭션을 블록체인에서 쓰기 쉬운 형태로 컴퓨터에 입력한 것입니다. 즉, 블록체인에서는 트랜잭션을 기본 단위로 삼아 블록을 만들어내고, 체인을 관리합니다.

이처럼, 블록체인에서 일어나는 모든 작업의 기본 단위는 트랜잭션입니다. 그렇기 때문에 블록체인에서 사칭을 하려면 트랜잭션을 실행한 사람의 지갑 주소가 자신의 지갑 주소라고 사칭해야합니다. 하지만 트랜잭션을 블록으로 만들 때 쓰는 특별한 기술로 인해 사칭을 하는 것은 거의 불가능에 가깝습니다. 이에 관해 이해하기 위해서는, 지갑 주소에 대해 더 자세히 알 필요가 있습니다.

2. 지갑 주소

​현실에서 은행 거래를 할 때, 우리는 계좌 번호와 계좌 비밀번호가 필요합니다. 마찬가지로 우리가 코인에서 거래를 할 때, 우리의 지갑 주소와 지갑 비밀번호가 필요합니다. 우리가 거래소나 메타마스크를 통하여 코인을 거래할 때, 비밀번호를 입력하고 로그인을 했던 기억이 있기 때문에 이를 지갑의 비밀번호라고 착각하기 쉽습니다. 하지만, 대부분의 사람들은 자신이 갖고 있는 코인 지갑의 진짜 비밀번호를 본 적도 없고, 존재하는지도 모르고 있습니다. 그 이유는 지갑을 만들 때 컴퓨터가 자동으로 코인 지갑의 비밀번호를 만든 뒤, 아무도 모르게 따로 저장하기 때문입니다.

코인 지갑의 비밀번호와 지갑 주소의 생성 과정

코인 지갑의 비밀번호는 우리가 일상 속에서 사용하는 비밀번호와는 다릅니다. 차이점을 코인 지갑의 비밀번호를 만드는 과정을 통해 살펴보자면 다음과 같습니다. 먼저, 코인 지갑을 만들 때 일단 컴퓨터가 랜덤하게 비밀번호를 하나 만든 뒤, ‘개인 키’라고 부릅니다. 그 후, 개인 키를 바탕으로 수학적인 계산을 통해 비밀번호를 한 개 더 만들어 ‘공개 키’라고 부른 뒤 공개 키를 모든 사람이 알 수 있게 공개합니다. 마지막으로 개인 키와 공개 키를 바탕으로 다시 수학적으로 계산하여 지갑 주소를 만들어냅니다. 이를 요약하면 다음과 같습니다.

· 코인 지갑 비밀번호는 두 개가 있으며, 코인 거래를 위해서는 개의 비밀번호가 필요함.

· 코인 지갑 비밀번호는 우리가 직접 만드는게 아니라, 컴퓨터가 랜덤하게 만들어 줌.

· 두 개의 비밀번호 중 하나는 모든 사람이 알 수 있게 공개함.

· 만들어진 비밀번호를 통해 지갑 주소를 만들어 냄.

위와 같이 코인 지갑에서는 이상한 방식으로 비밀번호를 관리하고 있습니다. 먼저, 보통 비밀번호는 나만이 알 수 있는 글자나 숫자들을 아무도 모르게 직접 정해놓는 것이지만, 코인 지갑의 비밀번호는 컴퓨터가 마음대로 두 개나 만들어주고 심지어 하나는 모두에게 공개하고 있습니다. 또한, 비밀번호를 만들 때 일단 하나를 만들고, 이를 수학적으로 계산해서 다른 하나를 만들어내고, 이를 다시 수학적으로 계산해서 지갑 주소를 만듭니다. 왜 굳이 이런 번거로운 과정을 거치는 것일까요? 이 질문에 대한 답을 찾기 위해서는 위의 생성과정을 다른 각도로 볼 필요가 있습니다.​

비밀번호 생성 과정을 다시 보자

위의 그림에서, 지갑 주인인 귱은 다음과 같은 사실을 알고 있습니다.

· 개인 키는 나만이 알 수 있다.

· 공개 키는 모두가 알 수 있다.

· 공개 키는 개인 키를 가지고 만들었으니, 내 컴퓨터는 개인 키와 공개 키의 수학적인 관계를 알고 있다.

즉, 지갑 주인만이 알고 있는 정보(개인 키)를 이용해 모두가 알고 있는 정보(공개 키)를 만들어낼 수 있습니다. 그리고, 만드는 방법을 알고 있으면 응용을 할 수도 있습니다. 개인 키로 공개 키를 만들었다는 것은, 같은 공개 키를 만드려면 같은 개인 키가 있어야 한다는 뜻입니다. 이처럼 개인 키를 갖고 있으면 공개 키를 만들 수 있으니 이를 응용할 수도 있습니다. 개인 키로만 만들 수 있고, 공개 키로만 해석할 수 있는 무언가를 만든다면 자신이 지갑을 갖고 있다는 것을 증명할 수 있을 것입니다.

지갑을 만들 때 첫 과정은 개인 키를 만드는 것이므로, 지갑의 개인 키를 갖고 있다는 것은 결국 그 지갑을 갖고 있다는 것과 같은 의미가 됩니다. 그렇기에 지갑의 개인 키로만 할 수 있는 일을 해낸다면, 그 지갑의 개인 키를 갖고 있으며 더 나아가 지갑을 갖고 있다는 것을 의미합니다. 이건 매우 어려운 개념이기에 좀 더 자세히, 다시 한 번 설명하고자 합니다.

3. 디지털 서명

문자의 예시

예를 들어 문자를 받으면 모두에게 알림을 보내주는 스마트폰이 있다고 생각해봅시다. 요즘 스마트폰은 지문으로 잠금을 풀 수 있기에, 내 스마트폰으로 문자를 보낼 수 있는 사람은 오직 나 자신뿐입니다. 하지만, 스마트폰의 전화번호는 누구나 알 수 있는 정보이고, 우리 모두 이 사실을 잘 알고 있습니다. 만약 귱의 스마트폰으로 알림을 보내주는 스마트폰에 문자를 보낼 때 귱의 전화번호 중간을 가리더라도, 알림을 받은 사람들은 문자를 보낸 사람이 귱이란 것을 알 수 있습니다. 뒷 번호가 5678로 끝나는 번호가 흔치 않은데, 알림을 보내는 스마트폰에 문자를 보낼 사람은 귱말고는 없기 때문입니다.

이 예시에서, 귱은 자신만이 갖고 있는 정보(지문)를 통해 모두가 알 수 있는 정보(전화번호)를 갖고 있는 사람들이 문자를 보낸 사람이 귱임을 알 수 있게 했습니다. 왜냐하면, 귱만이 갖고 있는 정보(지문)로만 귱의 스마트폰을 쓸 수 있기 때문에 귱의 지문(귱만이 갖고 있는 정보)을 쓸 수 있는 사람만이 보낸 사람이 010****5678인 문자를 보낼 수 있기 때문입니다. 또한 귱의 전화번호(모두가 알 수 있는 정보)를 알고 있는 사람만이 그 문자가 귱이 보낸 문자라는 것을 알 수 있습니다.

이처럼, 자신만이 갖고 있는 정보인 개인 키를 이용해 모두가 알 수 있는 정보인 공개 키로만 해석할 수 있는 정보를 만들어내 자신이 개인 키를, 더 나아가 지갑을 소유하고 있는 사람이라는 것을 증명하는 과정을 블록체인에서는 디지털 서명이라고 합니다. 실제 블록체인에서는 개인 키와 공개 키뿐만 아니라, 문자의 내용에 해당하는 트랜잭션의 내용도 포함하여 디지털 서명을 하게 됩니다.

디지털 서명의 예시

블록체인에서 거래 내용에 해당하는 트랜잭션을 블록으로 만들어 전파할 때, 개인 키와 트랜잭션의 내용을 바탕으로 디지털 서명을 합니다. 이 때 디지털 서명을 검증하기 위해 공개 키와 트랜잭션의 내용이 필요하도록 디지털 서명의 내용에 해당하는 암호문을 만듭니다. 좀 더 쉽게 말하자면, 귱만이 알고 있는 정보(개인 키)와 트랜잭션 내용을 통해, 모두가 알 수 있는 정보(공개 키)와 트랜잭션의 내용으로만 검증할 수 있는 암호문을 만들어 냅니다. 이를 통해 자신이 지갑을 소유하고 있다는 것을 증명할 수 있게 되고, 이것이 블록체인에서 디지털 서명이 이루어지는 기본적인 방식입니다.

‘만약 노드가 나를 사칭하면 어떻게 하지? 노드가 내 거래 내역을 조작하면 어떻게 하지? 해커가 나를 사칭하면 어떻게 하지? 내 개인정보가 노출되면 어떻게 하지?’

위에서 언급했던 사칭과 거래 내역 조작은 디지털 서명 때문에 어려워집니다. 애초부터 노드에 데이터를 보낼 때 트랜잭션과 서명을 첨부할 경우, 노드와 해커들은 다음과 같은 이유에서 사칭이나 거래 내역 조작을 할 수 없게 됩니다.

· 애초에 개인 키는 노드에 보낸 적이 없기에, 개인 키는 노출되지 않는다.

· 서명을 수정하려면, 개인 키를 알고 있어야하지만 알 수 없다.

· 트랜잭션(거래 내역)을 변조하려 해도, 디지털 서명은 개인 키와 트랜잭션 내용으로 만들어졌기에 달라진 트랜잭션 내용에는 효력을 잃는다.

· 트랜잭션을 변조하려면, 변조된 트랜잭션에 맞춰 디지털 서명을 다시 해야하나 개인 키가 없으면 할 수 없다.

​이처럼 지갑 비밀번호의 복잡한 구조를 통해 블록체인의 기본이 되는 트랜잭션은 보호되고 있으며, 해커들이 지갑을 해킹하는 것은 매우 어렵게 되었습니다.

4. Conclusion

출처 : JTBC

위에서 살펴봤듯, 코인 지갑에 사용된 기술에 의해 블록에 담기는 거래 내용에 해당하는 트랜잭션은 사칭될 수도, 변조될 수도 없습니다. 하지만 뉴스를 보다보면 코인 지갑이 ‘털렸다’라는 말을 종종 들을 수 있습니다. 이는 디지털 서명에는 허점이 있기 때문입니다. 디지털 서명은 기본적으로 개인 키는 지갑 주인만이 알고 있는 정보라는 것을 전제조건으로 삼고 있습니다. 즉, 개인 키가 노출되면 해커뿐만 아니라 일반인도 그 지갑의 소유권을 뺏을 수 있게 됩니다. 그렇기 때문에 개인 키가 저장되어있는 컴퓨터나 스마트폰이 통째로 해킹될 경우, 코인 지갑이 덩달아서 해킹당하게 됩니다.

이 글에서는 블록체인에 새로운 블록을 만드는 과정에서 보안을 어떻게 유지하는 지에 대해 트랜잭션과 지갑 주소라는 관점에서 살펴보았습니다. 블록체인은 블록+체인이라는 말이 합쳐졌듯이, 블록을 만드는 것에 있어서 디지털 서명이라는 개념이 있다면 체인을 관리하는 것에 있어서 이와 대응되는 기술이 있을 것입니다. 이와 관련된 내용은 또 다른 글에서 다루고자 합니다.

같이 읽어보기 : 실제로 디지털 서명을 만드는 알고리즘, ECDSA — https://learnmeabitcoin.com/technical/ecdsa

--

--