<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>same-origin &#8211; Larry的午茶時光</title>
	<atom:link href="https://blog.yuyansoftware.com.tw/tag/same-origin/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.yuyansoftware.com.tw</link>
	<description></description>
	<lastBuildDate>Sun, 31 Mar 2024 02:49:47 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.yuyansoftware.com.tw/wp-content/uploads/2022/10/favicon-45x45.png</url>
	<title>same-origin &#8211; Larry的午茶時光</title>
	<link>https://blog.yuyansoftware.com.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>如何判斷網站的 same-origin/cross-origin，same-site/cross-site，SameSite 與 cookie 的再探討</title>
		<link>https://blog.yuyansoftware.com.tw/2021/08/same-origin-same-site-cookie/</link>
		
		<dc:creator><![CDATA[Larry]]></dc:creator>
		<pubDate>Sun, 01 Aug 2021 15:18:55 +0000</pubDate>
				<category><![CDATA[網路科技]]></category>
		<category><![CDATA[cross-origin]]></category>
		<category><![CDATA[cross-site]]></category>
		<category><![CDATA[same-origin]]></category>
		<category><![CDATA[same-site]]></category>
		<guid isPermaLink="false">https://blog.yuyansoftware.com.tw/?p=8275</guid>

					<description><![CDATA[兩個網頁 scheme, hostname, port 都相同，就算 same-origin，彼此可以存取資源 (例如圖片、CSS、JS)。same-site 的判斷則是跟 cookie 能否發送有關。]]></description>
										<content:encoded><![CDATA[
<p><a rel="noreferrer noopener" href="https://web.dev/same-site-same-origin/" target="_blank">https://web.dev/same-site-same-origin/</a><br>偶然看到 web dev 的一篇好文，整理了一遍 same-origin/cross-origin, same-site/cross-site 中間的不同。首先 origin 的概念，可以參考我之前的文章 <a rel="noreferrer noopener" href="https://blog.yuyansoftware.com.tw/2015/10/cross-origin-resource-sharing-cors/" target="_blank">網站的跨源資源共享 Cross-Origin Resource Sharing (CORS)</a></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8220;目前網路協定走的是 Same-origin policy，兩個網頁 scheme, hostname, port 都相同，就算 same-origin，彼此可以存取資源 (例如圖片、CSS、JS)。&#8221;</p>
</blockquote>



<p>再來看 same-site。首先我們要知道，網址有一個 <strong>Top-level domain</strong> (TLD)，<mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color"><code>.com</code></mark><em><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color"></mark></em>, <code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">.tw</mark></code> 都算 TLD，所有的 TLD 定義在 <a rel="noreferrer noopener" href="https://www.iana.org/domains/root/db" target="_blank">Root Zone Database</a>。但是後來又有問題，<code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">.co.jp</mark></code>, <mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">.<code>github.io</code></mark> 這些不算 TLD 阿，但實際網址會使用這些後綴，所以後來又出了一個 <strong>effective TLD</strong> (eTLD)。<code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">.co.jp</mark></code>, <code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">.github.io</mark></code> 這些就是屬於 eTLD。</p>



<p><strong>eTLD+1</strong> 指的則是網址的 TLD，和 TLD 前的部分。例如 <code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">my-project.github.io</mark></code>，eTLD 是 <code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">github.io</mark></code>，eTLD+1 則是 <code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">my-project.github.io</mark></code>。</p>



<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">只要 eTLD+1 相同的兩個網頁就算 same-site</mark>，不用管 scheme 同不同，不用管 port 同不同，不用管 sub-domain 同不同，只要 eTLD+1 相同就算 same-site。</p>



<p><a rel="noreferrer noopener" href="https://web.dev/schemeful-samesite/" target="_blank">https://web.dev/schemeful-samesite/</a><br>後來為了更好的安全性，尤其 same-site 的判斷跟 cookie 是否能發送有關，又出了一個 <strong>schemeful same-site</strong>。其中 scheme 會納入考量，即使網址完全相同，HTTP / HTTPS 視為 cross-site。</p>



<p>但必須提醒讀者，schemeful same-site 還算是新東西 (目前是 2021 年 8 月)，每種瀏覽器，每個瀏覽器版本行為可能不同。但大趨勢應該是往這方向走。</p>



<p>上方連結有特別舉例，<code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">http://site.example</mark></code>, <code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">https://site.example</mark></code> 兩站互相站外連結。兩站本來算 same-site，SameSite=Strict cookie 可被送回。但如果用 <strong>schemeful same-site</strong> 規則，兩站算 corss-site，SameSite=Strict cookie 不會被送回。但因為是簡單站外連結，SameSite=Lax cookie 仍可以送回。</p>



<p>如果 <code><mark style="background-color:rgba(0, 0, 0, 0);color:#989898" class="has-inline-color">http://site.example</mark></code> 中嵌入 <code><mark style="background-color:rgba(0, 0, 0, 0);color:#989898" class="has-inline-color">https://site.example</mark></code> 的圖片。兩站本來算 same-site，SameSite=Strict cookie 可被送回。但如果用 <strong>schemeful same-site</strong> 規則，兩站算 corss-site，SameSite=Strict cookie 不會被送回。<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">SameSite=Lax 嵌入資源的情況，cookie 也不會被送回。</mark></p>



<p>SameSite=Strict, Lax, None;Secure 行為上的不同，請參考之前的文章 <a rel="noreferrer noopener" href="https://blog.yuyansoftware.com.tw/2020/01/chrome-80-samesite-cookie/" target="_blank">Chrome 80 開始更新 SameSite 規則，預設禁止存取第三方 cookie</a></p>



<p>要知道一個 request 到底屬於哪一種，檢查它的 HTTP header <code><mark style="background-color:rgba(0, 0, 0, 0);color:#989898" class="has-inline-color">Sec-Fetch-Site</mark></code>。它有四種值：1) cross-site, 2) same-site, 3) same-origin, 4) none</p>



