前回までで、トランザクション管理により、業務処理の信頼性を確保しました。しかし、どれだけデータが正確でも、不正アクセスや情報漏洩を防げなければ、システムは成立しません。
今回からは、Webアプリケーション開発で最も重要かつ必須のテーマであるセキュリティに進みます。Spring Bootで標準的に使われるSpring Securityの導入方法と、セキュリティの基本概念である「認証」について学びます。
1. Webアプリケーションセキュリティの基本概念
Webアプリケーションのセキュリティ対策は、大きく分けて2つのフェーズがあります。
1-1. 認証 (Authentication)
認証とは、「アクセスしてきたユーザーが誰であるか」を確認するプロセスです。
- 例: ログイン画面で、ユーザーが入力したIDとパスワードがデータベースに登録されている情報と一致するかを照合する。
1-2. 認可 (Authorization)
認可とは、「認証されたユーザーが、特定のリソース(ページや機能)へのアクセス権限を持っているか」を確認するプロセスです。
- 例: ユーザーが「一般社員」であれば、管理者専用の売上データページへのアクセスを拒否する。
Spring Securityは、この認証と認可の機能を、アプリケーションに簡単に組み込むための強力なフレームワークです。
2. Spring Securityの導入と自動設定
Spring BootプロジェクトにSpring Securityを導入するのは非常に簡単です。
2-1. 依存関係の追加
プロジェクトの $\text{build.gradle}$ (または $\text{pom.xml}$) に、spring-boot-starter-security を追加するだけです。
Groovy
dependencies {
// Webアプリケーションの基本
implementation 'org.springframework.boot:spring-boot-starter-web'
// Spring Securityのスターターを追加
implementation 'org.springframework.boot:spring-boot-starter-security'
// ... その他の依存関係
}
2-2. 導入後の自動的な動作
この依存関係を追加してサーバーを再起動すると、Spring BootのAuto-Configuration(自動構成)により、以下の動作が自動で有効になります。
- 全てのURLへのアクセス制限: アプリケーション内の全てのURLに対して、ログイン(認証)を要求するようになります。
- 自動生成されたパスワード: アプリケーション起動時に、コンソールに一時的なランダムなパスワードが出力されます。
- デフォルトのログイン画面: カスタムのログイン画面を定義していない場合、Spring Securityが用意した標準のログイン画面が表示されるようになります。
3. デフォルト設定のカスタマイズ(SecurityConfig)
業務システムでは、独自の認証ロジックやアクセスルールが必要です。そのため、Spring Securityの設定をカスタマイズするための設定クラスを作成します。
@Configuration と @EnableWebSecurity を使用したクラスを作成し、SecurityFilterChain というBeanを定義するのが、現在のSpring Securityの標準的な設定方法です。
Java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity // Security機能を有効にする
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
// 1. URLごとのアクセスルールを設定(認可)
.authorizeHttpRequests(authorize -> authorize
// /public/ から始まるURLは認証不要で許可
.requestMatchers("/public/**").permitAll()
// /admin/ から始まるURLは ADMIN権限を持つユーザーのみ許可
.requestMatchers("/admin/**").hasRole("ADMIN")
// それ以外の全てのURLは認証が必要
.anyRequest().authenticated()
)
// 2. 認証方式の設定
.formLogin(login -> login
// ログインページを /login に設定(デフォルトの画面ではなくなる)
.loginPage("/login").permitAll()
// ログイン成功後の遷移先
.defaultSuccessUrl("/", true)
)
// 3. その他の設定(CSRF対策など)
.csrf(csrf -> csrf.disable()); // CSRF対策は一旦無効化(次回以降で詳述)
return http.build();
}
}
この設定により、「/public/ は誰でもアクセス可」「/admin/ は管理者のみアクセス可」といった認可ルールと、「ログイン画面は /login を使う」といった認証ルールが適用されます。
4. まとめ:認証と認可の分離
Spring Securityの導入により、アプリケーションは堅牢なセキュリティ機能を備えます。重要なのは、認証(誰であるか)と認可(何ができるか)の概念を分けて設計することです。
次回は、認証のプロセスをさらに掘り下げ、ユーザー情報をDBから取得して照合するロジック(UserDetailsとUserDetailsService)の実装方法を具体的に学びます。
✅ 本日のまとめ
- 認証(Authentication)はユーザーの本人確認、認可(Authorization)はユーザーの権限確認である。
spring-boot-starter-securityを追加するだけで、全てのURLが認証必須となるデフォルト設定が有効になる。@Configurationと@EnableWebSecurityを使った設定クラスを作成し、SecurityFilterChainBeanを定義することで、アクセスルールや認証方法をカスタマイズする。.authorizeHttpRequests()でURLごとのアクセス権限(.permitAll(),.hasRole())を設定する。
🔔 次回予告
次回は、Spring Securityがどのようにしてユーザーのパスワードを検証し、セッションを管理するかを学びます。特に、ユーザー情報をDBから取得してSpring Securityに渡すための UserDetailsService の実装に焦点を当てます。
次回:【第29回】認証の実装(UserDetailsServiceとPasswordEncoder) にご期待ください!


コメント