SMS認証の3つの落とし穴 — SIMスワップ・コスト・到達率

公開日: 2026-03-02

「本人確認といえばSMS認証」という時代が続いています。しかし、その「当たり前」には見落とされがちな3つのリスクが潜んでいます。本記事ではSMS認証の落とし穴を整理したうえで、代替手段として「着信認証」という選択肢をご紹介します。

落とし穴①: SIMスワップ攻撃

SIMスワップ攻撃とは、攻撃者がキャリア(携帯電話事業者)に被害者になりすましてSIMカードを再発行させ、被害者の電話番号を自分のSIMに乗っ取る攻撃手法です。

攻撃の流れはシンプルです。

  1. 情報収集: SNSや流出データベースから個人情報(氏名・生年月日・住所等)を収集する
  2. なりすまし: キャリアショップや電話サポートへ「SIMを紛失した」などと偽って連絡する
  3. SIM再発行: キャリアが被害者の電話番号を攻撃者のSIMへ移行する
  4. SMS傍受: 被害者の電話番号に届くSMSが、全て攻撃者へ転送されるようになる
  5. 不正アクセス: SMS OTPを使って被害者のアカウントに不正ログインする

米国FBI IC3の統計によれば、SIMスワップ関連詐欺の被害額は2021年だけで約6,800万ドル(約100億円)に達しています。日本でも総務省が2023年から注意喚起を強化しています。

SMS OTPの根本的な脆弱性は、「電話番号の所有者が変わっても認証システムはそれを知る手段がない」という点にあります。SIMスワップによって電話番号が攻撃者に移ると、OTPは攻撃者に届きます——認証システムからは「正当な認証」として処理されてしまいます。

落とし穴②: コストの見えない膨張

SMS認証のコストは「安い」というイメージがありますが、サービスが成長するにつれて想定外のコストが積み重なります。

一般的なSMS配信APIの単価は以下の水準です:

  • 国内SMS: 10〜15円/通
  • 国際SMS: 15〜25円/通(地域によりさらに高額)
認証方法 単価 月1万件 年間
SMS認証(国内) 10〜15円 10〜15万円 120〜180万円
pauth.me着信認証 $0.05〜(約7円〜) 約7万円〜 約84万円〜

さらに、SMS到達率は95〜98%程度。到達しなかった場合のユーザーの「再送」リトライが、実際のコストを大きく押し上げます。1通送って届かず、もう1通送るだけでコストが2倍になります。

落とし穴③: 到達率と固定電話の壁

SMS到達率95〜98%は一見高く見えますが、月間1万人が認証を試みる場合、200〜500人がSMSを受け取れない計算になります。到達しない主な原因は:

  • 海外ローミング中の受信遅延・不達
  • キャリアのスパムフィルターによる誤検知
  • MVNOや格安SIMでの配信遅延
  • 海外キャリアからのSMSがブロックされるケース

また、SMS認証には根本的な制限があります——固定電話にはSMSを送れません。スマートフォンを持たない高齢者、会社の代表電話で登録したい法人ユーザー、050番号などIP電話ユーザーへの対応が困難です。

NISTの警告

アメリカ国立標準技術研究所(NIST)は、2017年に公表したデジタルアイデンティティガイドライン「NIST SP 800-63B」の中でSMS OTPを「Restricted Authenticator(制限付き認証手段)」として分類しています。「禁止」ではないものの、利用する場合はリスク評価・代替認証手段の提供・継続的モニタリングが求められます。

着信認証という解決策

着信認証(Call Authentication)は、SMS OTPのかわりに「電話をかけること」で本人確認を行う認証方式です。ユーザーが指定された番号に電話をかけ、1コールで切るだけ。SMSアプリを開く必要も、6桁のコードを手入力する必要もありません。

SMS認証の3つの課題への回答:

  • SIMスワップリスク: 「電話をかける」という能動的な行為が必要なため、SMS傍受より攻撃が困難
  • コスト: pauth.meは1件$0.05〜(約7円〜)で、国内SMS(10〜15円)より低コスト
  • 固定電話対応: 電話番号に直接発信するため、固定電話・IP電話にも対応

実装例(Node.js / pauth-js SDK)

const { PauthClient } = require('pauth-js');
const client = new PauthClient({ apiKey: process.env.PAUTH_API_KEY });

// Step1: 認証開始 — ユーザーに発信先番号を提示
const session = await client.entry('+819012345678');
// → session.callerd_number: ユーザーが電話すべき番号

// Step2: ユーザーが電話をかける(1コールでOK)

// Step3: PIN照合 — 認証完了
const isValid = await client.apply('+819012345678', pin);

まとめ

SMS認証は依然として多くのサービスで有効ですが、「とりあえずSMS」という選択ではなく、以下を考慮した設計判断が重要です:

  • セキュリティ: SIMスワップリスクの許容レベルはどの程度か
  • コスト: サービス成長に伴うSMS費用を許容できるか
  • 到達性: 固定電話・IP電話ユーザーもカバーする必要があるか

参考文献: FBI IC3 Annual Report 2022 / FCC Consumer Advisory on SIM Swapping, 2023 / NIST SP 800-63B, 2017 / 総務省「SIMスワップを悪用した不正なSIMカードの再発行について」2023


着信認証を試してみませんか?

サンドボックスで即日お試し。クレジットカード不要。

無料で始める 料金を見る