Skip to main content

4.CORS

Rails を API サーバとして使うためにはどのようなどのようなところからでもアクセスを認める必要がある。 一般に web サーバーは同一オリジンからのアクセスのみ許可している。

オリジン

オリジンとは、URL のスキーム・ホスト・ポートの3つの組み合わせの事をさす。

http://www.exsample.com:80/index.htmlという URL を例にすると、

  • スキーム: http
  • ホスト: www.exsample.com
  • ポート: 80 (ポート番号は省略可)

この 3 つがすべてが一致したときのみ同じオリジンと言う。

CORS とは

CORS は Cross Origin Resource Sharing の略である。

Web ブラウザは、HTML や画像、フォントなどを取得するための多くのリクエストを web サーバに送信する。 web サーバーは一般にオリジンの制限をすることで、リクエストをフィルターし、セキュリティを高めている。 ネットから大量に送られてくるリクエストを、チェックせずにリソースを送り返すのはセキュリティ上大きなリスクとなりうる。 リクエストが正当なものかどうかをチェックするための仕組み(セキュリティーポリシー)が「同一生成元ポリシー(Same-Origin Policy)」である。

「同一生成元ポリシー(Same-Origin Policy)」を使うことで、異なるオリジンからのリソースへのアクセスに制限をかけることができる。 あるページを開いたときに関連するリソースを、同じオリジンからしか取得しない様にしている。 結果的に、クロスサイトリクエストフォージェリ(CSRF)などのセキュリティリスクを防ぐことができる。

ところが、API サーバーを運営するときはアクセスもとが同一オリジンとは限らなくなる。 CORS はこの制限を一部解除し、異なるオリジン間でリソースを共有できるようにするための仕組みである。 Rails ではrack-corsGem を利用してそれらのアクセスを管理し、基本的にはどこからでもアクセスできるようにする。

Rack-Cors

Gemfileを開きrack-corsの記述をコメントインする。

gem 'rack-cors'

bundle installする。

bundle install

config/initializers/cors.rbを開き、コメントアウトされている箇所をコメントインして修正する。

Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'

resource '*',
headers: :any,
methods: [:get, :post, :put, :patch, :delete, :options, :head]
end
end

origins "*"は、どのオリジンからのリクエストも受け付ける設定である。 今はとりあえず設定しているが、一般に開発環境のドメインと本番環境のドメインを2つ指定して利用する。

origins 'localhost:3000','https://www.sample.com'

Cors の詳しい解説はこちら

https://qiita.com/mtoyopet/items/326ba62d485e9ef0dacd

以上で Cors の設定は完了

git add .
git commit -m "Setup Cors"