在做接口防盗链或来源校验时,最常用的两个请求头就是 Referer 和 Origin。它们都用来告诉服务器:
👉 这个请求,是从哪来的
但两者作用相似、语义不同、可靠性也不同。
一、Referer 是什么?
Referer 表示:
当前请求是从哪个页面跳转/发起的
它通常是一个 完整 URL。
示例
Referer: https://www.example.com/page/detail?id=123
特点
- 包含:协议 + 域名 + 路径(甚至参数)
- 主要由 浏览器自动添加
- 历史最悠久,兼容性最好
常见使用场景
- 图片 / 视频 / 静态资源防盗链
- 简单页面级来源校验
局限性
- ❌ 可能被浏览器/插件裁剪或直接不发送
- ❌ HTTPS → HTTP 时可能丢失
- ❌ 很容易被脚本伪造
二、Origin 是什么?
Origin 表示:
发起当前请求的“站点源”
它只包含 协议 + 域名 + 端口,不包含路径。
示例
Origin: https://www.example.com
特点
- 不包含路径,更“干净”
- 主要用于 AJAX / fetch / 跨域请求
- 是 CORS 机制的核心字段
常见使用场景
- 接口防盗链
- 接口跨域来源校验
- API 来源域名白名单
局限性
- ❌ 不是所有请求都有(如直接访问资源)
- ❌ 同样可以被脚本伪造
三、Referer vs Origin 对比表
| 对比项 | Referer | Origin |
|---|---|---|
| 表达含义 | 请求来自哪个页面 | 请求来自哪个站点 |
| 是否包含路径 | ✅ 包含 | ❌ 不包含 |
| 浏览器自动携带 | 通常会 | 主要在跨域/AJAX |
| 适合场景 | 资源防盗链 | 接口防盗链 |
| 稳定性 | 较弱 | 较好 |
| 是否可伪造 | ✅ | ✅ |
四、实际工程建议(简单好用)
接口层建议顺序:
1️⃣ 优先校验 Origin
2️⃣ 如果 Origin 不存在,再校验 Referer
3️⃣ 两者都不存在:
- 对资源接口 → 可拒绝
- 对业务接口 → 结合鉴权/限流判断
五、一句话总结 🎯
Referer 看“从哪个页面来”,适合防资源盗用;
Origin 看“来自哪个站点”,更适合接口防盗链。
两者都只是“来源校验”,
不是安全边界,更不是防刷的核心手段。