Precena Tech Book
コーポレートサイト採用サイト
  • はじめに
  • ソフトウェア開発
    • 開発環境構築
      • Homebrew
        • Homebrew用語の意味
      • ngrok
        • ngrokの導入
        • ngrokのアップグレード(v2 to v3)
      • Slack
        • Slackの/remind コマンドの形式
        • 対面での相談を気軽にするためのSlack設定
      • AWS CLI
      • Ruby
      • Scala
      • Prettier
      • zsh
        • zsh-completion
      • Mac
        • M1 Macでの開発環境構築(rosetta 無し)
    • バックエンド
      • OpenAPI
        • OpenAPI 定義ファイル分割のすゝめ
      • Ruby on Rails
        • ActiveRecordのfind_or_initialize_byメソッドにブロックを渡したときの挙動
        • Railsのアプリケーションサーバーのプロセス数とスレッド数の設定方法
        • Railsを6.1系から7.0系へアップグレードした時に調査したこと
        • schema.rbで差分が発生する事例とその復旧について
        • tmux + overmind を利用して、複数システムを1コマンドで起動できるよう設定する
        • Rails Migrationチートシート
        • GithubのプライベートリポジトリをGemfileで参照する方法
        • ActiveSupportのto_jsonメソッドの注意点
        • 危険なJSON出力を禁止するRuboCopカスタムルールの作成方法
      • Scala
        • Validated を直列に処理したい
      • DB
        • PostgreSQLにおける、削除行に対するロック獲得時の挙動
    • フロントエンド
      • React
        • Storybookを利用したビジュアルリグレッションテスト
  • インフラ開発
    • AWS
      • IAM
        • スイッチロールの設定手順
        • AWS CLIでのスイッチロールの設定手順
        • AWS Vaultを使ったスイッチロール設定手順
        • Github ActionsでIAMロールを利用してAWSリソースを操作する
      • ECS
      • SES
        • AWS SESメールボックスシミュレーターにて、カスタムヘッダや添付ファイル付きのテストEメールを送信する
      • CloudWatch
        • Amazon SNS + Slack Workflowを使って、CloudWatch Alarmの通知をSlackチャンネルへ投稿する
      • Lambda
        • lambrollでAWS Lambda関数をデプロイしたときのTips
    • Heroku
      • HerokuのStackの設定
      • Heroku Postgresの運用でよく使うコマンド集
  • セキュリティ
    • Web
      • Same Origin PolicyとCORS
      • 脆弱性診断 2社同時依頼実施記録
  • Mail
    • SPF、DKIM、DMARCを使用した迷惑メール対策
  • データ分析
    • データ分析プロセス
  • SaaS
    • Zendesk
      • 問い合わせフォームの項目をサービスごとに出し分け、各サービス担当者に自動で振り分けてメールで通知する
  • イベント
    • RubyKaigi
      • RubyKaigi 2023 に現地参加しました
    • EMConf
      • EMConfJP2025_参加レポート
  • やってみた
    • IoT
      • Raspberry Pi + PaSoRi + Python で、勤怠打刻マシンを作ってみた
  • Precena Tech Book 管理
    • コンテンツ執筆時のルール
  • 関連リンク
    • プレセナエンジニア公式Twitter
GitBook提供
このページ内
  • はじめに
  • Originとは
  • 2種類のOrigin
  • Originの比較の例
  • Same Origin Policyとは
  • CORSとは
  • RailsアプリケーションにおけるCORSの設定

役に立ちましたか?

PDFとしてエクスポート
  1. セキュリティ
  2. Web

Same Origin PolicyとCORS

前へWeb次へ脆弱性診断 2社同時依頼実施記録

最終更新 1 か月前

役に立ちましたか?

はじめに

最近、当社の開発では単一のホストだけでWebアプリケーションをホストせずに、フロントエンドとバックエンドを別のサーバーでホストすることが多くなってきました。

そして、これまでは遭遇してこなかったブラウザやJavaScriptに関するセキュリティの仕様に対処することが頻繁に起こるようになってきました。

この記事では、それらに対処する際に調べて把握した知識の一部であるSame Origin PolicyとCORSについてまとめます。

