더 이상 JWT가 필요하지 않습니다

Ethereum 로그인이 곧 사용자 표준이 되고 암호가 더 이상 필요하지 않다는 것은 비밀이 아닙니다. 그럼에도 불구하고 dApp 개발은 아직 초기 단계이며 개발에 대한 많은 표준이 아직 설정되어 있습니다.

이제 모든 개발자는 본능적으로 인증에 동일한 JWT를 사용하여 오래된 관행으로 dApp을 계속 작성합니다. 저는 약간 다른 접근법을 제안합니다.

저는 JWT를 사용하여 dApp 개발을 시작했습니다. 첫 번째 프로젝트부터 인증은 항상 까다로워지고 그 과정에서 뭔가 중복되는 부분이 있을 것이라고 느꼈습니다. 몇 가지 프로젝트 후에 JWT 자체가 중복된다는 것을 깨달았습니다. 이유를 설명하겠습니다.



이 다이어그램은 처음 몇 개의 프로젝트에서 인증을 수행한 방법을 보여줍니다. 여기에서 체계는 JWT를 사용하는 표준 절차를 거의 전적으로 반복합니다. 유일한 것은 로그인 및 암호 대신 사용자가 서명을 보내는 것입니다.

JWT를 가져와야 하는 이유는 무엇입니까? 결국, 그것 없이도 서명에서 주소를 가져와 사용자를 안정적으로 식별할 수 있습니다.

단순화하는 방법은 다음과 같습니다.


사용자는 여전히 서명을 생성하지만 이미 내부에 만료 날짜가 있으므로 공격자가 서명을 얻으면 오랫동안 유용하지 않습니다(JWT와 동일). 또한 서명은 표준 Authorization 헤더에 배치되고 사용자 주소를 가져와 데이터베이스에서 사용자를 찾아 서버에서 처리됩니다. 그게 다야. 그리고 서버에서 JWT에 대한 암호화 키를 지속적으로 업데이트할 필요가 없으므로 일반적으로 많은 책임이 서버에서 떨어집니다.

이 흐름을 더욱 단순화하기 위해 web3-token 모듈을 만들었습니다. 설치하려면 다음 명령을 사용하십시오.
$ npm i web3-token
이 모듈은 서버와 클라이언트 모두에서 사용할 수 있습니다.
클라이언트 측부터 시작하여 예를 살펴보겠습니다.

import Web3Token from 'web3-token';

// Connection to MetaMask wallet (you can actually use any wallet)
// you can even use ethersjs instead of web3
const web3 = new Web3(ethereum);
await ethereum.enable();

// getting address from which we will sign message
const address = (await web3.eth.getAccounts())[0];

// generating a token with 1 day of expiration time
const token = await Web3Token.sign(msg => web3.eth.personal.sign(msg, address), '1d');

// attaching token to axios authorization header
axios.post('/registration', { name: 'Adam' }, {
  headers: {
    'Authorization': token,
  }
})

// checking how it finds me in backend's database
axios.get('/me', {
  headers: {
    'Authorization': token,
  }
})


.sign 메소드를 호출한 후, 이와 유사한 것을 볼 수 있습니다(MetaMask를 사용하는 경우).



보시다시피 메시지는 사용자가 서명한 내용을 확인해야 하므로 사용자에게 완전히 투명합니다. 그래서 가독성을 높이기 위해 JSON 구조를 사용하는 대신 HTTP 헤더와 동일한 구조를 사용하기로 했습니다.

메시지 본문에는 토큰 버전과 만료 날짜 자체가 표시됩니다.

다음으로 백엔드(Node.js)가 이 토큰으로 수행하는 작업은 다음과 같습니다.

const Web3Token = require('web3-token');

// getting a token from authorization header
const token = req.headers['Authorization']

const { address, body } = await Web3Token.verify(token);

// now you can find that user by his address 
// tip: better to do it case insensitive
req.user = await User.findOne({ address });


매우 간단하고 단 한 줄이며 모듈이 모든 암호화를 대신합니다. 우리는 마술처럼 서명에서 사용자의 주소를 얻고 이 주소를 사용하여 데이터베이스에서 찾습니다. 그런 다음 예를 들어 이 사용자에게 주소로 NFT를 부여할 수 있습니다.

그 결과 하이브리드 dApp에 이상적인 매우 편리한 상태 비저장 사용자 인증 방법이 탄생했습니다. 유일한 단점은 Postman에서 테스트하기 어렵다는 것입니다 😀

나는 이것에서 표준과 같은 것이 나왔으면 좋겠지만 그때까지는 비판(또는 가능한 질문/제안)에 열려 있습니다.

Web3가 모퉁이를 돌면 있습니다.

좋은 웹페이지 즐겨찾기