<?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>绿色记忆 &#187; CORS</title>
	<atom:link href="https://blog.gmem.cc/tag/cors/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Fri, 10 Apr 2026 07:50:36 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>HTTP知识集锦</title>
		<link>https://blog.gmem.cc/http-faq</link>
		<comments>https://blog.gmem.cc/http-faq#comments</comments>
		<pubDate>Mon, 27 May 2013 02:39:49 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[CORS]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[JsonP]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=6288</guid>
		<description><![CDATA[<p>Cookies相关知识 Cookies是一种最常使用的客户端存储机制，Cookies由Netscape在1994年提出，用来为HTTP协议引入状态机制。 为了使基于Cookies的状态机制能够工作，Web服务器会在HTTP响应的Set-Cookie头中设置Cookie，保存用户身份、状态信息，而浏览器在下一次发送HTTP请求的时候，会把先前Web服务器设置的Cookie绑定在HTTP请求头中，发送回去。 由于每次HTTP请求都会重复的发送Cookies，所有Cookies不适合存放过大的数据，事实上，大部分浏览器对每个域名可设置Cookies的大小、都有严格限制，通常在数十个、几KB以内。 使用Cookies的注意点 Cookies的Domain可以设置为IP地址，但是不能使用通配符，例如.0.1这样的Domain是非法的 Domain：域名至少包含两个点号。域设置为.gmem.cc的Cookie可以让gmem.cc域名下所有网站使用，例如blog.gmem.cc Path：限制使用Cookie的网页目录，路径设置为/wp-admin/的Cookie可以让gmem.cc/wp-admin/下所有子URL对应的网页访问 Secure：可以限制Cookie只能通过加密连接（SSL）发送 Expires：可以限制Cookie的生存期，如果不设置，那么浏览器关闭后Cookie即消失 同源策略 所谓源，是指由三元组：协议 + 域名 + 端口确定的唯一网络实体。 修改源 通过JavaScript可以修改当前页面的源，但是只能域名为当前域名的超级域名： [crayon-69d8eeca2dae7963164292/] 修改后，同源策略检查结果将受到影响。使用这种技术，可以让位于子域名中的多个网站方便的交互。 跨源资源访问 原则： <a class="read-more" href="https://blog.gmem.cc/http-faq">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/http-faq">HTTP知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div id="cookie-faq" class="blog_h2"><span class="graybg">Cookies相关知识</span></div>
<p>Cookies是一种最常使用的客户端存储机制，Cookies由Netscape在1994年提出，用来为HTTP协议引入状态机制。</p>
<p>为了使基于Cookies的状态机制能够工作，Web服务器会在HTTP响应的Set-Cookie头中设置Cookie，保存用户身份、状态信息，而浏览器在下一次发送HTTP请求的时候，会把先前Web服务器设置的Cookie绑定在HTTP请求头中，发送回去。</p>
<p>由于每次HTTP请求都会重复的发送Cookies，所有Cookies不适合存放过大的数据，事实上，大部分浏览器对每个域名可设置Cookies的大小、都有严格限制，通常在数十个、几KB以内。</p>
<div class="blog_h3"><span class="graybg">使用Cookies的注意点</span></div>
<ol>
<li>Cookies的Domain可以设置为IP地址，但是不能使用通配符，例如.0.1这样的Domain是非法的</li>
<li>Domain：域名至少包含两个点号。域设置为.gmem.cc的Cookie可以让gmem.cc域名下所有网站使用，例如blog.gmem.cc</li>
<li>Path：限制使用Cookie的网页目录，路径设置为/wp-admin/的Cookie可以让gmem.cc/wp-admin/下所有子URL对应的网页访问</li>
<li>Secure：可以限制Cookie只能通过加密连接（SSL）发送</li>
<li>Expires：可以限制Cookie的生存期，如果不设置，那么浏览器关闭后Cookie即消失</li>
</ol>
<div class="blog_h2"><span class="graybg">同源策略</span></div>
<p>所谓源，是指由三元组：协议 + 域名 + 端口确定的唯一网络实体。</p>
<div class="blog_h3"><span class="graybg">修改源</span></div>
<p>通过JavaScript可以修改当前页面的源，但是只能域名为当前域名的超级域名：</p>
<pre class="crayon-plain-tag">document.domain = "gmem.cc";</pre>
<p>修改后，同源策略检查结果将受到影响。使用这种技术，可以让位于<span style="background-color: rgb(192, 192, 192);">子域名中的多个网站方便的交互</span>。</p>
<div class="blog_h3"><span class="graybg">跨源资源访问</span></div>
<p>原则：</p>
<ol>
<li>通常允许跨域执行写操作：例如链接、重定向、表单提交</li>
<li>通常允许跨域资源嵌入</li>
<li>通常不允许跨域读操作：例如Ajax请求</li>
</ol>
<p>其中第一条，为CSRF（跨站请求伪造，Cross-site request forgery）埋下隐患。攻击者可能引导用户访问一个恶意站点，而此恶意站点包含了修改敏感信息的表单，此表单自动跨源发送，伪造用户身份篡改信息。可以使用不可测的CSRF标记来防止跨域写。</p>
<p>第二条，可以嵌入的资源包括：</p>
<ol>
<li>script标签</li>
<li>link标签，嵌入css。CSS的跨域需要一个设置正确的Content-Type消息头</li>
<li>img标签</li>
<li>video、audio标签</li>
<li>object、embed、applet插件</li>
<li>@font-face引入的字体。某些浏览器要求同源字体</li>
<li>frame、iframe。站点可以使用<pre class="crayon-plain-tag">X-Frame-Options</pre> 头禁止这类资源嵌入</li>
</ol>
<p>你可以使用CORS、JsonP等技术允许来进行跨源的资源共享。</p>
<div class="blog_h2"><span class="graybg">JsonP相关知识</span></div>
<p>JsonP即JSON with Padding，其实与JSON没有直接关系，是一种跨站资源共享的方式。</p>
<p>由于浏览器的同源策略，blog.gmem.cc一般是无法与诸如soulspark.im之类的其它网站进行通信的，但是HTTP的<pre class="crayon-plain-tag">&lt;script&gt;</pre> 脚本是一个例外，例如此脚本，可以动态的从其它网站上获取信息。</p>
<p>假设blog.gmem.cc/postinfo/{postid}提供一个获取文章信息的RESTful服务，其返回值是text/json格式，示例如下：</p>
<pre class="crayon-plain-tag">{
    "post_author" : "alex",
    "post_title"  : "HTTP协议知识集锦"
}</pre>
<p> 那么soulspark.im的某个页面如何才能访问并获取某篇文章的信息呢？</p>
<p>如果直接使用Ajax请求访问，同源策略可能导致访问被禁止，那么如果使用<pre class="crayon-plain-tag">&lt;script&gt;</pre> 脚本，上述返回值并不能被soulspark.im的脚本提取并使用。</p>
<p>要支持JsonP，blog.gmem.cc必须改造postinfo服务，允许其传入一个“Padding”参数，该参数由调用者soulspark.im指定，通常是一个JavaScript函数的名称，改造后的postinfo服务的URL示例为：<pre class="crayon-plain-tag">blog.gmem.cc/postinfo/{postid}?jsonp=decodePost</pre> ，而返回值则是如下形式的脚本：</p>
<pre class="crayon-plain-tag">//decodePost即所谓Padding，由客户端提供的简短字符串，通常就是所谓“回调函数”
decodePost(
    {
        "post_author" : "alex",
        "post_title"  : "HTTP协议知识集锦"
    }
);</pre>
<p>这样，soulspark.im就可以调用decodePost()，从而获取文章的信息了。</p>
<p>需要注意的时，<pre class="crayon-plain-tag">&lt;script&gt;</pre> 脚本不一定非要硬编码在HTML文档中，在页面运行过程中，可以随时动态创建该元素以使用JsonP。</p>
<div class="blog_h3"><span class="graybg">JsonP的安全风险</span></div>
<p>JsonP允许远端Web服务注入任意JavaScript代码，因此具有很大的安全性风险，如果远端服务器具有安全缺陷，或者响应内容在网络上被篡改，将导致本地Web页面受到威胁。</p>
<div class="blog_h2"><span class="graybg"><a id="cors"></a>CORS相关知识</span></div>
<p>CORS，即Cross-origin resource sharing（跨来源资源共享）是一份浏览器技术规范。相比起JsonP，它有如下优势：</p>
<ol>
<li>支持除了GET以外的其它HTTP请求方法</li>
<li>支持使用一般的Ajax（XMLHttpRequest、Fetch）直接获取资源</li>
<li>支持跨源使用Webfont、WebGL贴图、样式表、脚本</li>
</ol>
<p>所谓跨源，指发起<span style="background-color: #c0c0c0;">请求的那个网页所在的源（协议 + 域名 + 端口）</span>，与<span style="background-color: #c0c0c0;">请求的目标网页的源不一致</span>。</p>
<p>大部分现代浏览器，包括IE 8+，均支持CORS。</p>
<div class="blog_h3"><span class="graybg">服务器</span></div>
<p>要支持CORS，服务器端必须设置<pre class="crayon-plain-tag">Access-Control-Allow-Origin</pre> 响应头，下面是某个Python Web服务的代码片段：</p>
<pre class="crayon-plain-tag">headers.setdefault('Access-Control-Allow-Origin', '*')
"""
上述配置允许任何其它的Domain向服务器发起请求。
把*换成http://soulspark.im，则仅仅允许soulspark.im发起请求
"""</pre>
<p>如果服务器不进行设置，客户端在尝试CORS访问时将会报错。 </p>
<p>与CORS有关的响应头包括：</p>
<table class=" fixed-word-wrap full-width">
<tbody>
<tr>
<td style="width: 30%;">Access-Control-Allow-Origin</td>
<td>必须字段。允许哪些源发起请求，源由客户端在请求头<pre class="crayon-plain-tag">Origin</pre> 中设置</td>
</tr>
<tr>
<td>Access-Control-Allow-Credentials</td>
<td>布尔值，可选字段。是否允许跨域的发送Cookie，默认情况下Cookie不包含在CORS请求中</td>
</tr>
<tr>
<td>Access-Control-Expose-Headers</td>
<td>默认的，CORS方式发送Ajax时，只能拿到Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma这几个响应头。如果允许获得其它响应头，需要在这里指定</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">客户端</span></div>
<p>在浏览器中，Origin头会在需要时，自动的被浏览器设置，JavaScript代码无法干预。因此<span style="background-color: rgb(192, 192, 192);">CORS依赖浏览器的正确行为</span>来工作。</p>
<p>发送CORS的Ajax请求时要想带着Cookie，不但需要服务器同意，客户端也要显式的指定：</p>
<pre class="crayon-plain-tag">var xhr = new XMLHttpRequest();
xhr.withCredentials = true;  // 附带Cookie</pre>
<p>启用上述设置时，Access-Control-Allow-Origin不允许指定为*，同时Cookie仍然受到同源策略的限制。</p>
<p>由于CORS依赖于浏览器的行为，因此服务器不能对客户端做假设。</p>
<p>&nbsp;</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/http-faq">HTTP知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/http-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