Originとは

に詳細が記載されていますが、Webのセキュリティモデルの基本となるものです。Originを共有するWebのリソースは互いに信用でき、それらの著作者(著作組織)も基本的には同じであると考えます。

2種類のOrigin

WhatWGの定義によると、Originには、以下の2種類があります。

  • An opaque origin

  • A tuple origin

An opaque Originは、定義によると内部的に使うオリジンで、オリジンをシリアライズして復元することはできず、シリアライズした場合はnullとなるようです。あまり利用イメージが湧きませんが、我々の普段のWeb開発ではあまり使うことはなさそうに思います。念の為に定義文を引用しておくと、以下です。

An opaque origin

An internal value, with no serialization it can be recreated from (it is serialized as "null" per ), for which the only meaningful operation is testing for equality.

引用:

A tuple originは、以下の要素で構成されます。

  • Scheme(https、http、ftp、などURLの先頭部分につけるもの)

  • Host

  • Port

  • Domain

Domainは、Hostの一部であるからか、一般的に、以下の3つをOriginを構成する要素と記載されることも多いようです。この記事でも以下の3つでOriginが構成される想定で、以降の説明を記載します。

  • Scheme

  • Host

  • Port

つまり、https://www.precena.com:8080/index.html のようなURLがある場合に、A tuple originとは、

  • https(Scheme)

  • www.precena.com (Host)

  • 8080 (Port)

の組み合わせで構成されます。

Originの比較の例

URL

同じかどうか (True/False)

理由

http://www.precena.co.jp

https://www.precena.co.jp

False

Schemeが異なる

https://www.precena.co.jp/

https://www.precena.co.jp/company/info

True

Path(/と/company/info)が異なるが、Scheme、Host、Portは同じ

https://data.precena.co.jp/

https://www.precena.co.jp/

False

Hostが異なる( data.precena.co.jp と www.precena.co.jp)

https://www.precena.co.jp/

https://www.precena.co.jp:3000/

False

Portが異なる(80と3000)

Same Origin Policyとは

ブラウザにSame Origin Policyが実装されているため、リクエスト先のOriginで、後述のCORSの許可がされていなければ、XmlHttpReuqestやfecth API、<img>タグを使ったリクエストなどは、異なるOriginに対してはできません。

CORSとは

具体的には、Same Origin PolicyによってアクセスできないようなOriginをまたいだリソースに、あらかじめ、HTTPのヘッダをつけておくことで、アクセス可能にする仕組みです。

例えば、以下のようなHTTPのヘッダを使います。

HTTPヘッダ

ヘッダに記載する内容

Access-Control-Allow-Origin

どのオリジンからのアクセスを許可するか。* も指定可能。

Access-Control-Allow-Methods

どのHTTPメソッドからのアクセスを許可するか。*も指定可能。

ヘッダは、これ以外にもありますが、ここでは記載を省略します。

RailsアプリケーションにおけるCORSの設定

Railsアプリケーションでは、rack-cors というgemを使って簡単にCORSの設定を行うことができます。

インストール方法や設定方法は、上記公式サイトに記載されているので、ここでは記載を省略します。

(日本語訳サイトは)に詳細な説明がありますが、要するに、特定のOriginのページ(html)やスクリプト(JavaScript)が、別のOriginのリソース(APIやページなど)にアクセスするのを防ぐブラウザの仕組みです。

Cross Origin Resource Sharingの略で、 (日本語訳サイトは)や (日本語訳サイトは)に詳しい説明が記載されています。

本サイトの更新情報は、Twitterので発信しています。ご確認ください。

WhatWGの定義
serialization of an origin
https://html.spec.whatwg.org/multipage/origin.html#concept-origin-opaque
https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy
こちら
https://developer.mozilla.org/en-US/docs/Glossary/CORS
こちら
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
こちら
株式会社プレセナ・ストラテジック・パートナーズエンジニア公式
LogoGitHub - cyu/rack-cors: Rack Middleware for handling Cross-Origin Resource Sharing (CORS), which makes cross-origin AJAX possible.GitHub