🏥

当人認証、身元確認、クレデンシャル設定を組み合わせた "詰みにくい" ログイン機能の設計

2024/12/23に公開

ritou です。

もう23日ですが、Digital Identity技術勉強会 #iddance Advent Calendar 2024 10日目の記事です。
https://qiita.com/advent-calendar/2024/iddance

最近パスキー関連の記事などを書いている中、いわゆるログイン機能について様々な捉え方があることを改めて感じています。

ユーザー目線ではなかなか難しいことはありつつも、開発者目線でログイン機能を設計する際には共通認識を持つことが重要です。今回はアカウントリカバリー付きのログインフローを設計する際の考え方を整理してみます。

キーワード

この説明におけるキーワードとなる処理は次の3つです。

  • 当人認証: いわゆる認証処理。サービス登録済みのユーザーを識別し、検証する。
    • パスワード認証、パスキー認証、メール/SMS OTP、TOTPなど個々の認証方式で実現できる部分。ソーシャルログインも同様。
  • 身元確認: ユーザーが主張した属性情報の検証。
    • メールアドレス、SMS番号を所持していることの確認、身分証を用いた本人確認など。
  • クレデンシャルのリセット、再設定: 当人認証が不可能な状態から可能な状態に戻す処理

それぞれの役割をシンプルに保ちつつ、組み合わせによってユーザーがログインできない事態を避けようという考えです。

設計案

まずはシンプルに、当人認証のみが存在する状態を見てみましょう。
メールアドレスとパスワードの入力フォームのみがあるようなケースです。

当然ながら、どちらかの値を忘れた瞬間、ログインできなくなります。

では、複数の当人認証を用意するのはどうでしょうか。

どちらか一方の当人認証が利用できなくても、もう一方が利用できればログインできます。
ログイン成功後、利用できなくなった当人認証のクレデンシャルを設定することで再び複数の当人認証を利用できます。

もちろん、全ての当人認証が利用できない状態になったら終わりです。

(リカバリーコードという言い方なので少し混乱しますが)Githubの2FAはこのように複数の当人認証を用意するアプローチと言えそうです。

そもそも、ユーザーに複数の認証方式を設定させるのは大きな負担となりますし、利用できる当人認証の選択肢を増やすことが必ずしもユーザーにとって嬉しいものでもないでしょう。(ソーシャルログイン=ID連携を適切に利用することでこの辺りをスムーズにできたりもするのですが一旦置いておきます。)

そこで必要となるのが、アカウントリカバリーの仕組みです。

当人認証のリカバリーというと「ユーザー視点で個々の認証方式が使えない状態から使える状態に戻す」というのをイメージされる方がいるかもしれません。パスワードを思い出したり、リカバリーコードが見つかったり、TOTPの設定が復活みたいな感じですが、ユーザー側の状態復旧というのは当人認証の方式毎の特徴まで意識して考えていく必要があります。

これをシンプルに考えるために「サービス視点でユーザーがその当人認証を再度利用できるようにする」という考えが良いのではないかと思います。(少し恣意的に)視点の違いによる復旧の内容を整理してみました。

当人認証の方式 ユーザー視点のリカバリー サービス視点のリカバリー
パスワード認証 パスワードを思い出す パスワードを再設定
メール/SMS OTP 対象のメールアドレス、SMS番号を再び利用する 別のメールアドレス、SMS番号を登録
パスキー 対象パスキーにアクセス可能な端末を再び利用する 別のパスキーを登録

もちろん認証方式毎にどうなったら利用できなくなるのか、どの頻度で発生するのかなどは気にする必要がありますが、今回はどうしたらそれを回避できるかといった部分にフォーカスしています。

「リカバリーが難しい」という意見の中でこのユーザー視点の話が含まれているケースもありそうです。

https://inabajunmr.hatenablog.com/entry/2024/12/20/021231

そして、サービス視点のリカバリーで必要となる処理が次の2つです。

  • 身元確認: ユーザー自身がリカバリーを要求していることを確認
  • クレデンシャルのリセット、再設定
    • 再設定: 新しいパスワードを設定
    • リセット: パスキーや2FAの設定をリセット、次回利用時に再度設定が可能になる

よくある実装として、ユーザーによるセルフリカバリーとCS問い合わせによるリセット処理です。

パスワード認証のリカバリーの時に引き合いに出されるメールリンクからのパスワード再設定は

  1. リカバリーを要求するユーザーはメールアドレスを入力、送信されたURLにアクセスできることを持ってそのユーザーであるとみなす = 身元確認
  2. 新しいパスワードを設定: クレデンシャルの再設定

という構成です。

また、パスキーでどうにもならなくなってしまったユーザーが問い合わせを行い、パスキーのリセットを行うケースも見られます。

  1. 身分証などの情報とリカバリー対象ユーザーの情報が一致、そして身分証画像との一致を確認することでそのユーザーとみなす=身元確認
  2. 身元確認が済んだらCSはパスキー設定を全部無効化する
  3. ユーザーは再度パスキーを登録してからサービスを利用

と、ここでは当人認証が1つのように例示してきましたが、最初の方で出したように複数の当人認証を用意することも一般的です。

複数の当人認証を用意しつつ、セルフリカバリー、CS問い合わせからのリカバリーというのを用意していくことで、完全に利用できない状況を遠ざける仕組みを用意することが重要となります。

まとめ

今回はユーザーが何らかの事情で当人認証を利用できない事態を避けることをテーマに、ログイン機能の設計について考えてみました。実際の設計の際はこれに加えて、サービス全体で見たときのセキュリティのレベル、フィッシング耐性、ユーザビリティなど様々な変数が絡んできます。

コメントでもいただいていましたが、この辺りで最も広く参照されていて参考にされているものが NIST SP 800-63シリーズ です。

https://b.hatena.ne.jp/entry/4763616343266948352/comment/Rambutan

ここでいう身元確認はSP800-63A、当人認証はSP800-63Bにて分類や強度(IAL, AAL)、その強度に応じた取り回しなどが定義されています。

この辺りまで意識すると、漠然と「これとこれって並列に並べていいのかなぁ」「これの代わりにこれを使うのっていいのかなぁ」といった疑問に向き合えるようになります。

  • パスキー認証はパスワード認証よりは認証強度が高く、フィッシング耐性も持っている
  • セルフリカバリーで提供する身元確認に適切なものがない
  • セルフリカバリーは提供ぜず、問い合わせで身元確認をしっかりやってパスキーをリセットしよう

という設計に応じた実装をした結果「クロスデバイスなどで結構パスキー使えないケースがある」「セルフリカバリーできないのかよ」といったご意見をいただいてしまうことも世の中にはあります。

パスキー認証の啓蒙において、リカバリーのポリシーなどはサービスが決める必要があることを伝える必要があります。ただし、全てサービス任せにするとよろしくないUXなどでパスキーが嫌われたりします。パスワード認証からのパスキー認証導入のように、一般的なユースケースにおいてはガイドラインを用意して開発者が安心して設計, 実装できる状態になるのが望ましいでしょう。

まずはベーシックなこの考え方を頭の片隅に置きながら、FIDOアライアンスやGoogleが出している様々なガイドラインを読んでみましょう。

https://developers.google.com/identity/passkeys/ux/user-journeys

https://www.passkeycentral.org/design-guidelines/

ではまた。

Discussion