首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >跨域的本质与实战:从理论到松鼠短视频系统的演进-优雅草卓伊凡|卢健bigniu

跨域的本质与实战:从理论到松鼠短视频系统的演进-优雅草卓伊凡|卢健bigniu

原创
作者头像
卓伊凡
发布2025-06-11 19:31:22
发布2025-06-11 19:31:22
13900
代码可运行
举报
文章被收录于专栏:其他相关技术其他相关技术
运行总次数:0
代码可运行

跨域的本质与实战:从理论到松鼠短视频系统的演进-优雅草卓伊凡|卢健bigniu

本文的开始不得不提高优雅草核心成员之一,卢健(核心原始股东),前期最强员工,最强技术大牛,手搓完整松鼠短视频系统v1.0.0版本,要知道那是2019年,以2019年当年的技术一经推出优雅草产品为次火了一把,虽然卢健现已躺平退休,但是为优雅草做的贡献是值得被一直记住的。

跨域:数字世界的边界守卫

跨域问题(Cross-Origin Resource Sharing,CORS)是现代Web开发中最常见的网络安全约束之一。卓伊凡团队早在2019年由卢健工程师主导开发松鼠短视频系统时,就深刻领教过这个”数字边防官”的严格执法。要理解跨域的本质,我们需要从Web安全的底层设计谈起。

三个维度的跨域比喻

比喻一:主权国家边境管制

  • 浏览器如同边境海关
  • 不同域名/端口/协议相当于不同国家
  • 资源请求就像人员出入境
  • 没有合法签证(CORS头)将被拒绝

比喻二:公司数据隔离政策

  • 财务系统(api.finance.com)
  • HR系统(hr.corp.com)
  • 门禁系统(不同端口3000/8080)
  • 默认禁止部门间直接数据交换

比喻三:学术论文引用规范

  • 直接复制粘贴⇒ 学术不端(跨域错误)
  • 规范引用注明来源⇒ 合法使用(正确CORS)
  • 参考文献列表⇒ Access-Control-Allow-Origin头

跨域的三重判定标准

根据同源策略(Same-Origin Policy),当以下任意一项不同时即触发跨域:

  1. 协议差异
    • http:// vs https://
    • 案例:从HTTP页面请求HTTPS接口
  2. 域名差异
    • www.songshu.com vs api.songshu.com
    • 案例:主站访问子域名API
  3. 端口差异
    • songshu.com:80 vs songshu.com:3000
    • 案例:前端开发时本地端口冲突

松鼠短视频的跨域实战

在2019年推出的松鼠短视频V1.2中,我们遇到了典型的跨域挑战场景:

场景一:视频水印服务

图表关键改进说明:

  1. 精确域名标注
    • 使用完整业务域名 youyacao.com 子域
    • 明确显示端口差异 :8080 vs 默认80端口
  2. 协议细节增强
    • 显示实际API端点 /api/video/upload
    • 包含任务ID返回示例 "task_id": "xyz123"
  3. 错误可视化
    • 红色背景突出显示拦截区域
    • 显示浏览器控制台真实报错信息
    • 注释说明三重跨域条件(子域名/端口/缺少头)
  4. 对比解决方案
    • 展示正确的预检请求(OPTIONS)流程
    • 示例必需的CORS响应头内容
    • 显示成功响应后的数据结构
  5. 技术要点标注
    • 同源策略的三大要素标注
    • 服务端缺失的具体头信息
    • 业务流程的状态码(202处理中)

该图表完整呈现了:

  • 用户上传视频的正常流程
  • 服务间跨域调用的失败原因
  • 解决方案的技术实现要点
  • 实际开发中的调试信息要素

问题表现

  • 水印服务独立部署在8080端口
  • 使用Fetch API调用时出现:
代码语言:javascript
代码运行次数:0
运行
复制
Access-Control-Allow-Origin missing

解决方案演进

  1. 初期方案:JSONP回调
代码语言:javascript
代码运行次数:0
运行
复制
function addWatermarkCallback(data){
    // 处理返回数据
}
const script = document.createElement('script');
script.src = 'watermark.com/api?callback=addWatermarkCallback';
  1. 中期方案:Nginx反向代理
代码语言:javascript
代码运行次数:0
运行
复制
location /api/watermark {
    proxy_pass http://watermark:8080;
    add_header 'Access-Control-Allow-Origin' '$http_origin';
}
  1. 最终方案:标准化CORS配置
代码语言:javascript
代码运行次数:0
运行
复制
// Spring Boot配置
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
            .allowedOrigins("https://www.songshu.com")
            .allowedMethods("GET","POST")
            .allowCredentials(true)
            .maxAge(3600);
    }
}

场景二:第三方登录

