Hello Spring Security
このセクションでは、Spring Security を Spring Boot で使用するための最小限のセットアップについて説明し、その後の次の手順を示します。
完成したスターターアプリケーションは、サンプルリポジトリ [GitHub] (英語) にあります。利便性のために、Spring Initializr によって準備された最小限の Spring Boot + Spring Security アプリケーションをダウンロードできます。 |
Hello Spring Security Boot の開始
クラスパスに Spring Security を指定すると、Spring Boot アプリケーションを実行できるようになります。次のスニペットは、アプリケーションで Spring Security が有効になっていることを示す出力の一部を示しています。
$ ./mvnw spring-boot:run
...
INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336
...
$ ./gradlew :bootRun
...
INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336
...
$ java -jar target/myapplication-0.0.1.jar
...
INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336
...
これで実行できるようになったため、エンドポイントにアクセスして何が起こるかを確認してみてください。次のように資格情報なしでエンドポイントに到達した場合:
$ curl -i http://localhost:8080/some/path
HTTP/1.1 401
...
その後、Spring Security は 401 Unauthorized
でアクセスを拒否します。
ブラウザーに同じ URL を指定すると、デフォルトのログインページにリダイレクトされます。 |
そして、次のように資格情報 (コンソール出力に表示される) を使用してエンドポイントにアクセスすると、次のようになります。
$ curl -i -u user:8e557245-73e2-4286-969a-ff57fe326336 http://localhost:8080/some/path
HTTP/1.1 404
...
この場合、/some/path
が存在しないため、Spring Boot がリクエストを処理し、404 Not Found
を返します。
ここから、次のことができます。
ランタイムの期待
Spring Boot と Spring Security のデフォルトの配置により、実行時に次の動作が可能になります。
どのエンドポイントにも認証されたユーザーが必要です (Boot の
/error
エンドポイントを含む)起動時にパスワードが生成されるデフォルトユーザーを登録します (パスワードはコンソールに記録されます。前の例では、パスワードは
8e557245-73e2-4286-969a-ff57fe326336
です。)BCrypt などを使用してパスワードストレージを保護します
フォームベースのログインと HTTP ベーシックを認証します
コンテンツネゴシエーションを提供します。Web リクエストの場合は、ログインページにリダイレクトされます。サービスリクエストの場合は、
401 Unauthorized
を返します。CSRF を軽減攻撃
HTTPS を保証する [Wikipedia] ために Strict-Transport-Security を書き込みます
スニッフィング攻撃 [OWASP] (英語) を軽減するために X-Content-Type-Options を書き込みます
認証されたリソースを保護するキャッシュ制御ヘッダーを書き込みます
クリックジャッキング [OWASP] (英語) を軽減するために X-Frame-Options を書き込みます
認証の成功イベントと失敗イベントを発行します。
これを達成するために Spring Boot が Spring Security とどのように連携しているかを理解すると役立ちます。Boot のセキュリティ自動構成 (Javadoc) を見ると、次のことが行われます (説明のために簡略化されています)。
@EnableWebSecurity (1)
@Configuration
public class DefaultSecurityConfig {
@Bean
@ConditionalOnMissingBean(UserDetailsService.class)
InMemoryUserDetailsManager inMemoryUserDetailsManager() { (2)
String generatedPassword = // ...;
return new InMemoryUserDetailsManager(User.withUsername("user")
.password(generatedPassword).roles("USER").build());
}
@Bean
@ConditionalOnMissingBean(AuthenticationEventPublisher.class)
DefaultAuthenticationEventPublisher defaultAuthenticationEventPublisher(ApplicationEventPublisher delegate) { (3)
return new DefaultAuthenticationEventPublisher(delegate);
}
}
@EnableWebSecurity
アノテーションを追加します。(特に、これは Spring Security のデフォルトFilter
チェーンを@Bean
として公開します。)ユーザー名
user
とランダムに生成されたパスワードを使用してUserDetailsService
@Bean
を発行し、コンソールに記録します。認証イベントを発行するための
AuthenticationEventPublisher
@Bean
を発行します
Spring Boot は、@Bean として公開された Filter をアプリケーションのフィルターチェーンに追加します。これは、@EnableWebSecurity を Spring Boot と組み合わせて使用すると、リクエストごとに Spring Security のフィルターチェーンが自動的に登録されることを意味します。 |
セキュリティの使用例
ここから行きたい場所がたくさんあります。あなたのアプリケーションにとって次に何が起こるかを理解するには、Spring Security が対処するために構築された次の一般的な使用例を考慮してください。
REST API を構築していますが、JWT またはその他のベアラートークンを認証する必要があります
Web アプリケーション、API ゲートウェイ、または BFF を構築しています
SAML 2.0 を使用してログインする必要があります
CAS を使用してログインする必要があります
管理する必要がある
LDAP または Active Directory、Spring Data、または JDBC のユーザー
探しているものにどれも一致しない場合は、次の順序でアプリケーションを検討することを検討してください。
プロトコル : まず、アプリケーションが通信に使用するプロトコルを検討します。サーブレットベースのアプリケーションの場合、Spring Security は Web ソケットだけでなく HTTP もサポートします。
認証 : 次に、ユーザーがどのように認証されるか、その認証がステートフルであるかステートレスであるかを検討します。
認可 : 次に、ユーザーに何を行う権限が与えられているかをどのように判断するかを検討します。
防衛 : 最後に、Spring Security のデフォルトの保護機能と統合し、必要な追加の保護機能を検討します。