電話番号認証について本気で考えてみた

## 認証における電話番号の利便性について
電話番号認証、さまざまなアプリ、特にスマートフォン用のアプリを触っていると、電話番号で認証してログインするアプリをたびたび見かけます。簡単にフロー図で記載すると、ログインのフローとしては、以下のようになります。

```mermaid
graph TB
　　　　A[電話番号を入力する]
  A-->B[番号が記載されたショートメッセージが届く<br>もしくは電話が来る]
  B-->C[番号を画面に入力して送信]
  C-->D{番号が}
  D-->|正しい| E[ログイン成功]
  D-->|正しくない| F[ログイン失敗]
```
私がインストールしたことのあるアプリだと、電動キックボードシェア/シェアサイクルアプリのLUUPやスマホ充電レンタルサービスのChargeSpotなどが電話番号認証によって機能が使えるようになっていました。

Webの場合、ログイン機能で代表的なのはメールアドレスとパスワードを入力してログインさせる方法です。しかし、スマートフォンの場合、メールアドレスを用いてログインさせるには以下のようなデメリットがあります。
 1) メールアドレス入力が面倒
 2) メールアドレスは個人が複数取得するハードルが低い
 3) メールアドレスの存在確認をするためには別途メールアプリで受信したメールを確認する手間がある

1)に関しては最近のスマホは１度入力すれば指紋認証等でオートフィルしてくれたりするので楽にはなってきますが、それでも最初はメールアドレスとパスワードを入力しなければいけないので、面倒だと思います。
2)に関してはより致命的で、例えばユーザー登録時にサービスに使える500円分のポイントやクーポンを付与しますといった場合に、ユーザーのユニーク制約としてメールアドレスを用いてしまうと、同じ人が何度も初回登録特典を利用できてしまいます。その点、電話番号であれば、複数取得することに対するコストがメールアドレスよりも高いので同一人物による初回限定特典複数獲得リスクを軽減することができます。
3)に関しては、ユーザー登録時にそのユーザーのもつメールなのかを確認するのはC向けのサービスとしては必須で、メールアドレスに認証用のURLやワンタイムトークンを送付することでメールアドレスの存在確認をしますが、メールアプリを開く必要があり、ここでアプリに戻すためにディープリンクなど（多くは、Firebase dynamic linksを使うことが多いと思いますが）の設定が面倒だったり、ユーザーとしてもあっちいったりこっちいったりして面倒です。

したがって、MNP制度がある現在においては、電話番号は特定の個人に紐づくものとして非常に有力な情報であり、これをシステム内でのユーザーにとってユニークなものとしてログインに利用するというのは非常に納得できるものだと言えます。加えて、ログインフローに関してもSMSで認証用のワンタイムトークン（6桁の番号など）が送られてきたら、スマートフォン側でおせっかいにも入力を補助してくれてSMSアプリを見に行かなくてもよいので、非常に使いやすいログインを実現することができます。

## 電話番号の注意点
ただし、電話番号を利用するには注意が必要です。先ほど、「電話番号は特定の個人に紐づくものとして非常に有力な情報」と記載しましたが、必ずしも電話番号が特定の一個人（や法人）の保有するものとは限らないということです。つまり、電話番号は解約されたら他の誰かのものとして再利用される可能性があるということです。ネット上の記事によると早い場合は３ヶ月程度で再利用されるケースもあるのだとか。つまり、純粋に電話番号認証だけを利用していると
```mermaid
graph TB
　　　　A[Aさんが電話番号認証でログイン]
  A-->B[アプリのサービスを利用し利用履歴などが残る]
  B-->C[Aさんがアプリを退会せずに電話番号を解約]
  C-->D[数ヶ月後,Bさんが新規に携帯電話を契約しAさんの電話番号を譲り受ける]
  D-->E[たまたま同じアプリを利用し,電話番号認証でログイン]
  E-->F[過去に使った覚えがないのにすでに利用履歴があって閲覧できる]
```

というようなことが起こり得るのです。例えばどこでそのサービスを利用したかとかが分かれば電話番号の前の持ち主の生活圏が知らない人に把握されてしまいますし、クレジットカードが登録されていようものなら、勝手に利用される恐れもあるということです。

## どうすればいいか
上記のような問題点があるものの、電話番号による認証は一個人と強く紐づくものであり、ログインの利便性も高いので使いたい認証方法です。
それでは、上記電話番号の注意点に対する対応として、どうすればいいかを考えていきます。ケースとして、「アカウントを自動で無効化できる場合」と「アカウントを自動で無効化できない場合」の２つのケースについて考えていきます。

