メタマスクのEIP-4361サポートによってサインインがよりわかりやすくなった。
先日メタマスクがEIP-4361をサポートしました。
今回のサポートによってUI/UXがよりユーザフレンドリーになりかつ安全にサインインできるようになりました。
具体的に変更される点は2つです。
- EIP-4361で定義されたフォーマットに署名する際に「署名」という文字が「サインイン」に変更されました。
- 開いているオリジンとは異なるドメインにサインインする際に警告を表示するようになりました。
※以下Sign-In with EthereumをSIWEと略します。
1. EIP-4361で定義されたフォーマットに署名する際に「署名」という文字が「サインイン」に変更されました。
以前までは、EIP-4361で定義されたフォーマットに署名する際に「署名」という文字が出ていましたが、今回の追加によってメタマスク自体がEIP-4361で定義されたデータに署名する際にUI上でサインインと表示できるようになりました。
署名フォーマット
今回追加されたサインインのフォーマット
今回の追加によってユーザがアプリ側からサインインの要求の際によりわかりやすく確認できるようになっています。
補足
Sign-In with Ethereum library 自体は前から存在していたのですが、Sign In With Ethereumを使ってメタマスクからメッセージを署名する際にサインインとわかりやすく表示されるようになりました。これによってユーザは署名とサインインを区別することができ、よりユーザフレンドリーになりました。
2. 開いているオリジンとは異なるドメインにサインインする際に警告を表示するようになりました。
SIWEに渡すパラメータの一つにdomainがあり、これが今自分が開いているサイトのオリジンと異なる場合は警告を出すようになりました。これによりユーザはフィッシングサイト攻撃の危険に晒されているか判断できるようになりました。
例えばuniswap https://app.uniswap.org/#/swap のドメインに似せた偽のサイト https://app.uniswap.co/#/swap を作成する。偽のサイトでユーザにサインインさせる時にSIWEのdomainをapp.uniswap.orgにしていた場合はオリジンと異なるため警告が出ます。
テストはこちらのE2E Test Dappからできる。セクションSign In With Ethereumにある「SIGN IN WITH ETHEREUM(BAD DOMAIN)」ボタンを押すと実際に今回の変更を試すことができます。自分が開いているサイトのオリジンである https://metamask.github.io/ とSIWEのフォーマットで定義されたdomainが異なるためwarningが出るのを確認できます。この場合の異なるドメインは metamask.badactor.io となっており明らかにオリジンと異なります。
具体的なソースコードはこちら
SIWEのメッセージをパースして取得したdomainとオリジンのhostを比較しています。
補足
Web2の多くのサービスが認証の際にGoogleやTwitterのような従来の中央集権型のIPプロバイダーを利用してきましたが、イーサリアムとSIWEを使えば中央集権企業にコントロールされない自己管理型のIDを使ってサービスにログインすることができます。
またSIWEを利用することでアプリ側も実際に接続しているアカウントのアドレスの正しさを担保することができます。ユーザ側だけでなく、アプリ側も接続しているアカウントの正当性を確かめたい場合が多々あります。ログイン機能はほとんどのWeb2サービスに実装されていますが、実際に作ってみると実装が難しい機能です。最近はAuth0のような認証系Sassサービスも登場し簡単にはなってきましたがそれでも難しい問題を色々含んでいます。
ただSIWEによるイーサリアムウォレットのログインであればセキュリティを保ったままユーザも簡単にログインでき、開発者も簡単にログインを実装することができます。一般ユーザのメタマスクの導入は少しハードルが高いですがメタマスクさえインストールしていれば多くのWeb3サービスでもログインできるようになります。
ウォレットはユーザの資産に直結するため極力守られる必要があります。まだメタマスクを始めクリプトウォレットは難しすぎると思います。今回のようなクリプトウォレットを代表するメタマスクがEIP-4631を追加したのはウォレットにとってとても良いことだと思います。今回の動きによって他のクリプトウォレットもEIP-4631を追加しSIWEによるサインインのUI/UXをユーザによりわかりやすくすることが標準になっていくかもしれません。
実際にSIWEを実装する場合はこちらのサンプルを利用するとわかりやすいです。
Discussion