春のCORS

春のCORS

1. 概要

最新のブラウザでは、Cross-Origin Resource Sharing(CORS)は、REST APIを介してデータを消費するHTML5およびJSクライアントの出現に関連する仕様です。

多くの場合、JSを提供するホスト(例: example.com)は、データを提供するホストとは異なります(例: api.example.com)。 このような場合、CORSはクロスドメイン通信を可能にします。

SpringはCORSにファーストクラスのsupportを提供し、SpringまたはSpring BootWebアプリケーションでそれを構成する簡単で強力な方法を提供します。

参考文献:

CORSプリフライトとSpring Securityで401を修正

CORSプリフライトリクエストのHTTPエラーステータス401を修正する方法を学ぶ

Spring WebfluxとCORS

CORSおよびSpring Webfluxを操作するための迅速かつ実用的なガイド。

2. コントローラ方式のCORS設定

CORSの有効化は簡単です–注釈@CrossOriginを追加するだけです。

これはさまざまな方法で実装できます。

2.1. @RequestMapping-注釈付きハンドラーメソッドの@CrossOrigin

@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin
    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

上記の例では、CORSはretrieve()メソッドに対してのみ有効になっています。 @CrossOriginアノテーションの構成を設定していないことがわかるため、デフォルトの構成が行われます。

  • すべての起源が許可されています

  • 許可されるHTTPメソッドは、@RequestMappingアノテーションで指定されたものです(この例ではGETです)

  • プリフライト応答がキャッシュされる時間(maxAge)は30分です

2.2. コントローラの@CrossOrigin

@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

@CrossOriginがコントローラーに追加されるため、retrieve()メソッドとremove()メソッドの両方で有効になります。 注釈属性(originsmethodsallowedHeadersexposedHeadersallowCredentials、またはmaxAge.)のいずれかの値を指定することにより、構成をカスタマイズできます。 s

2.3. @CrossOrigin on コントローラーとハンドラーのメソッド

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin("http://example.com")
    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

Springは両方の注釈の属性を組み合わせて、マージされたCORS構成を作成します。

この例では、両方のメソッドのmaxAgeは3600秒で、メソッドremove()はすべてのオリジンを許可しますが、メソッドretrieve()http://example.com.からのオリジンのみを許可します

3. グローバルCORS設定

きめ細かい注釈ベースの構成に代わるものとして、SpringではコントローラーからグローバルなCORS構成を定義できます。 これは、Filterベースのソリューションの使用に似ていますが、Spring MVC内で宣言し、きめ細かい@CrossOrigin構成と組み合わせることができます。

デフォルトでは、すべてのオリジンとGET、HEAD、およびPOSTメソッドが許可されています。

3.1. JavaConfig

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

上記の例では、任意のオリジンからアプリケーションの任意のエンドポイントへのCORS要求を有効にします。

これをもう少しロックダウンしたい場合は、registry.addMappingメソッドがCorsRegistrationオブジェクトを返します。これは、追加の構成に使用できます。 許可された起点の配列を指定するために使用できるallowedOriginsメソッドもあります。 これは、実行時に外部配列からこの配列をロードする必要がある場合に役立ちます。

さらに、allowedMethodsallowedHeadersexposedHeadersmaxAge、およびallowCredentialsもあり、これらを使用して応答ヘッダーを設定し、より多くのカスタマイズオプションを提供できます。 。

3.2. XML名前空間

この最小限のXML構成により、JavaConfigと同じデフォルトプロパティを使用して/**パスパターンでCORSが有効になります。


    

カスタマイズされたプロパティでいくつかのCORSマッピングを宣言することもできます。



    

    

4. 使い方

CORSリクエストは、登録されているさまざまなHandlerMappingsに自動的にディスパッチされます。 関連するCORS応答ヘッダー(Access-Control-Allow-Originなど)を追加するために、CORSプリフライトリクエストを処理し、CorsProcessor実装(デフォルトではDefaultCorsProcessor)を使用してCORSの単純なリクエストと実際のリクエストをインターセプトします。

CorsConfigurationを使用すると、CORSリクエストの処理方法(許可されたオリジン、ヘッダー、メソッドなど)を指定できます。 これはさまざまな方法で提供されます。

  • AbstractHandlerMapping#setCorsConfiguration()を使用すると、/api/**などのパスパターンにマップされた複数のCorsConfigurationsを使用してMapを指定できます。

  • サブクラスは、AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)メソッドをオーバーライドすることにより、独自のCorsConfigurationを提供できます。

  • ハンドラーは、各要求にCorsConfigurationを提供するために、(ResourceHttpRequestHandlerが現在実装しているように)CorsConfigurationSourceインターフェースを実装できます。

5. 結論

この記事では、SpringがアプリケーションでCORSを有効にするためのサポートを提供する方法を示しました。

コントローラーの構成から始めました。 1つの特定のメソッドまたはコントローラー全体のいずれかでCORSを有効にするには、アノテーション@CrossOriginを追加するだけでよいことがわかりました。

最後に、コントローラーの外部でCORS構成を制御する場合、JavaConfigまたはXMLを使用して、構成ファイルでこれを簡単に実行できることもわかりました。

例の完全なソースコードは、over on GitHubで入手できます。