ワンタイムパスワード(OTP)のフローを実装するのに知っておきたいすべてのこと (Part 1)

皆さん、こんにちは。
[GetOTPというWeb APIを一発呼ぶだけでマルチチャネルのワンタイムパスワードを簡単にできちゃうAPIサービス](https://otp.dev/)を運営している[ラロカラボ](http://lalokalabs.co/)のイクバルです。

# はじめに

そもそも、「ワンタイムパスパスワード(OTP)」って何？という方いましたら、まず[「今さら聞けない、OTPって何？」](https://qiita.com/iqbalabd/items/791a0188fe06b973890c)を読んでほしい。

さて、アプリまたはWebサイトにワンタイムパスワード（OTP）フローを設定することは、今日では非常に一般的な要件です。ですが、あれだけ日常的にOTPを受け取っているのに、意外とどれだけその実装に複雑のロジック組み込まれているのか、あまり知られてないでしょうか。

しかし、それはどのように機能しますか？何を始める必要がありますか？あなたが直面する落とし穴と課題は何ですか？

クライアントが実装を数え切れないほど展開しているのを見てきました。これは基本的に、企業や開発者に数千時間と数千ドルのコストがかかる定型的な反復可能なプロセスです。 [GetOTP](https://otp.dev/)は、開発者の負担を軽減し、この反復可能なプロセスから開発者を解放し、それに伴うメンテナンスコストを削減するために構築されました。

一連のブログ投稿で、OTPとは何か、なぜそれが一般的な要件であるのか、そして自分のWebサイトにOTPを実装するために何をする必要があるのか​​を2つにわけてシーリズの記事で説明しようと思います。

この第一回の記事は、[GetOTPのブログ記事](https://otp.dev/en/blog/124/all-you-need-to-know-to-implement-otp-for-your-site-part-1/)を元記事としてに書いていきます。

https://otp.dev/en/blog/124/all-you-need-to-know-to-implement-otp-for-your-site-part-1/

# では、OTPは私のWebサイトでどのように機能しますか？

この投稿を読んでいる場合は、あなたのサイトにの2FAフローでOTPを実装しようとしていること考えてるでしょうか。上記のように、これはOTPの非常に一般的な使用法であり、特定のサイトに新しい顧客またはユーザーを登録するときに最も一般的に使用されます。

実装には3つの大きな部分に分けることができます。

- サーバーの初期準備部分
- 通信チャネルを介したOTPの送信
- お客様からOTPを受け取り、確認する

以下では、ウェブサイトにOTPを使用して2FA認証フローを実装するために必要な手順の概要を説明していきます。

これらの投稿での私の意図は、実行する必要のあるロジックと手順を示すことです。できるだけ多くの人がこれらの手順を理解できるように、コードは使用しません。

# サーバーでの初期準備
エンドユーザーへのワンタイムパスワード（OTP）の送信を開始する前に、エンドユーザーが確認するOTPを生成する方法が必要です。

## 優れたユーザーエクスペリエンスを備えたOTPを生成する
これは通常、ランダムに生成される4桁または6桁の文字列です。公平を期すために、文字列は数字である必要はありませんが、数字を使用するとユーザーインターフェースでの入力が簡単になり、電話を使用してOTPを認証することもできます。

OTPには最大6桁をお勧めします。これは、ミラーの法則に基づいて覚えやすい桁数であり、優れたユーザーエクスペリエンスを実現します。

## OTPを他のデータに接続する
OTPが生成されたら、それをエンドユーザーのアカウントに関連付けて、OTPが正しく入力されたときに誰が確認されたかを知る必要があります。生成されたOTP（TOTPまたはTime Based One Time Passwordとも呼ばれます）に使用可能な時間制限を設定することもお勧めします。

同じOTPを使用して複数の人を同時に確認しないように注意してください。特定のOTPでどの人が確認されたかを判断するのが混乱するためです。また、OTPをリサイクルすると、いわゆるリプレイ攻撃に対して脆弱になるため、リサイクルしないでください。

安全なOTPを生成するための詳細について詳しく知りたい場合は、インターネット技術特別調査委員会（IETF）によって公開されている[RFC4226](https://datatracker.ietf.org/doc/html/rfc4226)を読むとよいでしょう。

最後に、OTPの送信先、顧客がアクセスできる場所に関する情報を取得する必要があります。これは、確認したい人のメールアドレス、携帯電話番号、電話番号、さらには郵送先住所にすることができます。通常、これはWebサイトまたはモバイルアプリケーションのフォームを介して行うことができます。

ここで、電子メールアドレス、電話番号、または郵送先住所を、データベース内のOTPおよび顧客データと結び付けます。

プロセスのこの部分はそれほど難しくはなく、通常、適切な能力のある開発者が半日以内に実行できます。

これで、顧客を確認するためのOTPができました。プロセスの次の部分は、OTPをどのように送信するかを決定することです。

確認のためにOTPを顧客に送信できるチャネルまたは方法は複数あります。どちらを使用するかは、ビジネスのニーズと、顧客が利用できるものによって異なります。最も一般的なものは、電子メール、SMS、および音声通話です。

#  電子メール、SMS、音声通話の違いは何？

## チャネルとしての電子メール
電子メールは、使用できる最も一般的なチャネルであり、インターネット上のサービスにサインアップするときにユーザーIDとしても一般的に使用されます。

電子メールはコミュニケーションのチャネルとして非常に一般的であり、マーケティングにも使用されるため、サービスが顧客の電子メールも収集する可能性があります。

### メリット
- インターネットに接続している場合、メールアドレスの取得は無料で簡単に行えます。ほぼすべての顧客が電子メールアドレスを持っていると想定するのは安全です
- メールアドレスの送信にはほとんど費用がかかりません。
- 非同期：OTPを受信し、使用する必要がある場合、多少の遅延時間があります。これは、ユーザーエクスペリエンスに役立ちます。

### ディメリット

- ほとんどの場合、身分証明書の確認が含まれていないため、電子メールアドレスの取得は簡単すぎる可能性があります。
- 一部の電子メールプロバイダーは、電子メールの自動処理を許可しています。これにより、いわゆるボットがOTPを操作する可能性があります。

## チャネルとしてのSMS
ショートメッセージサービス(SMS)は、Webサービスが顧客を登録および認証するためのもう1つの一般的な方法になりつつあります。

### メリット

- SMSを電話番号に送信することは、受信者が物理的に電話番号を持っていることを暗黙的に意味します
- SMSは、電子メールと同様に電話に保存され、後で参照できます
- 一人ひとりが1つの携帯電話番号にアクセスできるという一般的な理解があります。これは、人を識別する非常に緩い方法として機能します。
- 電子メールと同じように、これは非同期チャネルであり、ユーザーエクスペリエンスに適しています。

### デメリット

- OTPのSMSの送信は無料ではありません。ネットワークの使用に対するキャリア料金。
- 1人が1つの携帯電話番号にアクセスできるという一般的な理解は真実ではありません。複数の携帯電話番号を持っている人もいれば、持っていない人もいますが、いわゆるオンラインの無料SMS番号を使用してSMSを受信します。

## 音声通話はどうですか？

最後に、音声通話があります。音声通話は、上記の他の2つのチャネルほど一般的ではありませんが、誰かが実際に所有権を持ち、特定の番号で到達できることを確認するためのより効果的な方法です。

### メリット

- 音声通話は携帯電話だけに限らない。**このチャネルは、家庭やオフィスへの固定電話にも使用できます。** これが音声チャネルしかできないことだからかなり強力ですね。
- 音声通話は同期媒体です。非同期の電子メールやSMSとは異なり、音声通話による認証は通話中に行う必要があります。このチャネルは、OTPの受信者が特定の番号に物理的にアクセスできるようにするために、電子メールやSMSよりも強力な方法である可能性があります。

### デメリット

- 音声通話は同期メディアであるため、電子メールやSMSよりもユーザーエクスペリエンスが低くなります。受信者は、音声通話を受け入れて応答する準備ができている必要があります。
  

この投稿で取り上げていないチャネルの1つは、郵便のチャネルです。 OTPを物理的な郵便物に含めて郵送することもできます。その郵便物を受け取り、同封のOTPを入力します。特定の受信者が特定の住所に受け取れることを確実にする必要がある場合は、これが唯一の方法です。一部の法域では、銀行がKnow Your Customer (KYC) 要件の一部としてこれを行うことを義務付けられています。

[次の投稿](https://qiita.com/iqbalabd/items/0f0a6db056f08cba27c1)では、これらのさまざまなチャネルを介したOTPの実際の送信と、OTPの検証について詳しく説明します。

# LaLoka Labs（ラロカラボ）とは
https://lalokalabs.co
LaLoka Labsは、人々が時間とお金を節約し、人間をより幸せにするのに役立つソフトウェアを作ります。