将来を見据えたウェブ・アプリケーションの構築:The Codestのエキスパート・チームによる洞察
The Codestが、最先端技術を駆使してスケーラブルでインタラクティブなウェブアプリケーションを作成し、あらゆるプラットフォームでシームレスなユーザー体験を提供することにどのように秀でているかをご覧ください。The Codestの専門知識がどのようにデジタルトランスフォーメーションとビジネス...
経験豊富な開発者にとっては、この文章はまったく驚くべきことではないかもしれませんが、RailsのCORSセットアップについて私が読んだ多くの記事では、「rack-corsを使用する」「どのホストでもAPIにアクセスできるようにする」「(オプションで)本番環境では(どのホストでも許可するのとは)別のことを検討する必要がある」といったようなことが書かれていたと思います。
提案された コード は常に下に近かった:
config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
許可する
オリジン ''
リソース '', ヘッダ: :any, メソッド: :any
end
end
そして残念なことに、これらのテキストはプロダクションで実際に何をすべきかをほとんど説明してくれなかった。
コピーペーストはかなりOKです(私はときどき冗談で、企業はStack Overflowのコピー・パスターを雇うことができるのではないかと思うことがある。)、「コピー」と「ペースト」の間に「考えて調整する」瞬間がある限り。そこで、ここでやっていること、そしてそれが実際にどのように機能するのか、少し詳しく説明したいと思う。
オナー理論の簡単な紹介から始めて、Railsの例題に移っても構わないだろうか。
最初から始めよう。説明しやすくするために、序章を3つのパートに分けた。最初のパートでは、原点とは何か、つまりここで議論していることの重要な用語について概説します。2つ目はSOPについての簡単な説明です。そして最後のパートは CORS
そのものだ。
MDN Web Docsによると
- ウェブコンテンツのオリジンは、アクセスに使われるURLのスキーム(プロトコル)、ホスト(ドメイン)、ポートによって定義される。2つのオブジェクトが同じオリジンを持つのは、スキーム、ホスト、ポートがすべて一致する場合だけです (ソース)
それはかなり明確なようですね?念のため、MDNから2つの例を分析してみよう。
http://example.com/app1/index.html
, http://example.com/app2/index.html
上の2つは同じ起源だからだ:
http://www.example.com
, http://myapp.example.com
この2つは、ドメイン(www.example.com
, myapp.example.com
)は異なる。
十分理解できたと思う。そうでない場合は、MDN Web Docsでより多くの例をご覧ください。
MDN Web Docsによると(ソース):
- 同一オリジン・ポリシーは、あるオリジンからロードされたドキュメントやスクリプトが、他のオリジンのリソースとどのように相互作用するかを制限する重要なセキュリティ・メカニズムです。潜在的に悪意のあるドキュメントを隔離し、攻撃ベクトルを減らすのに役立ちます。
- クロスオリジンの書き込みは通常許可されています。例としては、リンク、リダイレクト、フォーム送信などがあります。
- 通常、クロスオリジン埋め込みは許可されている。
- クロスオリジンリードは通常禁止されているが、埋め込みによってリードアクセスが漏れることはよくある。
用途 CORS
クロスオリジンアクセスを許可する
まあ、おわかりのように、SOPの定義にはオリジンを超えた行動に関するものが多い。それでもいい。私たちが今知っておくべきことは、同じオリジンにはより多くの権限があり、CORSを使うことでクロスオリジンのルールを緩めることができるということだ。そして、ここで次のセクションが登場する。
MDNの言葉に基づいている:
それでもまだ十分ではない。そこで明言されなかったのは、以下のヘッダーを使用する際に最も重要なことだ。 CORS
は アクセス制御-許可-オリジン
:
アクセス制御-許可-オリジン
レスポンスヘッダは、指定されたオリジン(ソース).まあ、これで終わりだろう。実生活では CORS
通常、次のように設定します。 ACAO
ヘッダーが先だ。
定義については以上です。Railsと実例に戻りましょう。
私たちは(言われたように)間違いなくラックコールを使う。最初のスニペット(他の記事で最も多く提供されているもの)を思い出してみよう:
config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
許可する
オリジン ''
リソース '', ヘッダ: :any, メソッド: :any
end
end
選択肢は膨大、いや無限だが、この2つを考えてみよう:
最初の選択肢に直面した場合、おそらく次のようになるだろう。 出自
他の人があなたのAPIの上にクライアントを構築することを望んでいて、その人が誰なのか知らないんでしょう?
もしあなたが後者を開発しているのであれば、APIへのクロスオリジン・リクエストを皆にさせたくないはずだ。むしろそうしたいはずだ:
言われたように)ラックコールを使うことに変わりはない。
ENV変数を2つ使ってみよう: 許可されたオリジン
リテラルなオリジン定義(アスタリスクまたは実際のURL)には allowed_origin_regexps
パターンのために。
config/initializers/cors.rb
frozenstringliteral: true
toregexp = ->(string) { Regexp.new(string) }.
hosts = [
*ENV.fetch('ALLOWEDORIGINS').split(',')、
*ENV.fetch('ALLOWEDORIGINREGEXPS').split(';').map(&to_regexp)
]
Rails.application.config.middleware.insert_before 0, Rack::Cors do
許可する
オリジン(*hosts)
リソース '*'、
methods: %i[get post put patch delete options head]、
ヘッダ: :any
終了
エンド
これにより、開発環境、ステージング環境、本番環境で適切な値を定義するのに十分な柔軟性が得られるはずだ。
以上、要点をまとめてみよう:
CORS
,以上です。良い一日を 🙂。
続きを読む