メインコンテンツへスキップ
Change page

イーサリアムでの認証

従来のWeb開発の経験がある場合、ユーザー名とパスワードによるログイン、OAuthフロー、セッションCookieなどに慣れていることでしょう。イーサリアムでの認証はこれらとは異なり、多くの点でよりシンプルに機能します。

イーサリアムでは、ユーザーはウォレットでメッセージに署名することで身元を証明します。保存すべきパスワードはありません。漏洩する可能性のある認証情報のデータベースもありません。あるのは暗号技術だけです。

Web2との違い

Web2イーサリアム
ユーザー名 + パスワードウォレットアドレス + 署名
サーバーが認証情報を保存ユーザーが秘密鍵を保持
Cookie / JWTでセッションを管理オフチェーンのウォレット署名でセッションを開始
「Googleでサインイン」「イーサリアムでサインイン」
パスワードリセットのフローシード・フレーズによる復元

根本的な変化は次のとおりです。Web2では、中央集権型のサーバーがユーザーを認証します。イーサリアムでは、特定のアドレスを管理していることを証明することで自分自身を認証し、誰でもそれを独立して検証できます。

前提条件

以下の内容を理解しておいてください。

ウォレットベースの認証の仕組み

基本的なフローはシンプルです。

  1. 分散型アプリケーション (dapp) がユーザーにウォレットの接続を要求する (メタマスク、Rainbow、WalletConnectなどを経由)
  2. ウォレットがユーザーのイーサリアムアドレスを共有する - これが公開識別子となります
  3. dappが一意のメッセージを生成する (ナンスまたはチャレンジ)
  4. ユーザーが秘密鍵でメッセージに署名する (ウォレット内で実行されます)
  5. バックエンドが、提示されたアドレスに対して署名を検証する
  6. 有効な場合、ユーザーが認証される

パスワードが入力されたり、保存されたり、送信されたりすることは一切ありません。

イーサリアムでサインイン (EIP-4361)

EIP-4361 (新しいタブで開く)は、イーサリアムでのサインインのための標準メッセージフォーマットを定義しており、一般的にSIWE (Sign-In with Ethereum) と呼ばれます。これにより、アドホックなメッセージ署名が、構造化された安全な標準に置き換えられます。

SIWEメッセージは次のようになります。

SIWEの主な特徴:

  • ドメインバインディング - メッセージにドメインが含まれており、フィッシングを防ぎます
  • チェーンID - 署名が有効なネットワークを指定します
  • ナンス - リプレイ攻撃を防ぎます
  • 有効期限 - 有効期間を制限するオプションのタイムスタンプです
  • リソース - スコープ付きアクセスのためのオプションのURIです

SIWEライブラリ

例: siweを使用したクライアントサイドのサインイン

例: サーバーサイドの検証 (Node.js)

ウォレット接続ライブラリ

認証の前に、ユーザーにウォレットを接続してもらう必要があります。以下のライブラリを使用すると簡単に実装できます。

手動での署名検証

SIWEを使用しない場合は、署名を直接検証することもできます。

セキュリティに関する重要な注意事項

  • 常にナンスを使用する - 古い署名が再利用されるリプレイ攻撃を防ぎます
  • ドメインを含める - 署名が異なるサイト間で有効になるのを防ぎます
  • 有効期限を確認する - 署名には制限された有効期間を設ける必要があります
  • 可能な限りSIWE (EIP-4361) を使用する - 上記のすべてを自動的に処理してくれます
  • 秘密鍵を絶対に公開しない - 署名はウォレット内で行われ、アプリは結果のみを受け取ります

セッション管理

認証後も、Web2と同様にセッションが必要です。一般的なパターンは次のとおりです。

  • JWTトークン - 署名を検証した後にJWTを発行し、APIリクエストに使用します
  • サーバーサイドセッション - 検証済みのアドレスをセッションCookieに保存します
  • リソース付きSIWE - 特定のURIにリンクされたスコープ付きアクセストークンを定義します

Web2との主な違いは、ユーザーのイーサリアムアドレスが永続的なアイデンティティになる点です。新しいアカウントを作成することなく、どのdappでも同じアドレスを使用できます。

分散型アイデンティティ

イーサリアムの認証は、自己主権型アイデンティティに向けたより広範な動きの一部です。この分野の標準やプロジェクトには以下が含まれます。

参考文献