Spring SecurityでCSRFの設定を行う




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でアプリケーション開発をしたい方の最初に読む一冊としておすすめします。対象は初心者だけでなく上級者まで幅広く学べるので是非読んでみてください!

 

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です