🛡️ Spring Framework 講座【第28回】システムを犯罪から守る!〜セキュリティの基本とSpring Securityの導入〜

docs

前回までで、トランザクション管理により、業務処理の信頼性を確保しました。しかし、どれだけデータが正確でも、不正アクセスや情報漏洩を防げなければ、システムは成立しません。

今回からは、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(自動構成)により、以下の動作が自動で有効になります。

  1. 全てのURLへのアクセス制限: アプリケーション内の全てのURLに対して、ログイン(認証)を要求するようになります。
  2. 自動生成されたパスワード: アプリケーション起動時に、コンソールに一時的なランダムなパスワードが出力されます。
  3. デフォルトのログイン画面: カスタムのログイン画面を定義していない場合、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から取得して照合するロジック(UserDetailsUserDetailsService)の実装方法を具体的に学びます。


✅ 本日のまとめ

  • 認証(Authentication)はユーザーの本人確認、認可(Authorization)はユーザーの権限確認である。
  • spring-boot-starter-security を追加するだけで、全てのURLが認証必須となるデフォルト設定が有効になる。
  • @Configuration@EnableWebSecurity を使った設定クラスを作成し、SecurityFilterChain Beanを定義することで、アクセスルールや認証方法をカスタマイズする。
  • .authorizeHttpRequests() でURLごとのアクセス権限(.permitAll(), .hasRole())を設定する。

🔔 次回予告

次回は、Spring Securityがどのようにしてユーザーのパスワードを検証し、セッションを管理するかを学びます。特に、ユーザー情報をDBから取得してSpring Securityに渡すための UserDetailsService の実装に焦点を当てます。

次回:【第29回】認証の実装(UserDetailsServiceとPasswordEncoder) にご期待ください!

コメント

タイトルとURLをコピーしました