CSRFとは
クロスサイトリクエストフォージェリの略でWEBアプリーケションの脆弱性の一つです。
Webアプリケーションが全く関係のないWEBサイトからのリクエストを受け付けてそのまま更新処理をしてしまうことをいいます。
Spring SecurityでのCSRF対策方法
Spring Securityを使うとログイン、CSRF、CORSなどの設定が簡単にできます。
インストール
gradleでインストールする場合は下記をbuild.gradleに追加するだけです。
dependencies { compile('org.springframework.boot:spring-boot-starter-security') }
CSRF対策
CSRFの設定はこれだけです。ignoringAntMatchers()はCSRFを対象外としたいパスを設定できます。本当はログイン処理もCSRFした方がいいです。
withHttpOnlyFalse()はCookieのHttpOnlyをfalseにしてJavascriptからCookieを扱うことができるようになります。setCookiePath()を使うとCookieのPath属性を指定することができます。
参考記事:CookieのDomain、Path、Secure、HttpOnly、max-age(expire)属性の設定
@EnableWebSecurity class SecurityConfig : WebSecurityConfigurerAdapter() { override fun configure(http: HttpSecurity) { // CSRF設定 http.csrf() .csrfTokenRepository(getCsrfTokenRepository()) .ignoringAntMatchers("/login") } /** * CSRFトークン用のCookie設定 * * @return CSRFトークン用のCookie設定 */ private fun getCsrfTokenRepository(): CsrfTokenRepository { // Javascriptから取得できるようにHttponlyをfalseにする val tokenRepository: CookieCsrfTokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse() // pathを/にすることでクライアントから読み取れるようにする tokenRepository.setCookiePath("/") return tokenRepository } }
注意点としてセッションストアの設定もしておいてください。CSRFのトークン情報がセッションとして保存されるのでRedisを使うのがいいかと思います。
configureRedisAction()はElastiCacheのRedsiを使う時に必要になります。
package com.sample.config import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.data.redis.connection.jedis.JedisConnectionFactory import org.springframework.session.data.redis.config.ConfigureRedisAction import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession @Configuration @ConfigurationProperties(prefix = "spring.datasource.redis") @EnableRedisHttpSession class HttpSessionConfig { var host: String = "" var port: Int = 0 @Bean fun connectionFactory(): JedisConnectionFactory { val factory = JedisConnectionFactory() factory.hostName = host factory.port = port return factory } @Bean fun configureRedisAction(): ConfigureRedisAction { return ConfigureRedisAction.NO_OP; } }
CSRFトークンの確認と送信
CSRFトークンはCookieにXSRF-TOKENという名前で入っています。
これをX-CSRF-TOKENというヘッダーにいれてPOST時に一緒に送ってあげるとPOSTが実行できるようになります。

まとめ
- Spring Securityを使うとCSRF対策が簡単に対応できる
- トークンはCookieに入って送られて来るのでそれをPOST時にヘッダーでいれて返してあげる
Spring Securityは他にもCORS設定、認証設定が簡単にできるのでおすすめです。
関連記事:Spring SecurityでCORSの設定を行う
おすすめ書籍
JPAに関して体系的に学べる良い書籍だと思います。良くあるSpring系書籍ですとJPAは少ししか紹介がありませんが丸々一冊JPAに関してなので詳細な解説がされています。内容はJPAと他のORMとの比較から始まりセットアップ、実装の仕方まで幅広く網羅されています。これからJPAで開発を初めてみようかなと考えている方は一読することをオススメします!
Springの概要からインストール方法、各コア機能(Security, Sessionなど)の解説が体系的にまとめられています。2018年に出版されたばかりなので情報も新しいです。これからSpring Bootでアプリケーション開発をしたい方の最初に読む一冊としておすすめします。対象は初心者だけでなく上級者まで幅広く学べるので是非読んでみてください!
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す