カテゴリ: Spring 更新日: 2025/12/22

Spring Securityで多要素認証(MFA)を導入しよう!TOTPとAuthenticator連携の基本

多要素認証(MFA)導入の考え方:TOTP/Authenticator連携
多要素認証(MFA)導入の考え方:TOTP/Authenticator連携

先生と生徒の会話形式で理解しよう

生徒

「Spring Securityで多要素認証ってできますか?Google Authenticatorとか使ってログインを強化したくて…」

先生

「はい、できますよ。Spring SecurityにTOTPという仕組みを組み込めば、Google AuthenticatorやMicrosoft Authenticatorと連携したMFAが可能になります。」

生徒

「TOTPってなんですか?どうやって導入するんですか?」

先生

「じゃあ今回は、TOTPの仕組みとSpring Securityでの多要素認証(MFA)導入方法について、初心者にもわかりやすく説明していきましょう。」

1. 多要素認証(MFA)とは?

「1. 多要素認証(MFA)とは?」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

1. 多要素認証(MFA)とは?
1. 多要素認証(MFA)とは?

多要素認証(MFA:Multi-Factor Authentication)とは、ログイン時に複数の認証要素を使って本人確認を行う仕組みです。Spring Securityでは、パスワードに加えてTOTP(時間ベースのワンタイムパスワード)を使うことで、セキュリティを大幅に向上できます。

よく使われる認証要素は以下の通りです:

  • 知識要素(パスワード)
  • 所持要素(スマホのAuthenticatorアプリ)
  • 生体要素(指紋や顔認証)

2. TOTPとは?ワンタイムパスワードの仕組み

2. TOTPとは?ワンタイムパスワードの仕組み
2. TOTPとは?ワンタイムパスワードの仕組み

TOTP(Time-based One-Time Password)は、時間をベースに30秒ごとに変化する6桁の数字コードです。Google AuthenticatorやMicrosoft AuthenticatorがこのTOTPを生成してくれます。

サーバー側はユーザーに対してシークレットキー(共有鍵)を発行し、TOTPライブラリを用いてコードの検証を行います。時刻が一致していれば認証成功となります。

3. Spring SecurityでMFAを導入する構成

3. Spring SecurityでMFAを導入する構成
3. Spring SecurityでMFAを導入する構成

Spring Securityで多要素認証を実現するには、以下のような構成が一般的です。

  • ユーザー登録時にTOTP用シークレットキーを生成
  • QRコードを表示し、Authenticatorアプリで読み取り
  • ログイン時にパスワードとTOTPコードを入力
  • サーバー側でTOTPを検証し、認証を完了

この一連の流れをカスタムフィルターやAuthenticationProviderで処理することで、柔軟なMFAが構築できます。

4. TOTP用のライブラリと依存関係

「4. TOTP用のライブラリと依存関係」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

4. TOTP用のライブラリと依存関係
4. TOTP用のライブラリと依存関係

Spring BootでTOTPを使うには、Googleが提供するGoogle Authenticator互換のライブラリ「JOTP」「passcode4j」「otpauth」などを利用するのが一般的です。

以下はGradleでの依存関係の例です。


dependencies {
    implementation 'com.eatthepath:otp-java:1.3.0'
}

5. QRコードの生成とユーザー連携

5. QRコードの生成とユーザー連携
5. QRコードの生成とユーザー連携

QRコードは、TOTP用のシークレットキーをユーザーのスマートフォンと共有するために使用されます。次のようなURL形式を使うことで、Google Authenticatorアプリで読み取り可能なQRコードを生成できます。


String secret = generateSecretKey(); // ライブラリで生成
String issuer = "MyApp";
String email = "user@example.com";
String qrUrl = String.format(
    "otpauth://totp/%s:%s?secret=%s&issuer=%s",
    issuer, email, secret, issuer
);

このURLをQRコードに変換し、画面に表示します。

6. ログイン時のTOTP認証処理

6. ログイン時のTOTP認証処理
6. ログイン時のTOTP認証処理

