Web3를 통한 사용자 인증

안녕하세요, 저는 귀하가 Web3에 익숙하고 암호화, DeFi 또는 Web3 Project에 대해 이해하고 있다고 가정합니다.

Web3 기술을 사용한 새로운 사용자 인증 방법(실제로는 암호화의 힘을 사용함)을 소개하겠습니다.

DeFi 또는 Web3 프로젝트에 도달한 경우 플랫폼이 플랫폼에 로그인하도록 강요하지 않는다는 점을 알고 있어야 합니다. Web3에서는 개인 정보를 저장하지 않기 때문입니다. 우리는 귀하의 서명으로 귀하를 인식합니다(필기 서명이 아니라 Digital Signature ).

또한 Web3/Blockchain World에 참여하려면 Wallet을 설치해야 한다는 점을 알고 있어야 합니다. 이 지갑은 개인 키를 관리하는 데 사용되며 블록체인으로 전송될 거래에 서명하는 데 사용됩니다. (어쨌든 개인 키를 절대 공유하지 마십시오)

현재 "하이브리드"프로젝트가 있습니다. 이 프로젝트를 "하이브리드"라고 부르는 이유는 web3의 힘을 활용하지만 대부분의 기능이 web2이기 때문입니다.



약간 혼란스러울 것입니다. 약간의 맥락을 알려드리겠습니다. 따라서 Play to Earn 게임은 Web3 World에서 과대 광고를 받고 있습니다. Axie Infinite , Splinterlands , Sandbox 등과 같은 많은 게임이 있습니다. 그리고 내 현재 프로젝트는 Play to Earn 게임이며, 사용자는 NFT를 구매한 다음 NFT를 사용하여 플레이하고 보상을 받아야 합니다.

UX 팀에서 수행한 연구 결과, 대부분의 암호화폐 게임은 Wallet을 사용하여 많은 서명을 수행해야 하기 때문에 플레이어에게 약간 성가신 것으로 나타났으며, 이 블록체인에 제출하는 프로세스는 저렴하지 않습니다. Ethereum의 가스 가격은 미쳤습니다).

엔지니어 팀도 대부분의 게임 데이터(플레이어가 게임을 할 때 생성되는 데이터)가 블록체인에 기록될 필요가 없다고 생각합니다. 그래서 우리는 NoSQL 데이터베이스를 사용하여 게임 데이터를 저장하기로 결정했습니다. 그리고 UX 팀은 사용자가 게임에 온보딩하는 방법에 대해 묻습니다. 이메일/사용자 이름 및 암호를 사용하여 로그인해야 합니까? 음, 이메일과 비밀번호를 사용하여 로그인하는 것은 실제로 "Web3 사물"이 아닙니다.

우리는 그들의 개인 정보를 취하지 않고 플레이어를 식별하기를 원합니다. 그래서 우리는 블록체인의 본질적인 힘을 활용하기로 결정했습니다. 암호화 서명.



그래서 Ethers.js와 Metamask를 사용하여 EVM 블록체인 기반에서 사용자 인증을 하는 방법을 보여드리겠습니다. 백엔드에 대한 프레임워크를 선택할 수 있습니다.


백엔드에 대한 사용자 요청 Nonce



사용자는 사용자에 대한 정보를 검색하기 위해 백엔드로 요청을 보냅니다Nonce.

백엔드는 Nonce를 사용자에게 보냅니다.



사용자는 Nonce를 검색합니다. 사용자는 Nonce에 대한 정보가 포함된 메시지를 구성합니다. nonce가 100이라고 하면 메시지는 Hi I wanna play the Games | 100가 됩니다.

사용자 서명 메시지 및 지갑 서명 생성



사용자는 메시지에 서명해야 하며 ethers.js 라이브러리를 활용할 것입니다.

// This nonce come from Backend
const nonce = 100;

// Get User's Public Key
const [account]: string[] = await window.ethereum.request({
    method: 'eth_requestAccounts',
});
const publicKey = await ethers.utils.getAddress(account);

// Sign Message
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const message = `Hi I wanna play the Games | ${nonce}`;
const messageUtf8Bytes = ethers.utils.toUtf8Bytes(message);
const testBytes = ethers.utils.arrayify(messageUtf8Bytes);
const signature = await signer.signMessage(testBytes);
const accountSignature = {
    publicKey: publicKey,
    message: message,
    signature: signature,
};


사용자 제출 서명, 메시지 및 공개 키



메시지에 서명하면 사용자가 서명을 받습니다. 사용자는 백엔드에 서명, 메시지 및 공개 키를 제출해야 합니다.

서명 확인 및 검증



사용자는 서명, 메시지 및 공개 키를 받았습니다. 백엔드는 메시지의 Nonce를 확인합니다. 이 Nonce는 백엔드 데이터베이스에 기록된 Nonce와 일치해야 합니다. 서명을 확인하려면 백엔드가 ethers.js 라이브러리를 활용해야 합니다.

const checkValidSignature = (message, signature, pubKey) => {
  const messageUtf8Bytes = ethers.utils.toUtf8Bytes(message);
  const arrayifyMessage = ethers.utils.arrayify(messageUtf8Bytes);
  const recoveredAddress = ethers.utils.verifyMessage(
    arrayifyMessage,
    signature
  );
  const publicKeyLowerCase = pubKey.toLowerCase();
  const recoveredAddressLowerCase = recoveredAddress.toLowerCase();
  if (publicKeyLowerCase === recoveredAddressLowerCase) {
    return true;
  }
  return false;
};


인증 토큰 보내기



서명이 유효하고 사용자가 올바른 nonce를 보내면 백엔드는 사용자에게 인증 토큰을 제공합니다. 이 토큰은 사용자가 게임을 할 때 자신을 인증하는 데 사용됩니다.

따라서 당사는 사용자에 대한 개인 정보를 저장하지 않습니다. 백엔드에는 사용자의 사용자 이름과 비밀번호를 저장할 사용자 테이블이 없습니다.

이는 하이브리드 앱을 빌드할 때 적용할 수 있는 적절한 방법입니다. 개인 정보를 수집하지 않고도 여전히 사용자를 식별할 수 있습니다.

메모
위의 단계에서 표준EIP-191을 사용하여 메시지에 서명합니다. 더 복잡한 메시지에 서명해야 한다고 생각하는 경우 EIP-712을 사용할 수 있습니다.

좋은 웹페이지 즐겨찾기