Spring Securityでフォームログインを実装!ログイン・ログアウト・Remember-Meの設定方法まとめ
Spring Bootを使ったWebアプリケーション開発を、 環境構築から実践まで一通り学びたい方には、 定評のある入門書が参考になります。
Spring Boot 3 プログラミング入門をAmazonで見る※ Amazon広告リンク
生徒
「ログイン機能をSpring Securityで作りたいのですが、何から始めたらよいでしょうか?」
先生
「まずは、Spring Securityを使ってフォームログインを設定しましょう。基本的な構成を理解することで、ログイン・ログアウト・Remember-Meといった機能を簡単に実装できますよ。」
生徒
「Remember-Meって何ですか?」
先生
「Remember-Meは、ログイン状態をブラウザに保存して、次回訪問時に再ログインなしでアクセスできる機能です。セキュリティの観点でも設定の注意点がありますよ。」
1. Spring Securityでフォームログインを有効にするには?
Spring Securityでは、フォームログイン(form-based login)を簡単に設定できます。基本的な設定をSecurityFilterChainで行い、ログインページやログイン成功後の遷移先などを定義できます。
以下は、ログインページをカスタムし、ログアウトとRemember-Me機能を追加した基本設定の例です。
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/login", "/css/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.defaultSuccessUrl("/home", true)
.permitAll()
)
.logout(logout -> logout
.logoutUrl("/logout")
.logoutSuccessUrl("/login?logout")
.permitAll()
)
.rememberMe(remember -> remember
.key("uniqueAndSecret")
.tokenValiditySeconds(86400)
);
return http.build();
}
}
2. ログインページのHTMLを作成しよう
フォームログインに対応するために、自作のログイン画面を作成します。ユーザー名とパスワードをPOSTするようにしておけば、Spring Securityが自動的に処理してくれます。
<!DOCTYPE html>
<html>
<head>
<title>ログイン</title>
</head>
<body>
<h2 id="mokuji_3">ログイン画面</h2><!-- ここに画像を追加 ★NoImageはあとで書き換え★ -->
<div class="position-relative text-center image-overlay mb-3">
<img src="/img/view/java-exception-introduce-03.jpg?1" class="img-fluid" alt="ログイン画面" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
<div class="overlay"></div>
<div class="position-absolute top-50 start-50 translate-middle text-white fw-bold img-overlay-text2">ログイン画面</div>
</div>
<form method="post" action="/login">
<label>ユーザー名:</label>
<input type="text" name="username">
<br>
<label>パスワード:</label>
<input type="password" name="password">
<br>
<label>
<input type="checkbox" name="remember-me"> ログイン状態を保持する
</label>
<br>
<button type="submit">ログイン</button>
</form>
</body>
</html>
3. ユーザー情報の管理と認証の仕組み
Spring Securityでは、ユーザー情報を管理するためにUserDetailsServiceを実装するのが一般的です。簡易的にはInMemoryUserDetailsManagerを使うことも可能です。
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
実際の業務では、データベースと連携して認証情報を取得することが多く、Spring Data JPAと組み合わせてUserDetailsを実装するクラスを作成します。
Spring FrameworkやThymeleafを使った Webアプリ開発の全体像をやさしく理解したい人には、 この入門書が定番です。
Spring Framework超入門をAmazonで見る※ Amazon広告リンク
4. Remember-Me機能のセキュリティ上の注意点
Remember-Me機能は便利ですが、セキュリティ面でのリスクもあります。特に以下の点に注意しましょう。
- Remember-Meトークンには
keyを指定し、予測困難な文字列を使う - トークンの有効期限は長すぎないようにする(例:1日=86400秒)
- ユーザーが意図せず自動ログインされないように、チェックボックスによる明示的な同意を求める
5. ログアウトの設定と実装方法
Spring Securityでは、/logoutへのアクセスで自動的にログアウト処理が行われます。セッションの無効化やクッキーの削除なども自動で処理されます。
ログアウト完了後にリダイレクトするURLをlogoutSuccessUrl()で設定できます。
ログアウトボタンのHTMLは以下のように記述します。
<form method="post" action="/logout">
<button type="submit">ログアウト</button>
</form>
6. Remember-Meのトークンをデータベースで管理するには?
Remember-Meのトークンをデータベースで管理したい場合は、PersistentTokenRepositoryを使います。これにより、サーバー側でトークン情報を管理できるため、安全性が向上します。
@Bean
public PersistentTokenRepository tokenRepository(DataSource dataSource) {
JdbcTokenRepositoryImpl repo = new JdbcTokenRepositoryImpl();
repo.setDataSource(dataSource);
return repo;
}
そして、rememberMe().tokenRepository(tokenRepository)を設定に追加します。
7. よくあるエラーとその対処法
Spring Securityを使ったフォームログインでは、以下のようなトラブルがよく発生します。
- ログインしてもすぐログアウトされる:Remember-Meの設定にミスがある、またはセッションが維持されていない可能性があります。
- ログインページに遷移しない:フォームの
actionやmethodの指定が正しくない、/loginが許可されていないなど。 - パスワードが平文で保存されている:
withDefaultPasswordEncoder()は開発用途のみ。本番ではBCryptなどを使用する。
まとめ
この記事では、Spring Securityを利用したフォームログインの基本構成を中心に、ログイン画面の作成方法、ユーザー認証の仕組み、Remember-Me機能の注意点、ログアウト処理の流れ、そしてデータベースを用いたトークン管理までを体系的に学びました。とくにSpring Securityは多機能で柔軟な設定が可能なため、適切なセキュリティ対策を施しながら運用しやすい構成を組み立てることが重要です。ログインフォームの設計ひとつ取っても、認証処理、エラーハンドリング、Remember-Meチェック、セッション管理など複数の視点で考慮しなければなりません。こうした点を踏まえながら、実践的なアプリケーションの構築に活かすことができます。 また、データベースを使ったRemember-Meトークンの保存は、より信頼性の高い認証管理を実現するための有効な手段です。トークンの更新や削除をサーバー側で管理することで、ユーザーが複数端末を利用する場合にも安全に自動ログインを提供できます。さらに、Spring Securityでよく発生するエラーについても触れたため、開発中のデバッグにも役立つ知識として整理できたはずです。 下記では、振り返りとして簡単なカスタム設定のサンプルコードを掲載しつつ、先生と生徒の会話形式で理解の深まりを確認します。
サンプルプログラム:振り返り用の基本設定例
@Configuration
@EnableWebSecurity
public class ReviewSecurityConfig {
@Bean
public SecurityFilterChain filter(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/login", "/public/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.defaultSuccessUrl("/dashboard", true)
)
.rememberMe(remember -> remember
.key("secureKeySample2025")
.tokenValiditySeconds(43200)
)
.logout(logout -> logout
.logoutUrl("/logout")
.logoutSuccessUrl("/login?completed")
);
return http.build();
}
}
先生と生徒の振り返り会話
生徒
「フォームログインの流れがだいぶ理解できました。特にログイン後の遷移やRemember-Meの挙動が明確になりました。」
先生
「よかったですね。Remember-Meは便利ですが、トークン管理を誤るとセキュリティ上のリスクにつながるため、今回学んだように予測しにくいキーを設定することが大切です。」
生徒
「ログアウト設定も簡単で驚きました。自動でセッションを無効化してくれるなら、かなり安心して使えます。」
先生
「その通りです。Spring Securityは標準で安全な仕組みが整っているので、基本を押さえておくと応用がとてもやりやすくなりますよ。」
生徒
「次はデータベース連携のUserDetailsServiceをもっと深く学びたいです!」
先生
「ぜひ取り組んでください。認証と権限制御の理解が深まると、より安全で拡張性の高いアプリケーションを作れるようになりますよ。」