【Spring BootでREST API】#4 CORSの設定

Web

今回の目標

前回はエラー処理の実装について説明しました。Exceptionを使い分けることによって適切なHttpステータスを送信するようにします。

【Spring BootでREST API】#3 エラー処理
今回は、前回作成したAPIに対してエラー処理を追加していきます。REST APIのエラー処理を行う場合は、Httpステータスを意識して適切なExceptionを投げる必要があります。そのあたりのことをザクっと説明していきます。

今回はCORSの設定について説明していきます。CORSについてはこの連載の#1で説明していますので、この記事では説明しません。

クライアントの実装

クライアント側の実装についてはカットします。この記事ではNuxt.js + axiosで実装したものの結果だけをお見せします。

とりあえず前回作成したAPIにアクセスでき、結果をみることができればどのようなものでもかまいません。重要なのは別のオリジンであることです。サンプルでは「http://localhost:3000」からAPIにアクセスします。

現段階の実装では、別のオリジンからAPIにアクセスすると次のようにCORSのエラーが発生します。

次から説明するCORSの設定を行うことで、別のオリジンからAPIにアクセスできるようにしましょう。

CORSの設定

Spring Bootには、CORSの設定方法は2種類あります。1つはアノテーションを用いて個別に設定する方法、もう1つは設定クラスを作成して全体に設定する方法です。

@CrossOrigin

まずは個別に設定する方法について説明します。Controllerクラス、またはControllerクラスのメソッドに対し、@CrossOriginを付与します。

@RestController
@RequestMapping("/api/product")
@CrossOrigin
public ProductController() {
  //...
}

クラスに付与した場合、ここで実装されているすべてのリソースは別オリジンからのアクセスが可能になります。特定のリソースのみ許可したい場合は、クラスではなく対象のメソッドに付与します。

@GetMapping
@CrossOrigin
public List<Product> getAll() {
  //...
}

しかし、このままだとすべてのオリジンからのアクセスを許可することになります。特定のオリジンのみ許可したい場合は次のように設定します。

@RestController
@RequestMapping("/api/product")
@CrossOrigin(origins = {"http://localhost:3000"})
public ProductController() {
  //...
}

WebMvcConfigurer

実際のところ、上記のように個別でCORSの設定をすることってないような気がします。なので全体に設定するほうが良いのかな?と思います。

全体にCORSの設定を行う場合は、WebMvcConfigurerを実装した設定クラスを作成します。CORSの設定については、以下のようにaddCorsMappingメソッドをオーバーライドします。

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
            .allowedOrigins("http://localhost:3000")
            .allowedMethods("GET", "POST", "PUT", "DELETE");
  }
}

addMappingメソッドにはCORSを許可する対象のパスを指定します。例ではすべてを許可していますが、「/api」以下を許可したい場合は「/api/**」と設定します。

allowedoriginsには許可するオリジンを設定します。

allowedMethodsには許可するHttpメソッドを設定します。これは設定しなかった場合、GET、POSTは許可されますが、PUT、DELETEは許可されません。そのため上記のように必要なものはすべて設定しておきます。

注意点として、CORSの設定は実装しているリソースにのみ設定されます。どういうことかというと、存在しないURIや実装していないHttpメソッドでアクセスした場合に、404や405といったHttpステータスは返ってこず、CORSのエラーになります。

あとがき

今回はCORSの設定について説明していきました。CORSについては最初はよくわからずに苦労しました…。

次回以降はSpring Securityについて説明していきます。実はSpring SecurityにもCORSの設定が別にあり、今回説明したCORSの設定は不要になります。

とはいえ、Spring Securityを導入しないケースも多いと思うので今回紹介したというわけです。

 

- Spring Bootのおすすめ書籍はコチラ -

コメント

タイトルとURLをコピーしました