Spring SecurityでCORSを使用した設定を行う方法を紹介します。
Spring Securityを導入することで、Springアプリケーションに手軽に認証・認可を仕組みを設定することができますが、認可の一環としてCORSの設定も行うことができます。
例えば、以下のような yaml
ファイルに記述したクライアントドメインを許可したいとします。
security: corsClientUrls: - http://localhost:3000 - http://localhost:8080
このとき、 CORSは WebSevurityConfigurerAdapter
派生Beanクラスを定義して設定します。
なお上記yamlファイル上のドメインは @ConfigurationProperties
アノテーションによって下記 SecurityConfig
プロパティとして読み込まれ、 corsClientUrls
に挿入されます。
@Configuration @EnableWebSecurity @ConfigurationProperties(prefix = "security") class SecurityConfig : WebSecurityConfigurerAdapter() { // 許可するドメイン lateinit var corsClientUrls: List<String> override fun configure(http: HttpSecurity?) { http // ... // 諸々の設定 // ... ?.and() ?.cors() ?.configurationSource(getCorsConfigurationSource()) //CORS設定 }
上記コードでは、まず認証・認可について設定する WebSecurityConfigurerAdapter
派生クラスを定義し、メソッド configuration
の引数 HttpSecurity
にCORSのルールを設定しています。
具体的には、 HttpSecurity::cors()
が CorsConfigurer
インスタンスを返し、この型が CorsConfigurer::configurationSource()
メソッドを持っているのですが、このメソッドに CorsConfigurationSource
インスタンスを渡してあげるとCORSについての設定をSpringのHTTPリクエスト・レスポンスに反映させることができます。
上記の例では、 getCorsConfigurationSource()
が CorsConfigurationSource
インスタンスを返していることになります。
では、その getCorsConfigurationSource()
の中身を見てみましょう。
/** * CORS設定 */ fun getCorsConfigurationSource(): CorsConfigurationSource { val corsConfiguration = CorsConfiguration() // ①CORSを許可するURLの登録(Access-Control-Allow-Origin) this.corsClientUrls.forEach { corsConfiguration.addAllowedOrigin(it) } // ②許可するHeaderの登録(Access-Control-Allow-Headers) corsConfiguration.addAllowedHeader(CorsConfiguration.ALL) // ③許可するMethodの登録(Access-Control-AllowMethods) corsConfiguration.addAllowedMethod(CorsConfiguration.ALL) // ④認証情報送信許可の登録(Access-Control-Allow-Credentials) corsConfiguration.allowCredentials = true val corsSource = UrlBasedCorsConfigurationSource() // どのパスに上記ルールを適用するか corsSource.registerCorsConfiguration("/**", corsConfiguration) return corsSource }
getCorsConfigurationSource()
では、HTTPレスポンスヘッダ設定を CorsConfiguration
インスタンスに詰めていき、
それを CorsConfigurationSource
インスタンスに持たせています(実際には UrlBased orsConfigurationSourceを使用しています
)。
上記コードでは、以下の4ヘッダーを設定しています。
①Access-Control-Allow-Origin: ... ②Access-Control-Allow-Headers: ... ③Access-Control-Allow-Methods: ... ④Access-Control-Allow-Credentials: ...
①にCORSを許可したいドメイン(オリジン)を、
②にCORS中で許可したいHTTPヘッダを、
③にCORS中で許可したいHTTPメソッドを、
④にCORS中での認証情報(BASIC認証情報やクッキーなど)の受け渡し許可有無を、
設定します。