### アカウントを自動で無効化できる場合
例えばサービスが純粋に都度決済でアカウントが無効化されてしまったとしても、過去の利用履歴が見れなくなる程度の場合であれば、アカウントが自動で無効化されてもあまり大きな弊害はないと思います。[^1]
このケースの場合、セッションに有効期限を設け、一定期間が経ったら自動的にログアウトして再度利用したい場合はログインをお願いするようにし、さらに最終ログインから一定期間後に無効化することで課題を解決することができると考えられます。
例えば、前回のログインから30日（約1ヶ月）経ったらログアウトさせ（セッション切れとし）、再度電話番号認証をさせます。そして、最終ログインから90日（約3ヶ月）経ってもログインがない場合はアカウントを無効化します。そうすれば、月１以上利用しているユーザーにとっては、アカウントは無効化されませんし、月１程度の再ログインであれば煩わしさはそこまで感じないと思います。最終ログインから3ヶ月も利用していないのであれば、ユーザーとしてもそのサービスの利用頻度が低いでしょうから、再度アカウント登録して例えば利用履歴がなかったとしても大きな問題にはならないかと思います。電話番号が再利用されて元の利用者とは違う人が持ち主になったとしても、3ヶ月経てば無効化されるので、他人に利用履歴が見られるという心配もありません。
このようにする場合、セッション切れになった場合には、「セッションの有効期間が切れました。再度ログインしてください」といったメッセージをユーザーに伝えたほうが親切でしょう。
アカウントが無効化された後で再度アカウント登録された場合であっても同じ電話番号であったとしても管理としては別アカウントとしてみなします（一般的には別のアカウントとしてデータベースにレコード登録する）。したがって、たとえ同一人物であったとしても違うアカウントになるので、過去の利用履歴は閲覧できません。
また、一度無効化された場合でも、ユーザーから情報を追加でもらうことで、過去の利用履歴などを再度紐付け直す（ユーザーに新規に登録してもらった後で、過去の利用履歴のアカウントとの紐付けを変える）といったオペレーションも想定しておいてもいいかもしれませんが、サービスによっては必須ではないと思います。
また、どのくらいの期間でログアウトさせるか（セッション切れとするか）や、どのくらいの期間でアカウントを無効化するかは個々のサービス側で判断するべき事項です。
[^1]:サービスによっては利用履歴が見れないことによるデメリットが大きいケースもあるので、自動で無効化して良いかどうかの判断は個々のサービスで判断してください）

### アカウントを自動で無効化できない場合
例えば、ユーザーが自らお金を払ってサービスで利用できるプリペイドのようなものがある場合、最終ログイン後３ヶ月で無効化してしまっては、ユーザーは著しく不利益を被ることになります。もちろん、これすらも「サービス利用規約に書いてあるから３ヶ月ログインしていなかったらプリペイドは没収！」という仕様にすることもできるとは思いますので、個々のサービスの判断によるところだと思いますが、いずれにせよ、アカウントを自動で無効化したくないケースというのも存在します。
その場合はどのようにすればいいでしょうか。一つの解としては、やはり多要素認証とすることだと思います。つまり、例えばプリペイドを利用したい場合は、メールアドレス認証を追加で必須とするようにします。
一方で、「３０日経ったらセッション切れと、再度電話番号によるログインをさせる」ということは「アカウントを自動で無効化できる場合」と変わりはありません。違うのは、最終ログインから90日（約3ヶ月）経ってもログインがなくても、メールアドレス認証を追加しているアカウントであれば、無効化しないようにするということです。無効化する代わりに、最終ログインから90日（約3ヶ月）経った場合は、ログイン時に電話番号認証に加え、メールアドレスとパスワードを入力させてメールアドレス認証もさせます。こうすることで、ユーザーが電話を解約し数ヶ月経って電話番号が再利用されたとしても、メールアドレス認証が必要になるので、電話番号が渡った人が前の電話番号の持ち主の利用履歴を閲覧することはできません。
ただし、電話番号が渡った人が新規にサービスを利用したいという場合もあるので、その場合は、新しいアカウントとして利用できるようにすることも必要になってきます。
こうすることで、初回や長期間利用しなかった場合にはメールアドレスによる煩わしい認証が必要になるが、普段は電話番号認証だけで利用できるという比較的簡便な方法でログインして利用できるようになります。
加えてこれは余談ですが、メールアドレス認証を追加していたとしても、例えばX年利用していない場合は、ユーザーを無効化できるように利用規約で規定しておくのがいいと思います。ゴミアカウントが多くなってしまうのはサービスにとってもパフォーマンスの面等からよろしくないと思います。例えば、2022年12月にイーロン・マスク氏が長期間ログインしていないツイッターの「休眠アカウント」を削除する方針を発表したのは記憶に新しいことだと思います。プリペイドなどの前払式支払手段を利用するために多要素認証を設ける場合については、多くの場合、プリペイドの保持期間を規定すると思いますので、そのタイミングでアカウントを無効化するというのも一つの方法だと思います。

### サービス利用規約の改訂
以上のような電話番号認証における問題に対応するためには、場合によってはアカウントを自動で無効化させるという必要がでてきます。その場合は、サービス利用規約なども改訂する必要がある場合がありますので、法務とも調整の上、忘れずに改定する必要があります。また、必要に応じてユーザーに通知することも重要でしょう。

## LUUPの対応について
私は、2022年4月に、この点についてLUUPに質問をいたしました。2022/04/25にきた返信が以下になります。したがって、LUUPを利用されている方で、電話番号を手放す場合は、忘れずにLUUPを退会しておくことをお勧めいたします。ただし、一年前の話ですのですでに改善されているかもしれません。
```
問い合わせいただきました「携帯を解約し電話番号を手放した場合、アカウントはどうなるか」についてご案内いたします。
 
本件につきまして、お客様が弊社アカウントの削除をせずに携帯番号を解約され、第三者の方が新規で該当の電話番号を取得した場合、お客様のアカウントにログインできてしまう可能性は考えられます。
 
そのため、電話番号を手放した場合、必ずLUUPカスタマーセンターの退会フォームにご連絡いただき、一度退会いただいた上で、新たな電話番号で新規登録をお願いいたします。
 
■退会フォーム
https://support.luup.sc/hc/ja/requests/new
 
尚、上記の通り再割り当て等で、該当の電話番号を取得した第三者の方は「自分自身で作成したお心当たりがないLUUPアカウントが存在している」という状況になり得ます。
 
そのような状況の場合、LUUPカスタマーセンターにお問い合わせいただけましたら、弊社にて該当の電話番号で新規登録ができるように処理を行います。
 
そのほかご不明点などございましたらご遠慮なくお問い合わせください。
今後ともLUUPをご愛顧くださいますようお願いいたします。
```