二要素認証とは?わかりやすく解説
二要素認証(2FA)は、あなたが本人であることを、異なる種類の2つの証明で確認するログインの仕組みです。一般的には、パスワードのように自分が知っているもの、そしてスマートフォンやセキュリティキーのように自分が持っているものを使います。犯罪者があなたのパスワードを盗んだり推測したりしても、2つ目の要素がなければログインできません。重要なアカウントを守る、最も手軽な方法のひとつです。
AIで作る場合にこれが大切な理由
AIビルダーに「ログイン」を頼むと、通常はメールアドレスとパスワードが用意されます。これは良いスタートですが、パスワードは使い回されたり、フィッシングで盗まれたり、漏えいしたりします。アプリが顧客情報、請求書、管理機能、支払い設定などの大切なデータを扱うなら、1つのパスワードが盗まれただけで、そのすべてが露出するおそれがあります。
二要素認証は、最初は考えないかもしれない判断にも関わります。
- 誰が使うべきか。 全員に任意にするのか、管理者だけ必須にするのか、全員に必須にするのか。
- どの方法に対応するか。 認証アプリのコード、SMS、パスキー、セキュリティキー。
- ロックアウトされたときにどうするか。 二要素認証を使うアプリでは、スマートフォンをなくすことが、サポートへの問い合わせの最も多い原因です。
- どこで強制するか。 チェックはサーバー側で行う必要があります。ブラウザ上だけで2FAの画面を隠しているだけの場合、回避されてしまいます。
暗号の仕組みを自分で作る必要はありません。十分に検証されたライブラリや認証プロバイダーが処理してくれます。ただし、何を頼むべきかは知っておく必要があります。
身近なたとえ
銀行の貸金庫を考えてみてください。開けるには、身分証明(銀行が確認する、あなたが誰であるか、何を知っているか)と、物理的な鍵(あなたが持っているもの)の両方が必要です。あなたの署名をまねた泥棒は、それでも鍵を持っていません。鍵をスリで盗んだ泥棒も、身分証明の確認は通れません。
二要素認証も同じ仕組みです。パスワードは署名にあたり、スマートフォンやセキュリティキーは物理的な鍵にあたります。どちらか1つだけでは足りません。
3種類の要素
アメリカ国立標準技術研究所(NIST)のデジタル本人確認に関するガイドラインのようなセキュリティ標準は、要素を3種類に分けています。
| 要素 | 例 |
|---|---|
| 自分が知っているもの | パスワード、PIN |
| 自分が持っているもの | 認証アプリが入ったスマートフォン、セキュリティキー、パスキーを保持する端末 |
| 自分自身であること | 指紋、顔。通常は、実際の確認を行う端末のロックを解除するために使われます |
重要なのは異なるという点です。パスワードと秘密の質問は、どちらも自分が知っているものなので、本当の二要素認証にはなりません。1回の漏えいで両方が露出するなら、1つとして数えられます。
よく使われる2FAの方法の比較
| 方法 | 仕組み | 強度 | 補足 |
|---|---|---|---|
| SMSコード | 電話番号にコードがテキストメッセージで届く | 最も弱い | SIMスワップやフィッシングに弱いですが、2FAがないよりははるかに良い |
| メールコード | コードがメールで届く | 弱い | メールアカウントの安全性にしか依存しない |
| 認証アプリ(TOTP) | Google Authenticatorなどのアプリが、通常30秒ごとに新しい6桁のコードを生成する | 良い | オフラインでも動作するが、偽サイトにコードを入力させられるとフィッシングされうる |
| プッシュ承認 | アプリが「本人ですか?」と尋ね、タップして承認する | 良い | 「承認疲れ」に注意。繰り返し表示される通知を止めるために、ユーザーが「はい」を押してしまうことがある |
| パスキーまたはセキュリティキー | デバイス上の暗号化キーが、本物のサイトであることを証明する | 最も強い | 偽のドメインには応答しないため、フィッシングに強い |
NISTのガイダンスでは、コードを入力する方式(SMS、メール、認証アプリ)は、フィッシングに強いとはみなしていません。また、電話網経由でコードを送ることは「制限付き」としています。WebAuthn/FIDO2標準に基づくパスキーとハードウェアセキュリティキーが、フィッシングに強いものとして扱われます。
実用的な結論としては、ほとんどのアプリにとって、認証アプリは強力で導入しやすい既定の選択肢であり、ユーザーが慣れているなら、パスキーの提供も検討する価値があります。
実例:顧客ポータルへの二要素認証の追加
小さな会計事務所が、顧客と税務書類を共有するポータルを作ったとします。適切な二要素認証の設定を、手順ごとに見てみましょう。
設定の有効化(登録)。 顧客のPriyaさんが設定を開き、「二要素認証をオンにする」をクリックします。アプリは秘密の値を生成し、それをQRコードとして表示します。彼女が認証アプリでそれを読み取ると、6桁のコードが表示されるようになります。彼女は現在のコードをポータルに入力し、設定が正しく機能したことを確かめます。アプリは10個のリカバリーコードを表示し、安全な場所に保存するよう求めます。
その後のログイン。
- Priyaさんがメールアドレスとパスワードを入力します。サーバーがそれらを確認します。
- サーバーは彼女をすぐにはログインさせず、セッションを「パスワードは正しい、2つ目の要素は保留中」とマークして、コードの入力画面を表示します。
- 彼女は自分のアプリのコードを入力します。サーバーは、保存された秘密の値と照合します。時計のわずかなずれは許容します。
- ここでようやく、サーバーは完全なセッションを作成し、彼女が書類を見られるようにします。
攻撃者から見ると。 Priyaさんのパスワードが別のサイトから漏れていた場合、攻撃者はステップ3で止まります。コードの誤入力はすべて数えられ、何度か間違えるとアカウントは一時的にロックされ、Priyaさんにメールが届きます。
スマートフォンをなくした場合。 Priyaさんは、リカバリーコードのひとつを使ってログインし、2FAをいったんオフにして、新しいスマートフォンで再びオンにします。そして新しいリカバリーコードを受け取ります。使用済みのコードは二度と使えません。
スタッフの場合。 この事務所の会計士は、すべての顧客のファイルを見られるため、ポータルではスタッフのアカウントに2FAを必須にしています。登録が終わるまで、ダッシュボードにはアクセスできません。
よく使う用語の解説
| 用語 | 意味 |
|---|---|
| 2FA / MFA | 二要素/多要素認証。2種類以上の証明でログインすることです。 |
| 要素(Factor) | 証明の1種類。知っているもの、持っているもの、自分自身であるもののいずれかです。 |
| TOTP | 時間ベースのワンタイムパスワードで、認証アプリに表示される、変化するコードのことです。 |
| 共有の秘密の値 | QRコードで設定される隠された値で、アプリとスマートフォンが同じコードを生成するために使います。 |
| リカバリー(バックアップ)コード | 2つ目の要素を紛失したときに使う、一度だけ使えるコードです。 |
| パスキー | パスワードの代わりに公開鍵暗号を使い、端末に保存されるログイン用の資格情報です。 |
| セキュリティキー | パスキーと同じ役割を果たす、小さな物理デバイス(USBまたはNFC)です。 |
| SIMスワップ | 携帯会社をだまして、ある人の番号を新しいSIMに移し、テキストメッセージが攻撃者に届くようにすることです。 |
| フィッシング | 偽のサイトやメッセージで、パスワードやコードを渡させようとする詐欺です。 |
| ステップアップ認証 | 支払い先の変更など、重要な操作の前に2つ目の要素をもう一度求めることです。 |
よくある間違いと誤解
- 「2FAがあればアカウントは絶対に破られない」。 破られにくくなるだけです。フィッシングサイトは、入力されたコードをリアルタイムで盗めるため、パスキーが存在しているのです。
- コードの確認をブラウザ上だけで行う。 パスワードの後にサーバーが完全なセッションを発行しているなら、コードの画面は飾りにすぎません。サーバーは、2つ目の要素が通るまでアクセスを拒否する必要があります。
- コードの試行回数に制限がない。 6桁のコードには100万通りの組み合わせがあります。レート制限とロックアウトがなければ、攻撃者は推測を続けるだけで済みます。
- リカバリーの方法を用意しない。 リカバリーコードがなければ、スマートフォンを紛失するたびにサポートへの問い合わせ、またはロックアウトされた顧客が生まれます。
- TOTPの秘密の値を不注意に保存する。 共有の秘密の値は、データベースで暗号化し、設定後は二度と表示しないようにすべきです。
- ユーザーが再確認なしで2FAをオフにできる。 2FAをオフにしたり、アカウントのメールアドレスを変更したりするには、パスワードと現在のコードを求めるべきです。
- パスワードと秘密の質問を組み合わせれば2FAになる。 なりません。どちらも自分が知っているものだからです。
AIビルダーに頼む内容
- 「認証アプリ(TOTP)を使ったオプションの二要素認証を追加してください。設定にはQRコードを表示し、オンにする前に確認コードの入力を求めてください。」
- 「2FAを有効にしたら、使い捨てのリカバリーコードを10個表示してください。パスワードと同じようにハッシュ化して保存してください。」
- 「2FAはサーバー側で強制してください。2つ目の要素が通るまで、完全なセッションを発行しないでください。」
- 「コードの試行回数を制限し、何度か失敗したらログインを15分間ロックしてください。そのときはユーザーにメールを送ってください。」
- 「管理者アカウントには2FAを必須にしてください。」
- 「2FAをオフにする、またはアカウントのメールアドレスを変更する前に、パスワードと現在のコードを求めてください。」
- 「よく知られたライブラリか、認証プロバイダーに組み込まれた2FAを使ってください。暗号は自分で書かないでください。」
- 「どの方法を使ったか、秘密の値をどこに保存しているかを説明してください。」
ホスト型の認証プロバイダーを使う場合は、そこにすでに2FAやパスキーの機能があるか確認してください。組み込みの機能をオンにするほうが、独自のコードを書くよりも通常は安全です。手順に沿った説明は二要素認証の追加方法にあり、その基盤となるログインの基本は認証とはで解説しています。
Mythexでの二要素認証
Mythexは、アプリのユーザー向けのログインシステムを内蔵していません。そのため、二要素認証はどの認証方法を選ぶかの一部になります。自分でメールアドレスとパスワードによるログインを作り、プロジェクトのデータベースに保存する方法もあれば、二要素認証を提供しているホスト型プロバイダーを使う方法もあります。チャットでエージェントに追加を頼むことができ、プロバイダーのキーはチャットではなく、プロジェクトのシークレットに入れます。アプリにログインを追加するのドキュメントのレシピには、調整して使えるスタータープロンプトがあり、作成したアプリのセキュリティでは、キーの扱いに関する心構えを説明しています。公開前には、AIで作ったアプリのセキュリティチェックリストに目を通してください。
よくある質問
二要素認証とは簡単に言うと何ですか?
二要素認証(2FA)とは、ログインに2種類の異なる証明を必要とする仕組みです。通常は、パスワードに加えて、スマートフォンのコードやセキュリティキーなどを使います。パスワードだけを盗まれた人は、それでもログインできません。
2FAとMFAは同じものですか?
ほぼ同じです。多要素認証(MFA)は2つ以上の要素を使うことを指し、二要素認証は、ちょうど2つの要素を使う最も一般的なケースです。日常的な使い方では、両者は区別せずに使われています。
SMSによる二要素認証は安全ですか?
パスワードだけの場合よりははるかに良いですが、一般的な選択肢の中では最も弱いものです。SMSは傍受されたり、SIMスワップによって転送先を変えられたりすることがあります。また、偽のログインページが、人にコードを入力させてしまうこともあります。認証アプリのほうが強く、パスキーやセキュリティキーはさらに強力です。
私のアプリには二要素認証が必要ですか?
アカウントがお金、非公開のデータ、または他のユーザーに対する管理権限を持つ場合は、二要素認証を提供するのがよいでしょう。管理者に対して必須にするのも一般的です。個人の趣味のアプリであれば、任意にするか、後回しにしても構いません。
ユーザーがスマートフォンをなくしたらどうなりますか?
そのために、リカバリーコードがあります。二要素認証をオンにしたときに表示される、一度だけ使えるバックアップコードの短いリストです。それがないと、通常はアプリの所有者による手動の本人確認が必要になるため、公開前に備えておいてください。