ログイン時には、ユーザーが入力したTOTPコードをサーバー側で検証します。以下のような処理が必要です。


TimeBasedOneTimePasswordGenerator totp = new TimeBasedOneTimePasswordGenerator();
Key key = new SecretKeySpec(Base32.decode(secret), "HmacSHA1");

boolean isValid = totp.generateOneTimePassword(key, Instant.now()) == Integer.parseInt(inputCode);

一致すれば認証成功となります。Spring Securityのカスタムフィルターを通して、認証フローに組み込むことで実装できます。

7. MFAを有効・無効にするオプション設計

「7. MFAを有効・無効にするオプション設計」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

7. MFAを有効・無効にするオプション設計
7. MFAを有効・無効にするオプション設計

全ユーザーにMFAを強制するのではなく、設定画面で「MFAを有効化する」チェックを入れた場合のみTOTPを要求するようにすると、より柔軟な設計になります。

たとえば、管理者のみMFAを必須にしたり、ユーザー自身が設定変更可能にしたりといった対応が可能です。

8. Spring SecurityでのMFA導入時の注意点

8. Spring SecurityでのMFA導入時の注意点
8. Spring SecurityでのMFA導入時の注意点

多要素認証を導入する際は、以下の点に注意しましょう。

  • シークレットキーは暗号化してデータベース保存
  • 時間同期ズレを考慮してコードの前後余裕を持たせる
  • TOTPの入力画面で試行回数制限を設ける

また、スマートフォン紛失時のバックアップコード発行機能を用意しておくと、ユーザー体験も向上します。

9. 実務での導入事例とセキュリティ向上

9. 実務での導入事例とセキュリティ向上
9. 実務での導入事例とセキュリティ向上

最近では社内システムでもMFAが標準となりつつあり、Spring Securityを使った認証基盤にTOTP連携を組み込む企業が増えています。特に、クラウド時代のアクセス制御においては、パスワードだけでは不十分なため、多要素認証によるセキュリティ強化が重要です。

まとめ

「まとめ」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

まとめ
まとめ

Spring Securityと多要素認証の全体像を振り返る

本記事では、Spring Securityを使って多要素認証(MFA)を導入するための基本的な考え方から、TOTPを利用したワンタイムパスワード認証、そしてGoogle AuthenticatorやMicrosoft Authenticatorとの連携方法までを体系的に学びました。従来のIDとパスワードのみの認証では、パスワード漏洩や総当たり攻撃、フィッシングといったリスクを完全に防ぐことは困難です。そのため、近年ではWebアプリケーションや業務システムにおいて、多要素認証を取り入れることが重要視されています。

Spring Securityは、認証や認可の仕組みを柔軟に拡張できるフレームワークであり、TOTPのような時間ベースのワンタイムパスワードを組み込むことで、より堅牢なセキュリティ設計が可能になります。特に、カスタムAuthenticationProviderやフィルターを利用することで、既存のログインフローを大きく崩すことなくMFAを実装できる点は、実務でも大きなメリットです。

TOTPとAuthenticator連携の理解ポイント

TOTPは、一定時間ごとに変化する使い捨ての認証コードを利用する仕組みであり、ユーザーが所持しているスマートフォンを認証要素として活用します。シークレットキーを共有し、そのキーと現在時刻をもとにコードを生成・検証するため、第三者がコードを盗み見たとしても、短時間で無効になるという特長があります。この仕組みを理解することで、なぜMFAがセキュリティ向上に効果的なのかを論理的に説明できるようになります。

また、QRコードを使った初期設定は、ユーザー体験を大きく左右します。otpauth形式のURLを正しく生成し、Authenticatorアプリで簡単に読み取れるようにすることで、利用者は迷うことなく多要素認証を有効化できます。Spring BootとTOTPライブラリを組み合わせることで、この一連の流れを比較的シンプルに実装できる点も重要な学習ポイントです。

実装時に意識したい設計とサンプルイメージ

