WebAuthnを最低限知っておこう
社内勉強会で出したものの和訳です。社内レポジトリの実験環境用コードとそれを参照した部分は割愛しています。
対象読者: モダンブラウザの認証用APIについて興味があるレベルの人
tl;dr; WebAuthn API は将来的に使われる可能性がある良いAPIですが、(2019年1月)現在のブラウザでは限定的にしか使えません。
用語
WebAuthn: サーバーからブラウザを通して認証器(Authenticator)と通信するための javascript API
Fido2: WebAuthn + CTAP2(新しいブラウザ-認証器間のプロトコル) + 暗号アルゴリズムのホワイトリスト + (オプショナル) 登録済認証器の検証機能
市場で'Fido2対応'と謳ってマーケティングしている商品はCTAP2に対応していて、認証器の検証に対応している。
現状の認証
1. ユーザ名とパスワードを入力する。 (What You Know; 当人しか知りえない事 をサーバーが確かめる)
2. ワンタイムパスワード(OTP)を認証機器やスマホの認証アプリで表示する、あるいは受け取る。
3. OTPを入力してログイン完了 (What You Have; 当人しか持ちえない物 を持っていたとサーバーが確かめる)
現状のWebAuthnを利用した認証
1. ユーザ名とパスワードを入力する。 (What You Know; 当人しか知りえない事 をサーバーが確かめる)
2. FIDO2対応の認証器で認証するよう促される。
3. 認証され、ログイン完了 (What You Have; 当人しか持ちえない物 を持っていたとサーバーが確かめる)
WebAuthnを利用した次世代の認証
1. FIDO2対応でかつユーザーが認証できる認証器で認証するように促される
2. 認証され、ログイン完了。
認証自体は認証機器に任され、それが不正なものではないかのみサーバーで確かめる。
(ただし、2019年1月時点でこれを可能なのはHELLOによる認証が有効なWindows10 Edgeのみ。)
上記現状と次世代の例の差異
(この節は社内レポジトリ内のコードを利用しているため大幅割愛。実例でAttest部分以外をサーバー側で可読なように出力するコード。)
どの程度の認証が行えるかは認証器によって様々であり、UVに対応した認証器であれば次世代の例として示した認証が可能。サーバー側で登録時にこのフラグを検証して確認しなければいけない。*1
UVの確認ができない場合はWhat You Have; 当人しか持ちえない物を持っていると確認する一要素として利用できる。*2 2020年現在、Yubikey5+Githubのような例ではこちらの利用方法。
サーバーとの通信路での改竄やなりすましに対する防御のため、認証はRelying Party、ブラウザでの実運用上はドメイン名と強く結びついている。認証用ドメインや複数ドメインで同一IDを利用するのは難しい。*3
*1: Web Authentication: An API for accessing Public Key Credentials Level 1
*2: 勉強会ではYubikey5で実際にUVフラグがないことをしめす。
*3: 不可能ではないが認証連携システムの構築が必要。