はじめに
FIDO認証の認証登録と認証の流れを整理する
前提
- 登場人物はフロントエンド(アプリ・InAppブラウザ)、BFF、バックエンド、認証サーバ
- 異常系は考えない
- Attestation(※1)は使用しない
※1 認証情報の証明で、セキュリティと信頼性を向上させるため使用される
FIDO認証の登録の流れ
フロントエンド(アプリ) | フロントエンド(InAppブラウザ) | BFF | バックエンド | 認証サーバ |
---|---|---|---|---|
1.InAppブラウザでFIDO認証をサポートするウェブサイトにアクセス(デバイス登録の開始) | ||||
2.BFFにデバイス登録のリクエスト送信(フロントエンドからのPOST①) | ||||
3.バックエンドにリクエスト送信(BFFからのPOST②) | ||||
4.認証サーバにリクエスト送信(バックエンドからのPOST③) | ||||
5.認証サーバがチャレンジコード(※1)を作成 | ||||
6.認証サーバからレスポンス(チャレンジコード)受信(POST③のレスポンス) | ||||
7.バックエンドからレスポンス(チャレンジコード)受信(POST②のレスポンス) | ||||
8.BFFからレスポンス(チャレンジコード)受信(POST①のレスポンス) | ||||
9.In-Appブラウザが受信したレスポンスを受取る | ||||
10.生体認証を実施 | ||||
11.公開鍵と秘密鍵のペアを作成 | ||||
12.秘密鍵を保存 | ||||
13.チャレンジコードを署名(秘密鍵で署名) | ||||
14.InAppブラウザに公開鍵と署名を渡す | ||||
15.BFFに公開鍵と署名を送信(フロントエンドからのPOST④) | ||||
16.バックエンドに公開鍵と署名を送信(BFFからのPOST⑤) | ||||
17.認証サーバに公開鍵と署名を送信(バックエンドからのPOST⑥) | ||||
18.署名を検証(公開鍵で署名を検証)しチャレンジコードを取得 | ||||
19.認証サーバからレスポンス(検証結果)受信(POST⑥のレスポンス) | ||||
20.バックエンドからレスポンス(検証結果)受信(POST⑤のレスポンス) | ||||
21.BFFからレスポンス(登録成否)受信(POST④のレスポンス) | ||||
22.処理を完了(デバイス登録の完了) |
※1 認証プロセスの一部として利用されるサーバーがユーザに対して送るランダムな文字列、チャレンジと表現することが多い
FIDO認証の流れ
フロントエンド | InAppブラウザ | BFF | バックエンド | 認証サーバ |
---|---|---|---|---|
1.InAppブラウザでFIDO認証をサポートするウェブサイトにアクセス(認証の開始) | ||||
2.BFFに認証リクエストを送信(フロントエンドからのPOST①) | ||||
3.バックエンドにリクエスト送信(BFFからのPOST②) | ||||
4.認証サーバにリクエスト送信(バックエンドからのPOST③) | ||||
5.チャレンジコードを作成 | ||||
6.認証サーバからレスポンス(チャレンジコード)受信(POST③のレスポンス) | ||||
7.バックエンドからレスポンス(チャレンジコード)受信(POST②のレスポンス) | ||||
8.BFFからレスポンス(チャレンジコード)受信(POST①のレスポンス) | ||||
9.In-Appブラウザが受信したレスポンスを受取る | ||||
10.生体認証を実施 | ||||
11.チャレンジコードを署名(秘密鍵で署名) | ||||
12.InAppブラウザに署名を渡す | ||||
13.BFFに署名を送信(フロントエンドからのPOST④) | ||||
14.バックエンドに署名を送信(BFFからのPOST⑤) | ||||
15.認証サーバに署名を送信(バックエンドからのPOST⑥) | ||||
16.認証サーバが署名を検証(公開鍵で署名を検証)しチャレンジコードを取得 | ||||
17.認証サーバからレスポンス(認証結果)受信(POST⑥のレスポンス) | ||||
18.バックエンドからレスポンス(認証結果)受信(POST⑤のレスポンス) | ||||
19.BFFからレスポンス(認証成否)受信(POST④のレスポンス) | ||||
20.認証を完了(認証の完了) |
認証登録と認証の違い
- 認証登録のみ、秘密鍵と公開鍵を生成
- 認証登録のみ、公開鍵を認証サーバに送信
まとめ
(実際に実装するのは難しいだろうが、)
整理すると公開鍵暗号方式にフロントエンドの認証(例では生体認証)が組み込まれているだけでそこまで複雑ではない