Origin 是一个 HTTP 请求头部,用于指示请求的源,即发起请求的网页或脚本的来源。这个头部在跨域资源共享(CORS)和安全相关的场景中非常重要,帮助服务器确定请求的来源并做出相应的安全决策。
Origin 头部的作用
-
跨域资源共享(CORS):
- 在跨域请求中,浏览器会自动添加
Origin头部。服务器通过检查Origin头部来决定是否允许请求,并在响应中添加相应的 CORS 头部。 - 例如,当浏览器发送跨域请求时,
Origin头部会包含请求的源,例如:Origin: https://example.com
- 在跨域请求中,浏览器会自动添加
-
防止跨站请求伪造(CSRF):
- 服务器可以通过检查
Origin头部来防止 CSRF 攻击。服务器只接受来自信任源的请求,拒绝或进一步验证其他源的请求。 - CSRF 防护中,如果请求的
Origin头部不在白名单中,服务器可以拒绝该请求。
- 服务器可以通过检查
示例
跨域请求示例
假设用户在 https://example.com 上的一个网页中发起一个跨域请求到 https://api.example.com,浏览器会添加 Origin 头部:
GET /data HTTP/1.1
Host: api.example.com
Origin: https://example.com
服务器在处理这个请求时,可以检查 Origin 头部,并在响应中添加 CORS 头部来允许跨域请求:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://example.com
Content-Type: application/json
{ "key": "value" }
POST 请求中的 Origin 头部
同样,对于表单提交或者通过 JavaScript 发起的 POST 请求,Origin 头部也会包含来源信息:
POST /submit-form HTTP/1.1
Host: api.example.com
Origin: https://example.com
Content-Type: application/x-www-form-urlencoded
name=JohnDoe&age=30
服务器可以使用类似的逻辑来处理和验证 Origin 头部。
Origin 与 Referer 的区别
Origin头部 仅包含协议、域名和端口,不包括路径和查询参数。例如,Origin: https://example.com。Referer头部 包含完整的 URL,包括路径和查询参数。例如,Referer: https://example.com/page?query=123。
Origin 头部更加简洁,主要用于安全和权限检查,而 Referer 头部提供了更详细的来源信息,适用于流量分析和内容定制。
CORS 相关的 Origin 头部使用
在 CORS 中,服务器通过以下头部来控制跨域请求的行为:
Access-Control-Allow-Origin:指定允许哪些源访问资源。可以是具体的源,或使用*表示允许所有源访问。Access-Control-Allow-Methods:指定允许的 HTTP 方法,如 GET、POST、PUT 等。Access-Control-Allow-Headers:指定允许的请求头部。Access-Control-Allow-Credentials:指示是否允许发送凭证(如 cookies)。
示例:CORS 响应头
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true
Content-Type: application/json
{ "key": "value" }
浏览器行为
浏览器会自动添加 Origin 头部到某些类型的 HTTP 请求中,特别是涉及跨域请求的场景。下面是一些具体情况,浏览器会自动添加 Origin 头部:
自动添加 Origin 头部的情况
-
跨域请求(CORS):
- 当浏览器发送跨域请求(即请求的目标与当前页面的源不同)时,会自动添加
Origin头部。例如,使用fetch或XMLHttpRequest发起的跨域请求。
- 当浏览器发送跨域请求(即请求的目标与当前页面的源不同)时,会自动添加
-
跨域资源嵌入:
- 当浏览器嵌入跨域资源(如
<img>标签加载的图片、<script>标签加载的脚本、<link>标签加载的样式表)时,也会添加Origin头部。
- 当浏览器嵌入跨域资源(如
-
POST 请求:
- 在提交表单时,如果目标 URL 与当前页面的源不同,浏览器会自动添加
Origin头部,即使是同源请求也会添加。
- 在提交表单时,如果目标 URL 与当前页面的源不同,浏览器会自动添加
不自动添加 Origin 头部的情况
浏览器不会在所有请求中添加 Origin 头部,以下是一些例外情况:
-
同源 GET 请求:
- 对于同源的简单 GET 请求,浏览器不会添加
Origin头部。例如,从https://example.com/page1请求https://example.com/page2。
- 对于同源的简单 GET 请求,浏览器不会添加
-
某些浏览器插件或手动构建的请求:
- 某些浏览器插件或者手动构建的 HTTP 请求可能不会自动包含
Origin头部,具体取决于实现方式。
- 某些浏览器插件或者手动构建的 HTTP 请求可能不会自动包含
控制 Origin 头部的行为
开发者可以通过设置 HTTP 头部来控制浏览器发送的 Origin 信息。例如,使用 Referrer-Policy 头部可以影响 Referer 头部的内容,但对 Origin 头部的控制相对有限。通常,Origin 头部的行为主要由浏览器自动处理,开发者在服务器端接收到后可以基于其值进行相应的处理和响应。
总结
浏览器会自动在跨域请求、跨域资源嵌入和 POST 请求中添加 Origin 头部,帮助服务器确定请求的来源并进行安全性检查。这一机制在跨域资源共享(CORS)和防止跨站请求伪造(CSRF)等安全场景中起到关键作用。理解 Origin 头部的自动添加行为,有助于开发者更好地管理跨域请求和安全策略。