メインコンテンツまでスキップ

クロスデバイス認証


概要

クロスデバイス認証は、あるデバイス(例: PC)で認証を行う際に、別のデバイス(例: スマートフォン)の認証器を使用する仕組みです。

このドキュメントで学べること:

  • クロスデバイス認証の必要性とユースケース
  • Hybrid Transport (caBLE) の仕組み
  • Passkey の同期機構
  • RP 側の実装考慮事項
  • トラブルシューティング

クロスデバイス認証とは

なぜクロスデバイス認証が必要か

┌─────────────────────────────────────────────────────────────────────────────┐
│ クロスデバイス認証の必要性 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【課題】 │
│ FIDO2 クレデンシャルは通常、登録したデバイスでのみ使用可能 │
│ │
│ 例: スマートフォンで登録した Passkey は、そのスマートフォンでしか使えない │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ ユーザーの困りごと │ │
│ │ │ │
│ │ 「スマホで Passkey を登録したけど、PC からログインしたい」 │ │
│ │ 「会社の PC には認証器がないけど、スマホならある」 │ │
│ │ 「友人の PC を借りて一時的にログインしたい」 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ 【解決策】 │
│ 1. Hybrid Transport (caBLE): 別デバイスの認証器をリモートで使用 │
│ 2. Passkey 同期: クラウド経由で複数デバイスにクレデンシャルを同期 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

ユースケース

シナリオ解決方法
PC でログイン、認証器はスマホHybrid TransportPC に QR コード表示、スマホでスキャン
複数デバイスで同じ Passkey を使用Passkey 同期iCloud Keychain で Mac/iPhone 間で同期
共有 PC からの一時的なログインHybrid Transport公共 PC からスマホで認証
新しいデバイスへの移行Passkey 同期新しい iPhone に Passkey を復元

Hybrid Transport (caBLE)

概要

Hybrid Transport は、WebAuthn Level 2 で追加された transport タイプで、caBLE (cloud-assisted BLE) とも呼ばれます。

┌─────────────────────────────────────────────────────────────────────────────┐
│ Hybrid Transport の仕組み │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【構成要素】 │
│ - クライアントデバイス: 認証を行いたいデバイス(例: PC) │
│ - 認証器デバイス: Passkey を持つデバイス(例: スマートフォン) │
│ - クラウドリレー: 2つのデバイスを接続するサーバー(Google/Apple 提供) │
│ │
│ 【通信経路】 │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ PC │◄────────►│ クラウド │◄────────►│ スマートフォン│ │
│ │ (ブラウザ) │ HTTPS │ リレー │ HTTPS │ (認証器) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ ▲ │
│ │ BLE (近接確認) │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ 【特徴】 │
│ - BLE で近接性を確認(フィッシング対策) │
│ - 実際のデータはインターネット経由(BLE の帯域制限を回避) │
│ - E2E 暗号化(クラウドリレーは中身を見れない) │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

QR コード認証のフロー

┌─────────────────────────────────────────────────────────────────────────────┐
│ QR コード認証フロー │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ PC (クライアント) スマートフォン (認証器) │
│ │ │ │
│ │ 1. RP が認証を開始 │ │
│ │ navigator.credentials.get() │
│ │ │ │
│ │ 2. ブラウザが QR コードを表示 │
│ │ ┌─────────────────────┐ │ │
│ │ │ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ │ │ │
│ │ │ █ █ █ █ │ │ │
│ │ │ ▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀ │ │ │
│ │ │ FIDO://... │ │ │
│ │ └─────────────────────┘ │ │
│ │ │ │
│ │ 3. スマホでスキャン ◄───────┤ │
│ │ │ │
│ │ 4. BLE でペアリング情報交換 │ │
│ │◄─────────────────────────────►│ │
│ │ │ │
│ │ 5. クラウドリレー経由で接続 │ │
│ │◄═══════════════════════════════►│ │
│ │ (E2E 暗号化) │ │
│ │ │ │
│ │ 6. スマホで生体認証 │ │
│ │ │ ┌─────────────────┐ │
│ │ │ │ Touch ID で │ │
│ │ │ │ 認証しますか? │ │
│ │ │ └─────────────────┘ │
│ │ │ │
│ │ 7. 署名を返送 │ │
│ │◄═════════════════════════════│ │
│ │ │ │
│ │ 8. RP に署名を送信 │ │
│ │ │ │
│ ▼ ▼ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

QR コードに含まれる情報

FIDO://{base64url encoded data}

デコード後:
{
"pk": <公開鍵>, // ECDH 用の一時的な公開鍵
"t": <tunnel server>, // クラウドリレーのアドレス
"r": <request id>, // リクエスト識別子
...
}