<p>文件有說 <code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">Sec-Fetch-Site</mark></code> 不包含 schemeful same-site，所以 <code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">Sec-Fetch-Site</mark></code> 的 same-site 應該是不看 scheme 的。再來，<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">因為 same-origin 的條件是 scheme, hostname, port 都要相同，比 same-site 還嚴謹</mark>，所以如果是 same-origin 的話資源、cookie 傳輸都沒問題。</p>



<h4 class="wp-block-heading">結論</h4>



<p>現代網站一定要使用 HTTPS，不使用的話從安全性到 SEO，各個角度來講都不行。如果使用 HTTPS 是前提的話，倒是不用糾結 schemeful same-site。</p>



<p>至於 cookie 的傳輸，Google 已宣布長期的方向是完全不支援第三方 cookie，<code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">SameSite=None;Secure</mark></code> 只是一個暫時的解法。</p>



<p>本篇走了一遍 same-site 的來龍去脈，因為 same-site 的定義以及 cookie 傳輸的協定，將來還會再改。我們要知道的是脈絡，而不是死背現在的規格。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>網站的跨源資源共享 Cross-Origin Resource Sharing (CORS)</title>
		<link>https://blog.yuyansoftware.com.tw/2015/10/cross-origin-resource-sharing-cors/</link>
		
		<dc:creator><![CDATA[Larry]]></dc:creator>
		<pubDate>Tue, 13 Oct 2015 04:09:00 +0000</pubDate>
				<category><![CDATA[網路科技]]></category>
		<category><![CDATA[cross-origin]]></category>
		<category><![CDATA[same-origin]]></category>
		<guid isPermaLink="false">http://test234.yuyansoftware.com.tw/2015/10/13/%e5%a5%bd%e6%96%87%e5%88%86%e4%ba%ab-cross-origin-resource-sharing-cors/</guid>

					<description><![CDATA[對照 Origin 的工作是在 browser 在接到 response header 後發生，而不是在 server 端判斷。跨源資源共享 (CORS) 時，可以在 server handler 裡用程式碼判斷，將允許的 Origin 加上 Access-Control-Allow-Origin。]]></description>
										<content:encoded><![CDATA[
<p>原文及圖片來源<br><a href="https://developer.mozilla.org/zh-TW/docs/HTTP/Access_control_CORS" target="_blank" rel="noreferrer noopener" aria-label=" (在新分頁中開啟)">https://developer.mozilla.org/zh-TW/docs/HTTP/Access_control_CORS</a></p>



<p>上面是一篇很好關於<strong>跨源資源共享</strong> Cross-Origin Resource Sharing (以下簡稱 CORS) 的文章，我喜歡它把 request/response http header 完整列出來的部分。</p>



<p><a rel="noreferrer noopener" href="https://developer.mozilla.org/zh-TW/docs/Web/Security/Same-origin_policy" target="_blank">https://developer.mozilla.org/zh-TW/docs/Web/Security/Same-origin_policy</a><br><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">目前網路協定走的是 Same-origin policy</mark>，兩個網頁 scheme, hostname, port 都相同，就算 same-origin，彼此可以存取資源 (例如圖片、CSS、JS)。<meta charset="utf-8">scheme, hostname, port 只要有一不同，sub-domain 不同，就算 cross-origin，如需存取資源，要特別處理。</p>



<p>這個連結有 App Engine 如何將 <code><mark style="background-color:rgba(0, 0, 0, 0);color:#989898" class="has-inline-color">Access-Control-Allow-Origin</mark></code> 加入 config file：<br><a rel="noreferrer noopener" aria-label="https://cloud.google.com/appengine/docs/python/config/appconfig (在新分頁中開啟)" href="https://cloud.google.com/appengine/docs/python/config/appconfig" target="_blank">https://cloud.google.com/appengine/docs/python/config/appconfig</a></p>



<p>Google Cloud Storage 的 CORS 文件：<br><a href="https://cloud.google.com/storage/docs/cross-origin" target="_blank" rel="noreferrer noopener" aria-label="https://cloud.google.com/storage/docs/cross-origin (在新分頁中開啟)">https://cloud.google.com/storage/docs/cross-origin</a></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>&#8220;The client (e.g., browser) checks this response header to verify that the domain in the response matches the domain specified in original request, and if these match, the request proceeds.&#8221;</p></blockquote>



<p>所以對照 Origin 的工作是在 browser 在接到 response header 後發生，而不是在 server 端判斷。<strong>跨源資源共享</strong> (CORS) 時，可以在 server handler 裡用程式碼判斷，將允許的 Origin 加上 <code><mark style="background-color:rgba(0, 0, 0, 0);color:#999999" class="has-inline-color">Access-Control-Allow-Origin</mark></code>，甚至每個 sub url 可以加上不同的 access control。以 webapp2 框架來說，語法為：</p>



<pre class="wp-block-code"><code>self.response.headers.add('Access-Control-Allow-Origin', your_url)</code></pre>



<p>跨源存取資源分兩種，上方是 <strong>簡單請求</strong> (simple requests)。</p>



<p>如果 HTTP method 不是 GET, POST, HEAD，或是<meta charset="utf-8">非一般簡單 <meta charset="utf-8">Content-Type。例如 <meta charset="utf-8">HTTP method 是 PUT, DELETE，Content-Type 是 application/xml，則需要用 <strong>預檢請求</strong> (preflighted requests)。</p>



<p><meta charset="utf-8">預檢請求會先以 HTTP <strong>OPTIONS</strong> method 詢問 server，哪些 method 允許，哪些標頭允許。收到允許後，再實際去存取資源，所以是兩段式的流程。</p>



<p>下面例子是一個自定義標頭 (<meta charset="utf-8">X-PINGOTHER)，和一個非簡單 <meta charset="utf-8">Content-Type 的<meta charset="utf-8">跨源請求，server 端的處理方式，以 webapp2 框架來說：</p>



<pre class="wp-block-code"><code>def options(self):
    self.response.headers.add('Access-Control-Allow-Origin', your_url)
    self.response.headers.add('Access-Control-Allow-Headers', 'X-PINGOTHER, Content-Type')

def post(self):
    self.response.headers.add('Access-Control-Allow-Origin', your_url)</code></pre>



<p>也就是藉由 <strong>OPTIONS</strong> method 先確定哪個 Origin 可以存取主機資源，哪些自定義或非簡單標頭，主機可以接受。<strong>Preflight</strong> 通過了，才能執行主要 Get / Post request。</p>



<p>以上藉由 Google App Engine 走一遍 <strong>跨源資源共享</strong> 的觀念和實作。也許讀者的開發環境不是 App Engine 或是 Python，可以再看一下上面 MDN 的文件，是一篇很好關於 CORS 的文章。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