多要素認証は、単に機能を追加すれば良いわけではなく、運用やユーザー利便性も考慮する必要があります。たとえば、全ユーザーに一律でMFAを強制するのか、管理者のみ必須にするのか、あるいはユーザー自身が有効・無効を切り替えられるようにするのかによって、設計方針は変わります。Spring Securityでは、ユーザー情報にフラグを持たせることで、柔軟な制御が可能です。

以下は、ログイン時にTOTPを検証する処理イメージの一例です。記事内で紹介した構成と同様のクラスや考え方を用いています。


public boolean verifyTotpCode(String secret, String inputCode) {
    TimeBasedOneTimePasswordGenerator generator =
            new TimeBasedOneTimePasswordGenerator();
    Key key = new SecretKeySpec(Base32.decode(secret), "HmacSHA1");
    int code = generator.generateOneTimePassword(key, Instant.now());
    return String.valueOf(code).equals(inputCode);
}

このような処理をSpring Securityの認証フローに組み込むことで、パスワード認証に加えてTOTP認証を行う多要素認証が完成します。実際の運用では、入力回数制限や時刻ずれの許容範囲、バックアップコードの発行なども併せて検討すると、より実践的なセキュリティ対策になります。

セキュリティ向上と学習のまとめ

Spring Securityで多要素認証を導入することは、単なる技術習得にとどまらず、安全なシステム設計の考え方を学ぶ良い機会でもあります。なぜパスワードだけでは不十分なのか、どのような脅威を想定してMFAを導入するのかを理解することで、セキュリティに強いエンジニアとしての基礎が身につきます。TOTPとAuthenticator連携は、その第一歩として非常に実用的なテーマです。

先生と生徒の振り返り会話

生徒

「Spring Securityで多要素認証を入れる流れが、だいぶイメージできるようになりました。TOTPって、ただの数字じゃなくて、時間とシークレットキーが関係しているんですね。」

先生

「その通りです。仕組みを理解すると、なぜ安全性が高いのかも説明できますね。Spring Securityは拡張性が高いので、こうした認証方式を組み込みやすいのが強みです。」

生徒

「QRコードでAuthenticatorと連携する部分も、ユーザー目線で考えることが大切だと感じました。設定が簡単だと使ってもらいやすいですね。」

先生

「まさにそこが重要です。セキュリティと利便性のバランスを考えることが、実務では求められます。今日学んだMFAとTOTPの知識は、今後の開発でも必ず役立ちますよ。」

カテゴリの一覧へ
新着記事
New1
Spring
SpringDataJPAのJPAクエリメソッド「Is」と「Equals」の使い方を完全ガイド!初心者向け解説
更新記事
New2
Spring
SpringDataJPAのJPAクエリメソッド「Or」の使い方を完全ガイド!初心者向け解説
更新記事
New3
Spring
SpringDataJPAのJPAクエリメソッド「And」の使い方を完全ガイド!初心者向け解説
更新記事
New4
Spring
SpringDataJPAのJPAクエリメソッド「Distinct」の使い方を完全ガイド!初心者向け解説
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Thymeleaf
Thymeleafのth:checkedの使い方!チェックボックスON/OFFを動的に制御する方法
No.3
Java&Spring記事人気No3
Java
Javaの抽象クラス(abstract)を完全ガイド!継承と設計のルールを学ぶ
No.4
Java&Spring記事人気No4
Spring
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
No.5
Java&Spring記事人気No5
Thymeleaf
Thymeleafのth:blockの使い方を完全ガイド!初心者でもわかるテンプレートブロック管理
No.6
Java&Spring記事人気No6
Spring
Springの@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門
No.7
Java&Spring記事人気No7
Java
Javaの@SuppressWarningsアノテーションの使い方を完全ガイド!初心者でもわかる警告の抑制方法
No.8
Java&Spring記事人気No8
Spring
Thymeleaf(タイムリーフ)入門!初心者でもわかるSpring Bootとテンプレートエンジンの使い方