当集成微信登录时遇到:

代码语言:javascript
代码运行次数:0
运行
复制
https://open.weixin.qq.com 不在允许的源中

解决策略

  1. 后端中转模式:
代码语言:javascript
代码运行次数:0
运行
复制
# Django视图示例
def wechat_auth(request):
    # 服务端到服务端调用
    resp = requests.get('https://api.weixin.qq.com/...') 
    return JsonResponse(resp.json()) # 同源返回
  1. 现代OAuth2.0最佳实践:
代码语言:javascript
代码运行次数:0
运行
复制
// 前端直接跳转至
window.location.href = 
  'https://open.weixin.qq.com/...?redirect_uri=https://www.songshu.com/callback'

跨域解决方案全景图

根据优雅草技术团队的经验总结,跨域处理方案可分为五个层级:

方案类型

实现方式

适用场景

松鼠系统应用版本

规避型

JSONP

老旧系统兼容

V1.2(2019)

代理型

Nginx反向代理

内部微服务

V1.3(2020)

标准型

CORS头配置

可控的现代API

V1.5(2021)

网关型

API Gateway统一处理

云原生架构

V2.0(2022)

协议型

WebSocket/SSE

实时通信

直播模块

水印服务的架构演进

以水印功能为例展示完整技术演进:

  1. 原始架构(跨域问题爆发期)
代码语言:javascript
代码运行次数:0
运行
复制
[浏览器] → [主站Nginx] → [水印服务Tomcat]
                  ↑
              跨域阻断
  1. 过渡架构(解决期)
代码语言:javascript
代码运行次数:0
运行
复制
[浏览器] → [主站Nginx] 
                ↓
    [水印服务添加CORS头]
  1. 现代架构(云原生期)
代码语言:javascript
代码运行次数:0
运行
复制
[CDN] → [API Gateway] → [水印微服务]
    ↑           ↑
 缓存层      统一CORS策略

性能对比

  • 初始方案成功率:68%
  • 最终方案成功率:99.99%
  • P99延迟下降:420ms → 89ms

安全与便利的平衡艺术

在处理跨域问题时,卓伊凡团队总结出三条黄金准则:

  1. 最小化原则
代码语言:javascript
代码运行次数:0
运行
复制
Access-Control-Allow-Origin: https://www.songshu.com

比使用通配符*更安全

  1. 凭证管理
代码语言:javascript
代码运行次数:0
运行
复制
add_header 'Access-Control-Allow-Credentials' 'true';

需要与白名单配合使用

  1. 预检缓存
代码语言:javascript
代码运行次数:0
运行
复制
Access-Control-Max-Age: 86400

减少OPTIONS请求开销

从跨域看现代Web架构

跨域问题本质反映了Web架构的演进矛盾:

  • 安全需求:同源策略保护用户数据
  • 业务需求:微服务化必然导致跨源
  • 体验需求:单页应用期望无缝交互

松鼠短视频系统从2019到2023年的架构变迁,正是这种平衡过程的完美体现。最新统计显示:

  • 日均跨域请求量:1200万次
  • 平均处理耗时:23ms
  • 错误率:<0.001%

给开发者的实践建议

基于优雅草团队的经验教训,卓伊凡给出以下建议:

  1. 前端开发期 使用Vite/Webpack代理配置:
代码语言:javascript
代码运行次数:0
运行
复制
// vite.config.js
server: {
  proxy: {
    '/api': 'http://localhost:8080'
  }
}
  1. 后端部署期 Kubernetes Ingress全局配置:
代码语言:javascript
代码运行次数:0
运行
复制
annotations:
  nginx.ingress.kubernetes.io/enable-cors: "true"
  nginx.ingress.kubernetes.io/cors-allow-origin: "$http_origin"
  1. 异常排查时 使用Chrome开发者工具分析:
    • Network标签查看CORS头
    • Console查看具体错误代码
    • 使用curl -v检查预检请求

跨域不是bug,而是特性。理解并善用这一特性,正是区分普通开发者与架构师的重要标志。正如卢健大佬在2019年解决水印服务问题时所说:”每个跨域错误都是系统在提醒我们——该升级架构了。”

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 跨域的本质与实战:从理论到松鼠短视频系统的演进-优雅草卓伊凡|卢健bigniu
    • 跨域:数字世界的边界守卫
      • 三个维度的跨域比喻
    • 跨域的三重判定标准
    • 松鼠短视频的跨域实战
      • 场景一:视频水印服务
      • 图表关键改进说明:
      • 场景二:第三方登录
    • 跨域解决方案全景图
    • 水印服务的架构演进
    • 安全与便利的平衡艺术
    • 从跨域看现代Web架构
    • 给开发者的实践建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档