BLE の役割

┌─────────────────────────────────────────────────────────────────────────────┐
│ BLE による近接性確認 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【なぜ BLE が必要か】 │
│ │
│ QR コードだけでは、リモートの攻撃者がスクリーンショットを取得して │
│ 悪用する可能性がある(フィッシング攻撃) │
│ │
│ BLE を使うことで「2つのデバイスが物理的に近くにある」ことを確認 │
│ │
│ 【BLE で交換する情報】 │
│ - ペアリング情報 │
│ - ノンス(リプレイ攻撃防止) │
│ - 接続確認 │
│ │
│ 【BLE の範囲】 │
│ - 通常 10m 程度 │
│ - 攻撃者が物理的に近くにいない限り、リモート攻撃は困難 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

Passkey の同期

プラットフォーム別の同期機構

┌─────────────────────────────────────────────────────────────────────────────┐
│ Passkey 同期プラットフォーム │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【Apple - iCloud Keychain】 │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 同期範囲: 同じ Apple ID でサインインした Apple デバイス間 │ │
│ │ 対象: iPhone, iPad, Mac │ │
│ │ 暗号化: E2E 暗号化(Apple もアクセス不可) │ │
│ │ 要件: 2ファクタ認証が有効な Apple ID │ │
│ │ 注意: Windows/Android には同期されない │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ 【Google - Google Password Manager】 │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 同期範囲: 同じ Google アカウントでサインインしたデバイス間 │ │
│ │ 対象: Android, Chrome (Windows/Mac/Linux) │ │
│ │ 暗号化: E2E 暗号化 │ │
│ │ 要件: 画面ロック設定済みの Android、または Chrome プロファイル │ │
│ │ 注意: iOS の Chrome では同期されない(Apple の制限) │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ 【Microsoft - Windows Hello】 │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 同期範囲: 限定的(Windows デバイス間) │ │
│ │ 対象: Windows 10/11 │ │
│ │ 状況: Passkey 同期は段階的に導入中 │ │
│ │ 注意: 現時点では他プラットフォームとの同期なし │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ 【サードパーティ - パスワードマネージャー】 │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 1Password, Dashlane, Bitwarden 等 │ │
│ │ 同期範囲: 全プラットフォーム(クロスプラットフォーム) │ │
│ │ メリット: プラットフォームに縛られない │ │
│ │ デメリット: 追加のソフトウェアが必要 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

同期の仕組み

┌─────────────────────────────────────────────────────────────────────────────┐
│ Passkey 同期の仕組み(iCloud Keychain の例) │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ iPhone │ │ Mac │ │
│ │ │ │ │ │
│ │ ┌─────────┐ │ ┌────────────────────┐ │ ┌─────────┐ │ │
│ │ │ Passkey │ │ │ iCloud Keychain │ │ │ Passkey │ │ │
│ │ │ (秘密鍵)│ │◄────►│ │◄─────►│ │ (秘密鍵)│ │ │
│ │ └─────────┘ │ │ E2E 暗号化で保存 │ │ └─────────┘ │ │
│ │ │ │ (Apple も復号不可) │ │ │ │
│ └─────────────┘ └────────────────────┘ └─────────────┘ │
│ │
│ 【同期プロセス】 │
│ 1. iPhone で Passkey を登録 │
│ 2. 秘密鍵がデバイスの Secure Enclave で生成 │
│ 3. デバイス固有の鍵で暗号化 │
│ 4. 暗号化されたデータを iCloud にアップロード │
│ 5. Mac が暗号化データをダウンロード │
│ 6. Mac のデバイス鍵で復号、Secure Enclave に格納 │
│ │
│ 【セキュリティ特性】 │
│ - 秘密鍵は常に暗号化された状態でクラウドに保存 │
│ - Apple を含む第三者は秘密鍵にアクセス不可 │
│ - デバイスの生体認証/パスコードで保護 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

同期 vs 非同期 Passkey

項目同期 Passkey非同期 Passkey (Device-bound)
保存場所クラウド + 複数デバイス単一デバイスのみ
利便性高い(複数デバイスで使用可)低い(登録デバイスのみ)
セキュリティクラウドに依存デバイスのハードウェアに依存
リカバリークラウドから復元可能復元不可(紛失時は再登録)
用途一般消費者向け高セキュリティ環境
iCloud Keychain, GoogleYubiKey, Windows Hello (TPM)

RP 側の実装考慮事項

transports の指定

// 認証リクエスト時の allowCredentials
const options = {
publicKey: {
challenge: challenge,
allowCredentials: [
{
id: credentialId,
type: "public-key",
transports: ["internal", "hybrid"] // ← hybrid を含める
}
],
// ...
}
};

