Spring Securityを導入する方法(starterの追加)
新人
「セキュリティって何となく必要そうですけど、具体的にどうやってSpringに組み込むんですか?」
先輩
「それなら、まずはSpring Securityのstarterを導入してみようか。Gradleなら依存関係を追加するだけで簡単に始められるよ。」
新人
「starterって何ですか?どうしてそれを追加する必要があるんですか?」
先輩
「それは良いポイントだね。ではまず、Spring Securityとは何かから説明しよう!」
1. Spring Securityとは何か(基本的な役割)
Spring Securityとは、Webアプリケーションを保護するためのセキュリティフレームワークです。認証(ログイン)や認可(アクセス制限)といった、セキュリティに必要な仕組みを簡単に導入できるようになります。
たとえば、「ログインしていないユーザーはページにアクセスできないようにしたい」「管理者だけが使えるページを用意したい」「偽のリクエストを防ぎたい」といった要件があるとき、Spring Securityを使えば、面倒なロジックを一から書かなくても実現できます。
検索でよく使われるキーワードとしては「Spring Securityとは」「Spring Security 入門」などがあり、初心者が最初に学ぶべきセキュリティ技術として広く紹介されています。
また、Spring SecurityはSpring Bootと連携がよく、starterの追加によって自動的にセキュリティ機能が組み込まれます。これは「セキュリティ機能を後付けで追加する」のではなく、「最初からセキュリティを含めて設計する」スタイルになります。
こうした理由から、Webアプリ開発におけるセキュリティ対策の基本として、Spring Securityは非常に重要なライブラリなのです。
2. なぜSpring Securityを導入すべきなのか(必要性と背景)
Webアプリケーションは、外部から誰でもアクセスできるため、常にさまざまな攻撃にさらされています。とくに最近では、パスワードの総当たり攻撃、不正ログイン、セッションの乗っ取りなど、開発者が意図しない動作を狙った攻撃が増えています。
こうした攻撃を未然に防ぐには、次のような仕組みが必要です。
- ログイン画面による認証処理
- ログイン後のアクセス制限(認可)
- CSRF対策(クロスサイトリクエストフォージェリ)
- セッション管理(自動ログアウトやタイムアウト処理)
これらをすべて自作するのは非常に大変ですが、Spring Securityなら、最小限の設定で実現できるのが大きなメリットです。
そして、導入はとても簡単です。Gradleを使っている場合は、下記のようにstarter依存関係をbuild.gradleに追加するだけで、すぐにSpring Securityを利用できます。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
}
このstarterを追加してアプリを起動すると、自動的にログイン画面が表示されるようになります。これがSpring BootとSpring Securityの連携の強みです。
また、初回起動時にはコンソールに自動生成されたパスワードが表示されるため、それを使ってログインする仕組みになっています。
Using generated security password: 8b3f6b2d-df12-4f7f-91d1-07bc6fe94563
このログイン画面は、ログインしていないユーザーを保護するためのもので、セキュリティ設定を追加する前から最低限の保護が自動で有効になるのです。
つまり、セキュリティを意識していなくても、Spring Securityを導入するだけで、ログイン機能やCSRF保護が初期状態で有効になるため、安全なアプリ開発の第一歩となります。
逆に、セキュリティを導入せずにWebアプリを公開してしまうと、以下のようなリスクが発生します。
- ログインしていないのに管理者ページが見えてしまう
- 誰でもデータを操作できるAPIにアクセスされてしまう
- フォームを悪用されて、不正なリクエストが送信されてしまう
こうした事態を避けるためにも、まずはspring-boot-starter-securityを導入して、安全な開発のスタートを切りましょう。
3. Spring Securityの導入手順(Gradle環境・pleiadesでの操作)
ここでは、pleiades環境でSpring Security starterを導入するための手順を具体的に解説します。Gradleプロジェクトを作成している前提で進めます。
まず、pleiadesを起動し、メニューから[ファイル] → [新規] → [Spring スターター・プロジェクト]を選択します。テンプレートのウィザードが表示されますので、以下のように入力してください。
- プロジェクト名:spring-security-sample
- 種類:Gradle - Groovy
- Javaバージョン:17(もしくは使用中のJDK)
- パッケージ名:com.example.security
次に、依存関係の選択画面で「Spring Security」にチェックを入れてください。これは後ほど手動でbuild.gradleに記述する方法でも対応可能ですが、pleiadesのUIから追加すると簡単です。
プロジェクトの作成が完了したら、プロジェクトエクスプローラーからbuild.gradleを開いて、セキュリティのstarterが正しく追加されているか確認しましょう。
4. build.gradleへのstarter追加方法と注意点
「Spring Security Gradle」というキーワードで検索すると、多くのサンプルが出てきますが、ここではspring-boot-starter-securityをGradleに追加する方法と注意点を解説します。
もし手動で追加する場合は、以下のようにbuild.gradleファイルに記述します。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
}
依存関係を追加したら、右クリックで「Gradle」→「Gradleプロジェクトのリフレッシュ」を行いましょう。この操作でGradleがライブラリを取得し、プロジェクトに反映されます。
注意点として、バージョン競合が起きないように、spring-boot-starter-webやspring-boot-starter-thymeleafなど、他のstarterと整合性の取れたバージョンで設定する必要があります。
また、@Controllerを使用するWebアプリの場合、Thymeleafテンプレートとの連携も考慮されているため、ログインページやエラー画面をカスタマイズする際にもSpring Securityとの相性が良いです。
一方で、@RestControllerを使ったAPI開発の場合は異なる設定が必要になるため、この記事ではあくまで@Controller前提での構成に限定して説明します。
starterの追加により、認証処理やセキュリティフィルターがプロジェクトに組み込まれるため、自分で複雑な設定を書く必要がなくなるという利点があります。
5. starter追加後に自動的に追加されるセキュリティ設定の概要
spring-boot-starter-securityを追加してアプリを起動すると、Spring Bootが自動で以下のようなセキュリティ機能を適用します。
- 全てのHTTPリクエストに対する認証の要求
- フォームベースのログイン画面の自動表示
- ログアウト処理の自動化
- CSRF保護機能の有効化
- 自動生成されたユーザーパスワードのログ出力
たとえば、ブラウザでhttp://localhost:8080/にアクセスすると、以下のようなログイン画面が表示されます。
これは、Spring Securityが自動的に提供するフォーム画面で、ログインしていないユーザーのアクセスをブロックする仕組みになっています。
起動時のコンソールには、下記のように自動生成されたログインパスワードが出力されます。
Using generated security password: 1a2b3c4d-5678-90ef-gh12-3456ijkl7890
このパスワードを使って、初回ログインが可能です。
なお、ユーザー名は初期状態では「user」に固定されており、これは設定を追加することで変更可能ですが、導入直後はそのまま使用することで動作確認ができます。
また、未認証の状態で@Controllerのアクションにアクセスしようとすると、自動的にログイン画面へリダイレクトされるようになります。これにより、開発者が明示的に「未認証ユーザーを弾く」コードを書く必要がありません。
この自動設定は、Spring Securityの「デフォルト構成」として提供されているため、初心者でも安全なセキュリティ環境を素早く構築できるという大きな特徴があります。
また、CSRF保護も自動で有効になっており、フォームからのPOSTリクエストには自動でトークンが挿入され、トークンが一致しないとエラーになるように設計されています。
このように、「Spring Security starter 追加」という操作だけで、セキュリティの基本機能がすぐに使えるのは、初心者にとって非常にありがたいポイントです。
6. Spring Security starter追加後にログイン画面が表示される理由
Spring Security starterをGradleで追加すると、特別な設定をしなくても自動ログイン画面が表示されるようになります。これはSpring Bootの自動構成機能(AutoConfiguration)によるもので、spring-boot-starter-securityが依存関係に含まれている場合、アプリケーションの起動時にデフォルトのセキュリティ設定が自動で組み込まれます。
この仕組みによって、すべてのリクエストに対して認証が必要という状態になります。そのため、ブラウザでhttp://localhost:8080/にアクセスしても、ログインしていないユーザーは直接画面を見ることができず、Spring Securityが提供するログインフォームにリダイレクトされます。
このログインフォームは、HTMLやCSSを使って自動的に生成されるもので、初心者でもすぐにログイン処理の仕組みを体験できます。ユーザー名は「user」、パスワードはアプリ起動時にコンソールに表示されるランダムな文字列が使われます。
このように、starterの追加だけでログイン機能が即座に有効になるのは、Spring BootとSpring Securityの大きな魅力です。「Spring Security 自動ログイン画面」というキーワードで検索すると、同様の挙動を確認している開発者の事例が多数見つかります。
7. @Controllerで構成されたアプリに影響する点(認証が必要になるなど)
Spring Securityを導入すると、@Controllerで構成されたWebアプリにも自動的に認証の仕組みが適用されます。つまり、全てのページにアクセスするためにログインが必要となります。
たとえば、以下のようなControllerを用意していたとしましょう。
@Controller
public class HomeController {
@GetMapping("/")
public String index() {
return "index";
}
@GetMapping("/about")
public String about() {
return "about";
}
}
このようにシンプルな構成でも、Spring Security starterが追加されていると、/や/aboutといったURLにアクセスする前に、必ずログイン画面が表示されるようになります。
これはセキュリティの観点では非常に重要で、未認証のユーザーが自由にページにアクセスすることを防ぐ効果があります。
ただし、開発初期段階でログインを毎回行うのは面倒に感じるかもしれません。そうした場合には、セキュリティ設定クラスを作成し、特定のページにはpermitAllでアクセスを許可することが可能です。
8. 最低限必要なセキュリティ設定(permitAllなどの導入前後比較)
開発の初期段階や、ログイン不要の画面を作りたい場合には、セキュリティ設定でpermitAllを使うことで対応できます。この設定により、特定のURLだけはログインせずに表示できるようになります。
以下は、「トップページだけは誰でも見られるようにし、それ以外はログインが必要」とする最低限の設定例です。
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/").permitAll()
.anyRequest().authenticated()
)
.formLogin(withDefaults());
return http.build();
}
}
このように設定することで、トップページ(/)は未認証でもアクセス可能になりますが、他のページ(たとえば/aboutや/userなど)はログインが必要になります。
このpermitAll 設定例 Spring Securityは、多くの開発現場で活用されている基本パターンであり、柔軟なセキュリティ制御が可能です。
また、全ページを一時的に無制限にしたい場合は、以下のようにanyRequest().permitAll()を使うこともできます。
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.anyRequest().permitAll()
)
.formLogin(withDefaults());
return http.build();
}
}
ただし、これでは全てのリクエストを認証不要とするため、セキュリティとしては無効化された状態となります。本番環境では必ず適切な制御を加える必要があります。
このように、Spring Security starterを追加するだけで、初期状態ではすべてのアクセスが保護される状態になります。そして、permitAllやauthenticated、anyRequestなどを使うことで、アクセス制御の詳細なカスタマイズが可能になります。
これらの設定はすべてJavaコードで書かれるため、XMLなどの設定ファイルを使う必要はありません。また、設定を変更したらアプリを再起動するだけで反映されるため、開発時の試行錯誤も行いやすくなっています。