- 技術 💻
オリジンとは|Webの同一オリジンとgitのoriginを実測で解説
結論
オリジンは「起源・出どころ」という意味です。Web では「スキーム・ホスト・ポートの3つの組」、git では「clone 元のリモートリポジトリに付く既定の名前」を指します。同じ言葉でも、場面ごとに指すものがまったく違います。
この記事でわかること
- ふだん・Web・git・CDN・配列の5つの場面での「オリジン」の意味
- ポートが1つ違うだけで fetch・localStorage・iframe がどう変わるかの実測
- git の origin・origin/main の正体と、よく出るエラーの原文
この記事で実際に動かしたもの:127.0.0.1 の 8701・8702 番ポートに立てた自作の Web サーバー2つと Chromium 153(同一オリジン・別オリジンの fetch・Cookie・localStorage・iframe・canvas)、手元に作った空のリポジトリでの git の clone・push・remote 操作、オリジンサーバーの前に置いた自作のキャッシュ中継です。
「オリジン」は、IT の外でも中でも使われる言葉です。困りごとの多くは、いま読んでいる文章が「どのオリジン」の話なのかを取り違えるところから始まります。最初に全体の地図を示します。
flowchart LR
A[オリジン<br>起源] --> B[Web]
A --> C[git]
A --> D[CDN]
A --> E[配列]
B --> B1[スキーム・<br>ホスト・ポート]
C --> C1[clone元の<br>リモート名]
D --> D1[元データの<br>サーバー]
E --> E1[数え始め<br>0か1か]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| オリジンの意味(ふだん) | 起源・原点・出どころ。英語の origin | オリジンとは(場面別の意味) |
| Web のオリジンとは | URL のスキーム・ホスト・ポートの組。パスは含まない | Webのオリジンとは |
| 同一オリジンの条件 | 3つが全部同じとき。ポートだけ違っても別オリジン | Webのオリジンとは |
| 別オリジンだと何が起きる | fetch の応答が読めない・localStorage が分かれる・iframe の中に触れない | fetch/localStorage・Cookie/iframe の節 |
| CORS エラーとの関係 | CORS は、別オリジンの読み取りをサーバーが許可する仕組み | オリジンが違うとfetchはどうなるか |
| git の origin とは | clone 元のリモートに付く既定の名前。URL そのものではない | gitのoriginとは |
| origin/main と origin main の違い | origin/main は手元の記録、origin main は「origin の main」の指定 | origin/main・origin main・upstreamの違い |
| オリジンサーバーとは | CDN の手前ではなく奥にある、元のデータを持つサーバー | CDNのオリジンサーバーと0オリジン |
確認環境:Ubuntu 24.04.5 LTS の上で、Python 3.13.18 の http.server で作った自作の Web サーバーを 127.0.0.1 の 8701 番と 8702 番で同時に起動し、届いたリクエストの Host・Origin・Sec-Fetch-Site・Cookie をすべて記録しました。ブラウザは Chromium 153.0.8010.12(Chrome for Testing)を playwright-core 1.63.0 から日本語の設定で動かし、fetch・localStorage・sessionStorage・Cookie・iframe・postMessage・canvas・window.open・file: のページの挙動を確かめています。URL のオリジンは Chromium の new URL() で求めました。git は 2.43.0 を使い、作業用の一時フォルダーに作った bare リポジトリを clone して、remote・push・fetch・rename の出力とエラー文を取りました。CDN のオリジンサーバーは、自作のキャッシュ中継(8703番)を 8701 番の前に置いて curl 8.5.0 で確かめています。外部のサービスには接続していません。オリジンと同一オリジンポリシーの定義は MDN と web.dev、git の既定の名前は git の公式マニュアルで確かめました。図は mermaid-cli 11.16.0 で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「オリジンとは|Webの同一オリジンとgitのoriginを実測で解説」
オリジンとは(場面別の意味:ふだんの意味とITの意味)
この節では、「オリジン」という言葉が、ふだんの言葉と IT の各分野でそれぞれ何を指すのかが分かります。
オリジンは英語の origin で、もとの意味は「起源・出どころ・原点」です。 IT の言葉としてのオリジンも、どれも「どこから来たか」「どこが元か」という意味から派生しています。違うのは、何を「元」と見なすかです。
| 場面 | オリジンが指すもの | 例 | 見分ける手がかり |
|---|---|---|---|
| ふだんの言葉 | 起源・原点・出どころ | シングルオリジンのコーヒー(1つの産地の豆)、物語のオリジン(始まりの話) | 商品名・作品名・話の始まり |
| Web(ブラウザ) | URL のスキーム・ホスト・ポートの組 | https://www.r-jc.jp |
同一オリジン・CORS・Origin ヘッダー |
| git | clone 元のリモートリポジトリに付く既定の名前 | git push origin main |
git のコマンドの中に出てくる |
| CDN・配信 | 元のデータを持っているサーバー(オリジンサーバー) | CDN が取りに行く先の Web サーバーやストレージ | キャッシュ・エッジ・CDN と一緒に出てくる |
| 配列・数え方 | 数え始めの番号(0オリジン・1オリジン) | Python の s[0] は0オリジン、awk の $1 は1オリジン |
添字・番号・何番目 |
このほか、ゲームの配信サービスの名前や企業名・弁当チェーンの名前としての「オリジン」もありますが、IT の技術の話で出てくるのは上の4つ(Web・git・CDN・配列)がほとんどです。以下では、検索されることの多い Web と git を中心に、実際に動かした結果で説明します。
Web のオリジン(ブラウザの決まり)
URL から自動で決まる。名前は付けられない
スキーム・ホスト・ポートの3つで比べる
違うと、読み取り・保存場所・iframe の中が分かれる
git の origin(ただの名前)
clone したときに付く呼び名。変えられる
中身はリモートの URL の設定
名前を消すと「origin が無い」というエラーになる
Webのオリジンとは(スキーム・ホスト・ポートの3つ)
この節では、Web のオリジンが URL のどの部分で決まるのかと、同一オリジン・別オリジンの判定のしかたが分かります。
Web のオリジンは、URL の「スキーム(http・https など)」「ホスト(ドメイン名や IP アドレス)」「ポート番号」の3つの組です。 3つがすべて同じなら同一オリジン、1つでも違えば別オリジン(クロスオリジン)です。パス・クエリ・# 以降・ユーザー名は含みません。
https://www.example.com:8443/blog/post?id=1#top
└─┬──┘ └──────┬──────┘ └┬─┘└──────────┬─────────┘
スキーム ホスト ポート ここから先はオリジンに含まない
└──────────────┬──────────────────┘
オリジン = https://www.example.com:8443
URL からオリジンを求めた結果(Chromium 153)
Chromium の new URL(…).origin で、いろいろな URL のオリジンを求めました。既定のポート(http は 80、https は 443)は書いても書かなくても同じ扱いになり、表示からは省かれます。
| URL | 求めたオリジン | 読み取れること |
|---|---|---|
http://example.com/app1/index.html |
http://example.com |
パスは含まない |
http://example.com:80/x |
http://example.com |
:80 は省かれる(上と同一オリジン) |
https://example.com:443/ |
https://example.com |
:443 も省かれる |
https://example.com:8443/ |
https://example.com:8443 |
既定以外のポートは残る |
HTTP://EXAMPLE.COM/ |
http://example.com |
大文字は小文字にそろう |
https://user:pw@example.com/a?q=1#h |
https://example.com |
ユーザー名・クエリ・# は含まない |
https://例え.jp/ |
https://xn--r8jz45g.jp |
日本語ドメインは Punycode に変わる |
blob:http://127.0.0.1:8701/uuid |
http://127.0.0.1:8701 |
blob: は作ったページのオリジン |
data:text/html,hi・about:blank |
null |
URL だけではオリジンが決まらない |
同一オリジンか別オリジンか(判定表)
基準を http://127.0.0.1:8701/page として、手元で実際に開いた相手との関係を並べます。「サイト」の列は後の節で説明する、オリジンより広いまとまりです。Chromium がリクエストに付けた Sec-Fetch-Site ヘッダーの値をそのまま載せています。
| 相手の URL | オリジン | 違う部分 | Sec-Fetch-Site(実測) |
|---|---|---|---|
http://127.0.0.1:8701/api |
同一 | パスだけ | same-origin |
http://127.0.0.1:8702/api |
別 | ポート | same-site |
http://localhost:8701/api |
別 | ホスト(同じ機械でも名前が違う) | cross-site |
https://127.0.0.1:8701/ |
別 | スキーム | (https は立てていないため値は取っていない) |
- localhost と 127.0.0.1 は、同じ機械を指していても別オリジンです。 ブラウザはホストを文字列で比べるため、名前が違えば別の相手として扱います。
- www の有無も別オリジンです。
https://example.comとhttps://www.example.comはホストが違います。
最初の5分:自分のページのオリジンを確かめる
開発者ツールのコンソールを開く
Chrome・Edge は F12(Mac は Command+Option+J)。調べたいページを開いた状態で行う。
location.origin と打つ
手元では 'http://127.0.0.1:8701' と返った。これがそのページのオリジン。
呼び出し先の URL と3つを見比べる
fetch している API の URL のスキーム・ホスト・ポートを1つずつ比べる。1つでも違えば CORS の設定が要る。
git なら git remote -v
リポジトリのフォルダーで実行すると、origin という名前がどの URL を指しているかが出る。
同一オリジンポリシーとは(何を止めて、何を止めないか)
この節では、オリジンという考え方が何のためにあるのかと、ブラウザが別オリジンに対して何を止めるのかが分かります。
同一オリジンポリシー(Same-Origin Policy)は、あるオリジンのページで動くスクリプトが、別のオリジンのデータを勝手に読めないようにするブラウザの決まりです。 たとえば、ふだん見ているサイトのスクリプトが、同じブラウザでログイン中のメールや社内システムの中身を読み取れてしまうと困ります。オリジンは、その「読んでよい範囲」を区切る単位です。
MDN は、オリジンをまたぐやりとりを「書き込み」「埋め込み」「読み込み」の3つに分けて説明しています。手元の結果と合わせると次のようになります。
| 種類 | 例 | 別オリジンへ | 手元の結果 |
|---|---|---|---|
| 書き込み | リンク・リダイレクト・フォーム送信 | おおむね許される | 別オリジンへの遷移は普通にできた |
| 埋め込み | img・script・iframe・video | おおむね許される | 8702番の画像・iframe は表示された |
| 読み込み | fetch の応答本文・iframe の中の DOM・canvas の画素 | 原則止める | どれも SecurityError か Failed to fetch |
大事なのは、同一オリジンポリシーが止めるのは主に「読み取り」で、リクエストの送信そのものではないという点です。次の節で、別オリジンへの fetch がサーバーには届いていた記録を示します。
よくある思い込み
変更を伴う API は、CSRF 対策や認証をサーバー側で行う
オリジンが違うとfetchはどうなるか(CORSエラーとの関係)
この節では、別オリジンの API を fetch したときに何が起きるのかを、ブラウザの表示とサーバーの記録の両方から確かめた結果が分かります。
別オリジンへの fetch は、相手のサーバーが Access-Control-Allow-Origin で許可しない限り、応答を読めずに失敗します。 これが CORS エラーです。CORS(オリジン間リソース共有)は、同一オリジンポリシーの「読み取り禁止」を、サーバーの許可で緩める仕組みです。
8701番のページから、5通りの fetch を実行しました。
await fetch('/api') // 同一オリジン
await fetch('http://127.0.0.1:8702/api') // ポート違い・許可なし
await fetch('http://127.0.0.1:8702/api-cors') // ポート違い・許可あり
await fetch('http://localhost:8701/api') // ホスト違い・許可なし
await fetch('http://127.0.0.1:8702/api', {mode: 'no-cors'})
| 呼び出し先 | ブラウザでの結果 | サーバーに届いたか |
|---|---|---|
同一オリジン /api |
type: basic、status 200、本文を読めた | 届いた |
8702番 /api(許可なし) |
TypeError: Failed to fetch |
届いた(200 を返していた) |
8702番 /api-cors(許可あり) |
type: cors、status 200、本文を読めた | 届いた |
localhost:8701 /api |
TypeError: Failed to fetch |
届いた |
8702番 no-cors |
type: opaque、status 0、本文は空 | 届いた |
許可の無い fetch では、コンソールに次の文言が出ました。
Access to fetch at 'http://127.0.0.1:8702/api' from origin 'http://127.0.0.1:8701' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Failed to load resource: net::ERR_FAILED
文言の中の from origin 'http://127.0.0.1:8701' が、ブラウザが判断に使った「呼び出し元のオリジン」です。ここに出ているオリジンと、サーバーが Access-Control-Allow-Origin に書いた値が1文字でも違えば読めません。 許可した 8702番の応答は、次のヘッダーを付けていました。
HTTP/1.0 200 OK
Content-Type: application/json
Access-Control-Allow-Origin: http://127.0.0.1:8701
Vary: Origin
mode: 'no-cors' はエラーを消しますが、応答は中身の無い「opaque(不透明)」になります。CORS エラーを避ける方法ではありません。CORS エラーの文言ごとの直し方とサーバー側の設定例は、関連記事「CORSエラーの原因と解決方法|エラーメッセージ別に解説」で扱っています。この記事では、その前提になる「オリジンとは何か」に絞ります。また、Failed to fetch はオリジン以外(サーバーの停止・証明書・広告ブロック)でも出ます。原因の切り分けは関連記事「Failed to fetchの原因と直し方|fetchエラー」で扱っています。
localStorage・Cookieとオリジン(ポート違いの実測)
この節では、ブラウザに保存するデータがオリジンごとに分かれるのか、ポートやホストが違うとどうなるのかが分かります。
localStorage と sessionStorage はオリジンごとに分かれます。Cookie はオリジンではなくホスト名で分かれ、ポートを区別しません。 同じ「ブラウザの保存場所」でも、区切りの単位が違います。
localStorage はポートが違えば見えない
8701番のページで localStorage.setItem('k205', 'set-on-8701') を実行し、同じブラウザで3つの URL を開いて読みました。
| 開いたページ | localStorage.getItem('k205') |
localStorage.length |
|---|---|---|
http://127.0.0.1:8701/page |
set-on-8701 |
1 |
http://127.0.0.1:8702/page |
null |
0 |
http://localhost:8701/page |
null |
0 |
開発中に「保存したはずの値が消えた」と感じるとき、多くは開発サーバーのポートが変わったか、localhost と 127.0.0.1 を行き来したことが原因です。値は消えておらず、別の保存場所を見ています。なお sessionStorage は、オリジンに加えてタブごとにも分かれるため、新しいタブではどれも null でした。
Cookie はポートが違っても送られる
8701番で Set-Cookie: c205=from8701; Path=/ を返したあと、各ページを開いたときにサーバーが受け取った Cookie ヘッダーです。
| 開いた URL | サーバーが受け取った Cookie |
|---|---|
http://127.0.0.1:8701/showcookie |
c205=from8701 |
http://127.0.0.1:8702/showcookie |
c205=from8701(ポートが違うのに届いた) |
http://localhost:8701/showcookie |
なし |
同じ 127.0.0.1 で複数のアプリを別ポートで動かすと、Cookie の名前がぶつかって上書きし合うことがあります。セッション Cookie の名前はアプリごとに変えるのが安全です。保存場所ごとの違い(容量・期限・送信の有無)は関連記事「localStorage・sessionStorage・Cookieの違い|実測比較」で扱っています。
1localStorage・IndexedDB
オリジン単位。スキーム・ホスト・ポートのどれかが違えば別の箱。
2sessionStorage
オリジン単位で、さらにタブごとに分かれる。
3Cookie
ホスト名(と Domain・Path 属性)の単位。ポートは区別しない。
iframe・canvas・ポップアップとオリジン
この節では、ページの中に別のページや画像を入れたとき、オリジンによって何ができて何ができないのかが分かります。
別オリジンの iframe や画像は「表示」はできますが、スクリプトから「中身を読む」ことはできません。 ページ同士でデータを渡したいときは postMessage を使います。
iframe の中に触れるか
| iframe の中身 | contentWindow.document.title |
postMessage の event.origin |
|---|---|---|
| 同一オリジン(8701番の /frame) | frame-title を読めた |
http://127.0.0.1:8701 |
| 別オリジン(8702番の /frame) | SecurityError(下の原文) | http://127.0.0.1:8702 |
同一オリジンだが sandbox="allow-scripts" |
SecurityError | null |
srcdoc+sandbox |
(読んでいない) | null |
SecurityError: Failed to read a named property 'document' from 'Window': Blocked a frame with origin "http://127.0.0.1:8701" from accessing a cross-origin frame.
SecurityError: Failed to read a named property 'href' from 'Location': Blocked a frame with origin "http://127.0.0.1:8701" from accessing a cross-origin frame.
別オリジンの iframe では contentDocument は null になり、contentWindow.location.href を読むことも止められました。MDN によれば、別オリジンのウィンドウで使えるのは postMessage・close・focus・blur などの限られたメソッドと、location への書き込みなどだけです。sandbox 属性に allow-same-origin を付けないと、同じサーバーのページでもオリジンが null になり、親から中に触れなくなります。iframe の書き方と表示されない原因は関連記事「HTML iframeの使い方|レスポンシブ・sandbox・表示されない原因」で扱っています。
postMessage では必ず送り主のオリジンを確かめる
message イベントの event.origin には、送り主のオリジンがブラウザによって入ります(上の表の3列目は実際に入った値です)。受け取る側は、想定したオリジンかを最初に確かめます。
window.addEventListener('message', (event) => {
if (event.origin !== 'http://127.0.0.1:8702') return; // 想定外の送り主は無視
console.log('受け取った', event.data);
});
canvas は別オリジンの画像で「汚れる」
2×2画素の橙色の PNG を canvas に描き、getImageData で画素を読みました。
| 画像の出どころ | 結果 |
|---|---|
| 同一オリジン | 画素 [255, 136, 0, 255] を読めた |
| 別オリジン(crossOrigin なし) | 表示はされたが SecurityError: … The canvas has been tainted by cross-origin data. |
別オリジン(crossOrigin="anonymous"、サーバーの許可なし) |
画像の読み込み自体が失敗(コンソールに CORS の文言) |
別オリジン(crossOrigin="anonymous"+Access-Control-Allow-Origin: *) |
画素 [255, 136, 0, 255] を読めた |
画像の加工や書き出し(toDataURL)で SecurityError が出るときは、画像側のサーバーで CORS を許可し、img に crossOrigin を付けます。片方だけでは読めません。
about:blank のポップアップは開いた側のオリジンを受け継ぐ
8701番のページから window.open('about:blank') で開いた窓は、location.href が about:blank のまま、origin は http://127.0.0.1:8701 でした。開いた側から document.body に文字を書き込むこともできました。URL にオリジンの情報が無いページは、作ったページのオリジンを受け継ぎます。
Originヘッダーとサーバーから見たオリジン
この節では、ブラウザがリクエストに付ける Origin ヘッダーと Sec-Fetch-Site ヘッダーが、いつ・どんな値で付くのかが分かります。
Origin ヘッダーは、リクエストを出したページのオリジンをサーバーに伝えるヘッダーです。 中身はスキーム・ホスト・ポートだけで、パスは含みません。サーバーは CORS の許可を判断するときにこの値を見ます。手元のサーバーで受け取った値を並べます。
| リクエスト | Origin | Sec-Fetch-Site | Sec-Fetch-Mode |
|---|---|---|---|
| 同一オリジンへの GET の fetch | 付かない | same-origin | cors |
| 同一オリジンへの POST の fetch | http://127.0.0.1:8701 |
same-origin | cors |
| 8702番への GET の fetch | http://127.0.0.1:8701 |
same-site | cors |
| localhost:8701 への GET の fetch | http://127.0.0.1:8701 |
cross-site | cors |
8702番への no-cors の fetch・img |
付かない | same-site | no-cors |
| アドレス欄に URL を入れて開いた | 付かない | none | navigate |
| curl で送った | 付かない | 付かない | 付かない |
MDN の説明どおり、Origin は「オリジンをまたぐ CORS のリクエスト」と「GET・HEAD 以外の同一オリジンのリクエスト」に付きました。curl には Origin も Sec-Fetch-Site も付かないため、curl では CORS のエラーが再現しません。CORS はブラウザの決まりで、サーバーとの通信そのものの決まりではないからです。
サーバー側で Origin を使って判断するときは、許可するオリジンを完全一致の一覧で持ちます。example.com を含むかどうかのような部分一致では、example.com.another.test のような別のホストも通ってしまいます。
ALLOWED = {"https://app.example.com", "http://127.0.0.1:8701"}
def cors_headers(origin):
if origin in ALLOWED: # 完全一致で比べる
return {"Access-Control-Allow-Origin": origin, "Vary": "Origin"}
return {}
オリジンがnullになる場面と、オリジンとサイトの違い
この節では、オリジンが「null」になるのはどんなときかと、似た言葉の「サイト(same-site)」との違いが分かります。
オリジンが null になる場面
null は「どのオリジンとも同じと見なさない特別なオリジン(不透明なオリジン)」を表す値です。 null 同士も同一オリジンにはなりません。手元で null になったのは次の場面です。
| 場面 | 手元で見えた値 |
|---|---|
sandbox 属性つきの iframe(allow-same-origin なし) |
self.origin も event.origin も null |
data: の URL・about:blank を URL だけで求めた |
new URL(…).origin が null |
file:///dev/shm/…/f.html を直接開いた |
self.origin は null、location.origin は file:// |
file: で開いたページから同じフォルダーのファイルを fetch すると、次のエラーになりました。HTML を直接ダブルクリックで開いて動かないときは、python3 -m http.server などで http のサーバーから開くと解決します。
Access to fetch at 'file:///dev/shm/t205/f.html' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: chrome, chrome-extension, chrome-untrusted, data, http, https, isolated-app.
なお、Access-Control-Allow-Origin: null で許可するのは避けます。null になる文書は sandbox や data: など誰でも作れるため、「null を許可する」は「出どころの分からない相手を許可する」ことに近くなります。
オリジンとサイトの違い
サイトは、オリジンより広いまとまりで、「スキーム」と「登録できるドメイン(eTLD+1)」で決まります。ポートとサブドメインは区別しません。 web.dev は、.co.jp や .github.io のような公開サフィックスの1つ上(例:example.co.jp)をサイトの単位と説明しています。
基準 https://www.example.com との比較 |
同一オリジン | 同一サイト |
|---|---|---|
https://www.example.com/other |
○ | ○ |
https://login.example.com |
×(ホスト違い) | ○ |
https://www.example.com:8443 |
×(ポート違い) | ○ |
http://www.example.com |
×(スキーム違い) | ×(今の定義ではスキームも比べる) |
https://www.another.test |
× | × |
手元でも、ポートだけが違う 8702番は Sec-Fetch-Site: same-site、ホスト名が違う localhost は cross-site でした。Cookie の SameSite 属性が見ているのは、名前どおり「サイト」の単位です。SameSite の挙動は関連記事「CSRF対策とSameSite|Cookie送信をChromeで実測し多層防御を実装」で扱っています。
gitのoriginとは(リモートリポジトリの呼び名)
この節では、git のコマンドに出てくる origin が何者なのかを、実際に clone して設定ファイルを見た結果で説明します。
git の origin は、clone したときに git が自動で付ける「リモートリポジトリの名前」です。 特別な機能があるわけではなく、git push origin main の origin は「origin という名前で登録した URL」の短い呼び名です。git の公式マニュアルは、clone で作るリモートの名前は既定で origin で、--origin(-o)か設定の clone.defaultRemoteName で変えられる、と説明しています。
clone した直後の様子
$ git init -q --bare -b main server.git
$ git clone server.git work
Cloning into 'work'...
warning: You appear to have cloned an empty repository.
done.
$ cd work
$ git remote
origin
$ git remote -v
origin /dev/shm/t205/g/server.git (fetch)
origin /dev/shm/t205/g/server.git (push)
origin の正体は、リポジトリの .git/config に書かれた数行です。
[remote "origin"]
url = /dev/shm/t205/g/server.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
remote = origin
merge = refs/heads/main
url:origin が指す先。GitHub ならhttps://github.com/…やgit@github.com:…が入ります。fetch:リモートのrefs/heads/*(ブランチ)を、手元のrefs/remotes/origin/*に写す、という決まり。これがorigin/mainの出どころです。[branch "main"]:手元の main が、origin の main を追いかける(追跡する)という設定。git push -u origin mainで書き込まれます。
名前は変えられる
-o を付けて clone すると、origin 以外の名前になりました。名前が違っても動きは同じです。
$ git clone -o hub server.git w2
$ cd w2
$ git remote -v
hub /dev/shm/t205/g/server.git (fetch)
hub /dev/shm/t205/g/server.git (push)
$ git branch -a
* main
remotes/hub/HEAD -> hub/main
remotes/hub/main
確かめる
git remote -v。名前と URL の組が出る。
何も出なければ未登録
足す
git remote add origin URL。git init から始めたときに使う。
clone なら自動で付く
URL を変える
git remote set-url origin 新URL。移転・HTTPS から SSH への切り替え。
名前はそのまま
名前を変える
git remote rename origin upstream。追跡の設定も一緒に変わる。
fork の運用で使う
remote の追加・変更・削除と、push が拒否されたときの対処は関連記事「git remoteの変更・追加・削除とpush rejectedの対処法」で扱っています。この記事では「origin とは何か」までに絞ります。
origin/main・origin main・upstreamの違い(gitのorigin)
この節では、似た書き方の origin/main と origin main の違いと、fork でよく出る upstream との関係が分かります。
origin/main(スラッシュあり)は「最後に通信したとき、origin の main がどこにあったか」を手元に記録したブランチです。origin main(スペースあり)は、コマンドに「origin というリモートの、main ブランチ」と2つの引数を渡す書き方です。
| 書き方 | 指すもの | 通信するか | 使う場面 |
|---|---|---|---|
origin |
リモートの名前(URL の呼び名) | コマンドによる | git fetch origin |
origin/main |
手元にある「リモート追跡ブランチ」 | しない(手元の記録) | git log origin/main・git diff origin/main |
origin main |
リモート origin の main ブランチ | する | git push origin main・git pull origin main |
upstream |
慣習の名前。fork 元のリポジトリによく使う | コマンドによる | git fetch upstream |
origin/main は fetch するまで更新されない
別の clone(w2)から新しいコミットを push したあと、work で確かめました。fetch する前は、手元の記録が更新されていないため「差は無い」と表示されます。
$ git status -sb
## main...upstream/main
$ git log --oneline -1 upstream/main
0a926a7 second
$ git fetch upstream
From /dev/shm/t205/g/server
0a926a7..d69e947 main -> upstream/main
$ git status -sb
## main...upstream/main [behind 1]
git status の「up to date」は、リモートと比べた結果ではなく、手元の記録と比べた結果です。 最新の状態と比べたいときは、先に git fetch を実行します。fetch は記録を更新するだけで、手元のブランチは動かしません。
push -u で追跡の設定が入る
$ git push -u origin main
To /dev/shm/t205/g/server.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
-u で追跡を設定しておくと、次からは git push・git pull だけで origin の main が相手になります。git remote show origin では、その設定がまとめて見えます。
* remote origin
Fetch URL: /dev/shm/t205/g/server.git
Push URL: /dev/shm/t205/g/server.git
HEAD branch: main
Remote branch:
main tracked
Local branch configured for 'git pull':
main merges with remote main
Local ref configured for 'git push':
main pushes to main (fast-forwardable)
fork したときの origin と upstream
GitHub などで fork して clone すると、origin は自分の fork を指します。fork 元の更新を取り込むために、元のリポジトリを upstream という名前で足すのが慣習です。名前は決まりではなく、git remote rename origin upstream のように付け替えても、追跡の設定は新しい名前に合わせて書き換わりました(git branch -vv の表示が [upstream/main: ahead 1] に変わった)。
CDNのオリジンサーバーと0オリジン・1オリジン
この節では、Web と git 以外でよく出る「オリジンサーバー」と「0オリジン・1オリジン」の意味が分かります。
オリジンサーバー(CDN の奥にある元のサーバー)
オリジンサーバーは、CDN やキャッシュの中継が「元のデータを取りに行く先」のサーバーです。 利用者のリクエストはまず近くの中継(エッジ)が受け、手元に無いときだけオリジンサーバーに取りに行きます。8701番をオリジンサーバー、8703番を自作のキャッシュ中継にして、同じ URL を3回取得しました。
$ for i in 1 2 3; do curl -s -D - -o /dev/null http://127.0.0.1:8703/api | grep -i x-cache; done
X-Cache: MISS
X-Cache: HIT
X-Cache: HIT
3回のうち、オリジンサーバー(8701番)に届いたリクエストは最初の1回だけでした。CDN を使っているサイトで「更新したのに前の内容が出る」のは、中継がオリジンに取りに行かず、手元の写しを返しているためです。Web のオリジン(スキーム・ホスト・ポート)とは別の意味で、こちらは「元データの置き場所」という意味です。
0オリジン・1オリジン(数え始めの番号)
0オリジンは「最初の要素を0番と数える」、1オリジンは「1番と数える」という意味です。 言語やツールによって違うため、取り違えると1つずれます。手元で「abc の最初の文字」を取り出しました。
| 書き方 | 結果 | 数え方 |
|---|---|---|
Python 'abc'[0] |
a | 0オリジン |
bash ${arr[0]}(配列 a b c) |
a | 0オリジン |
awk $1(入力 a b c) |
a | 1オリジン($0 は行全体) |
cut -c1 |
a | 1オリジン |
SQLite substr('abc', 1, 1) |
a | 1オリジン |
シェルスクリプトから SQL や awk を呼ぶと、1つの処理の中に0オリジンと1オリジンが混ざります。「何番目」を扱う箇所には、どちらで数えているかを書いておくと読み違いを防げます。
オリジンでよくあるエラーとつまずき(原文つき)
この節では、Web と git でオリジンが原因になる代表的なエラーの原文と、原因・直し方が一覧で分かります。
| 表示(原文) | 原因 | 直し方 |
|---|---|---|
… from origin 'http://127.0.0.1:8701' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present … |
別オリジンの API がそのオリジンを許可していない | API 側で Access-Control-Allow-Origin を返す。開発中は同一オリジンに見せるプロキシも使える |
TypeError: Failed to fetch |
CORS の拒否(コンソールに上の文言も出る)か、サーバーの停止など | コンソールの直前の行を見る。CORS の文言が無ければ通信の問題 |
Blocked a frame with origin "…" from accessing a cross-origin frame. |
別オリジン(または sandbox)の iframe の中を読もうとした | postMessage でやりとりする |
The canvas has been tainted by cross-origin data. |
別オリジンの画像を描いた canvas を読もうとした | 画像のサーバーで CORS を許可し、img に crossOrigin="anonymous" |
… from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes … |
HTML を file: で直接開いた | ローカルの http サーバーから開く |
fatal: 'origin' does not appear to be a git repository |
origin という名前のリモートが登録されていない(rename・remove・git init 直後) | git remote -v で名前を確かめ、無ければ git remote add origin URL |
error: remote origin already exists. |
origin がすでにある状態で git remote add origin した |
URL を変えたいなら git remote set-url origin URL |
fatal: No configured push destination. |
リモートが1つも無いリポジトリで git push した |
git remote add origin URL のあと git push -u origin main |
git の does not appear to be a git repository は、手元では次の原文でした。「アクセス権」の話が書かれていますが、名前の登録が無いだけでも同じ文が出ます。
fatal: 'origin' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
CORS エラーが出たとき
mode: 'no-cors' を付けてエラーを消す、ブラウザのセキュリティを切る拡張機能を入れるエラーを消すことと、読めるようにすることは別
origin が無いと言われたとき
git remote -v で origin という名前があるかを見る。名前が違うだけなら、その名前で push する名前の問題か、接続の問題かを先に分ける
判断表:どの「オリジン」の話かを見分ける
この節では、目の前の文章やエラーに出てくる「オリジン」がどの意味なのかを、順に当てはめて判断できます。
- 1git のコマンドや出力の中にある → git のリモートの名前git push origin・origin/main・remote origin
- 2CORS・iframe・Cookie・ブラウザのエラーの中にある → Web のオリジンfrom origin '…'・cross-origin・同一オリジン
- 3HTTP のヘッダーとして出てくる → Web のオリジンOrigin:・Access-Control-Allow-Origin:
- 4CDN・キャッシュ・エッジと一緒に出てくる → オリジンサーバーオリジンの負荷・オリジンへのフェッチ
- 5配列・添字・何番目の話 → 0オリジン・1オリジン最初が0番か1番か
- 6どれでもない → ふだんの意味(起源・出どころ)商品名・作品名・物事の始まり
Web のオリジンについて、作る側が判断に迷いやすい場面を表にしました。
| 状況 | 判断 | 理由(手元の結果) |
|---|---|---|
| フロント(3000番)と API(8000番)を別ポートで開発 | 別オリジン。CORS かプロキシが要る | ポートだけ違う 8702番への fetch は読めなかった |
| localhost で開いたり 127.0.0.1 で開いたりする | どちらかにそろえる | localStorage が別の箱になり、Cookie も届かなかった |
| 同じホストで別ポートのアプリを複数動かす | Cookie の名前をアプリごとに変える | Cookie はポートを区別せず届いた |
| 別オリジンの iframe とデータを渡したい | postMessage と event.origin の確認 | 中の DOM は SecurityError で読めなかった |
| API で許可するオリジンを決める | 完全一致の一覧。* と null は慎重に |
Origin はスキーム・ホスト・ポートの文字列で届いた |
| サブドメイン間でデータを共有したい | localStorage では共有できない。Cookie の Domain 属性か API で | ホストが違えば別オリジン |
- 1エラーに出ているオリジンを書き写すfrom origin '…' の値が、ブラウザが判断に使った呼び出し元
- 2呼び出し先とスキーム・ホスト・ポートを比べるhttp と https、localhost と 127.0.0.1、ポートの数字
- 3サーバーのログで届いているかを見る届いていれば、止めているのはブラウザの読み取り
- 4git なら git remote -v を最初に見るorigin という名前があるか、URL が正しいか
よくある質問
Q. オリジンとドメインは同じですか? A. 違います。ドメイン(ホスト名)はオリジンを作る3つの部品の1つです。オリジンはそこにスキーム(http・https)とポート番号を加えた組なので、同じドメインでも https と http、8080番と443番は別オリジンです。
Q. オリジンと URL の違いは何ですか?
A. URL はページ1つずつの住所で、オリジンはその中の「スキーム・ホスト・ポート」の部分だけです。https://example.com/a と https://example.com/b は URL が違いますが、オリジンは同じ https://example.com です。
Q. ポート番号を省略した URL と、:443 を書いた URL は同一オリジンですか?
A. 同一オリジンです。https の既定のポートは 443、http は 80 なので、書いても書かなくても同じ扱いです。Chromium で new URL('https://example.com:443/').origin を求めると、https://example.com と省いた形で返りました。
Q. 同じパソコンで動かしているのに、なぜ CORS エラーになるのですか? A. ブラウザは機械が同じかではなく、URL のスキーム・ホスト・ポートで判断するためです。手元でも、同じ 127.0.0.1 の 8701番から 8702番への fetch は読めず、localhost:8701 への fetch も読めませんでした。
Q. curl では成功するのに、ブラウザでは失敗します。 A. CORS はブラウザが守る決まりだからです。curl は Origin ヘッダーを付けず、応答の読み取りを止めることもしません。手元のサーバーでも、curl のリクエストには Origin・Sec-Fetch-Site が付いていませんでした。
Q. git の origin は消してもよいですか?
A. 消せます。git remote remove origin で消えるのは手元の呼び名と設定だけで、リモートのリポジトリ自体は消えません。ただし、そのあと git push origin main は 'origin' does not appear to be a git repository になります。
Q. origin という名前でなければいけませんか?
A. いいえ。origin は clone のときの既定の名前で、git clone -o hub のように別の名前にもできます。手元でも hub という名前で clone し、remotes/hub/main ができました。チームの手順書が origin を前提にしていることが多いため、特に理由が無ければ origin のままが分かりやすいです。
Q. origin と upstream の違いは何ですか?
A. どちらもリモートの名前で、git の機能としての違いはありません。fork して開発するとき、自分の fork を origin、fork 元を upstream と呼ぶのが慣習です。また git には「追跡先のブランチ(upstream branch)」という用語もあり、git push -u の u はこちらを指します。
Q. Access-Control-Allow-Origin に * を書けば解決しますか?
A. 誰でも読める公開データなら選択肢になりますが、Cookie などの認証情報を送るリクエストでは * は使えません。ログインが関わる API は、許可するオリジンを1つずつ書きます。
Q. 「オリジンの負荷を下げる」と言われました。どのオリジンですか? A. CDN の話であれば、オリジンサーバー(元のデータを持つサーバー)のことです。キャッシュが効くほど、オリジンサーバーに届くリクエストは減ります。手元の中継でも、3回の取得のうちオリジンに届いたのは1回でした。
まとめ
- オリジンのもとの意味は「起源・出どころ」。IT では、Web のオリジン・git の origin・CDN のオリジンサーバー・0オリジン/1オリジンの4つがよく出てくる。
- Web のオリジンは「スキーム・ホスト・ポート」の組。1つでも違えば別オリジンで、localhost と 127.0.0.1、ポート違いも別オリジンになる。
- 同一オリジンポリシーが止めるのは主に読み取り。別オリジンへの fetch はサーバーに届いていたが、許可が無いと応答を読めなかった。localStorage はオリジンごとに分かれ、Cookie はポートを区別しなかった。
- git の origin は clone 元のリモートに付く既定の名前で、正体は
.git/configの数行。origin/mainは手元の記録なので、最新と比べるには先に fetch する。 - 迷ったら、Web は
location.originとエラーのfrom origin '…'、git はgit remote -vを最初に確かめる。
次に読むとよい記事です。CORS の設定は関連記事「CORSエラーの原因と解決方法|エラーメッセージ別に解説」で、git のリモートの操作は関連記事「git remoteの変更・追加・削除とpush rejectedの対処法」で扱っています。
参考・出典
確認日はいずれも 2026年10月29日です。
- MDN「Origin(オリジン)」:https://developer.mozilla.org/ja/docs/Glossary/Origin
- MDN「同一オリジンポリシー」:https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy
- MDN「Origin」(HTTP ヘッダー):https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Origin
- MDN「オリジン間リソース共有 (CORS)」:https://developer.mozilla.org/ja/docs/Web/HTTP/Guides/CORS
- web.dev「same-site と same-origin について」:https://web.dev/articles/same-site-same-origin?hl=ja
- WHATWG「HTML Standard」Origin:https://html.spec.whatwg.org/multipage/origin.html#origin
- IETF「RFC 6454 The Web Origin Concept」:https://www.rfc-editor.org/rfc/rfc6454
- Git「git-clone Documentation」(--origin・clone.defaultRemoteName):https://git-scm.com/docs/git-clone
- Git「git-remote Documentation」:https://git-scm.com/docs/git-remote
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「オリジンとは|Webの同一オリジンとgitのoriginを実測で解説」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。