transport の種類

transport説明用途
internalプラットフォーム認証器Touch ID, Face ID, Windows Hello
usbUSB 接続YubiKey (USB)
nfcNFC 接続YubiKey (NFC), スマホ
bleBluetooth 接続旧式の Bluetooth 認証器
hybridクロスデバイス認証QR コード + caBLE

allowCredentials の設計

┌─────────────────────────────────────────────────────────────────────────────┐
│ allowCredentials の設計パターン │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【パターン 1: transports を保存・指定】 │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 登録時に認証器が返した transports を DB に保存 │ │
│ │ 認証時に保存した transports を指定 │ │
│ │ │ │
│ │ メリット: 正確な transport を指定できる │ │
│ │ デメリット: 古いクレデンシャルは transports がない可能性 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ 【パターン 2: transports を省略】 │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ allowCredentials で transports を指定しない │ │
│ │ │ │
│ │ メリット: ブラウザが自動的に適切な transport を選択 │ │
│ │ デメリット: 不要な選択肢が表示される可能性 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ 【パターン 3: 全 transport を指定】 │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ transports: ["internal", "usb", "nfc", "ble", "hybrid"] │ │
│ │ │ │
│ │ メリット: 全ての認証方法を許可 │ │
│ │ デメリット: パターン 2 と同等 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ 【推奨】 │
│ - 登録時に transports を保存 │
│ - 認証時に保存した transports + "hybrid" を指定 │
│ - hybrid を追加することで、クロスデバイス認証を常に許可 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

ユーザー体験の最適化

シナリオ推奨 UX
同じデバイスに Passkey がある即座に生体認証を表示
別デバイスの Passkey のみQR コードを表示、スキャン方法を案内
複数の認証オプションユーザーに選択させる(Passkey / QR / セキュリティキー)

セキュリティ考慮事項

フィッシング耐性

┌─────────────────────────────────────────────────────────────────────────────┐
│ Hybrid Transport のフィッシング耐性 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【保護メカニズム】 │
│ │
│ 1. BLE による近接性確認 │
│ - 攻撃者が物理的に近くにいない限り、認証は成功しない │
│ - リモートからの QR コード窃取攻撃を防止 │
│ │
│ 2. Origin バインディング │
│ - 署名対象に RP の origin が含まれる │
│ - フィッシングサイトの origin では署名が無効 │
│ │
│ 3. E2E 暗号化 │
│ - クラウドリレーは通信内容を見れない │
│ - 中間者攻撃を防止 │
│ │
│ 【残存リスク】 │
│ - 攻撃者が物理的に近くにいる場合(ソーシャルエンジニアリング) │
│ - ユーザーが不正なサイトで認証を承認してしまう場合 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

同期 Passkey のリスク

リスク説明緩和策
クラウドアカウント侵害Apple ID/Google アカウントが侵害されると Passkey も危険2FA 必須、セキュリティキーでの保護
デバイス紛失ロック解除されたデバイスからアクセス可能強力なパスコード、リモートワイプ
同期範囲の広がり意図しないデバイスに同期される可能性同期設定の定期的な確認

高セキュリティ環境での考慮

┌─────────────────────────────────────────────────────────────────────────────┐
│ 高セキュリティ環境での推奨事項 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【同期 Passkey を許可しない場合】 │
│ - Attestation で authenticatorAttachment: "cross-platform" を要求 │
│ - ハードウェアセキュリティキー(YubiKey 等)のみを許可 │
│ - AAGUID で許可する認証器を限定 │
│ │
│ 【同期 Passkey を許可する場合】 │
│ - 追加の認証要素を要求(SMS, メール等) │
│ - 重要な操作時に再認証を要求 │
│ - 登録済みデバイス一覧をユーザーに表示 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

トラブルシューティング

QR コードが表示されない

原因対処法
ブラウザが Hybrid 非対応Chrome, Safari, Edge の最新版を使用
OS が古いmacOS 13+, Windows 11+ を使用
Bluetooth が無効Bluetooth を有効化
セキュリティソフトがブロック例外設定を追加

接続がタイムアウトする

原因対処法
Bluetooth が不安定デバイスを近づける、他の BLE 機器を離す
ネットワークの問題両デバイスがインターネットに接続されているか確認
クラウドリレーの障害時間をおいて再試行

Passkey が同期されない

プラットフォーム確認事項
AppleiCloud Keychain が有効か、2FA が有効か、同じ Apple ID か
GoogleGoogle Password Manager が有効か、Chrome にサインインしているか
Windows最新の Windows Update が適用されているか

参考リンク