Skip to content

同源策略·跨域与身份认证(Cookie / Session / Token)

前节 浏览器同源与 CORS,后节 会话与凭证


第一部分:同源策略与跨域

同源定义

协议、主机名、端口 三者完全一致才算同源;任一不同即为 跨域

同源策略限制脚本读取 跨源响应数据、跨源 DOM、以及默认 跨站 Cookie 行为等,用于降低窃取风险。


仍能「加载」但未必能「读」

<script> / <img> / <link> / <video> 等可跨域 加载展示,但 JS 读取跨域响应内容(如 fetch、Canvas 读像素)会受阻,除非服务端放行。


CORS(跨域资源共享)

服务端响应头 声明允许的来源与方法:

  • Access-Control-Allow-Origin(勿滥用 * 搭配凭证请求)
  • Access-Control-Allow-MethodsAccess-Control-Allow-Headers
  • 带 Cookie 时需 Allow-Credentials: true 且来源精确

预检 OPTIONS:非简单请求先发预检,通过后再发真实请求。


常见解决路径

方式说明
后端配置 CORS正规 API 跨域首选
开发代理devServer 同源转发,仅开发环境
反向代理Nginx 同域转发,生产常用

小结

跨域是 浏览器策略,不是「前端一行代码关掉」。前端 credentials: 'include' 必须与后端 CORS 精确配合。


第二部分:Cookie、Session、Token 与单点登录

HTTP 无状态,登录态靠 Cookie / Session / Token 等机制衔接。


  • 存储:浏览器按域名保存,体积约 4KB 量级;可设 HttpOnly(防 XSS 读)、Secure(仅 HTTPS)、SameSite(跨站携带策略)。
  • 传输:匹配到的 Cookie 会 自动附加 到请求(受同源/跨站策略约束)。

Session

  • 服务端保存用户状态,浏览器通常只存 sessionId(多在 Cookie 里)。
  • 优点:状态集中,可强制下线;缺点:集群需 共享存储(如 Redis)
  • 风险面:依赖 Cookie 时注意 CSRF,需 Token 或 SameSite 等配合。

Token(如 JWT)

  • 客户端存放(Header Authorization / 存储介质),服务端 校验签名即可 无会话存储(刷新令牌策略另议)。
  • 优点:跨域、分布式友好;缺点:泄露即可用直到过期,需 短有效期 + 刷新 + HTTPSXSS 若窃取存储中的 Token 仍是风险。

选型对比(简)

维度SessionToken
状态服务端有状态常做无状态校验
扩展需会话共享易水平扩展
注销服务端删会话即可需黑名单或短 TTL

单点登录(SSO)提要

多系统共享一次登录:统一认证中心 签发票据或 Token;同主域可用 domain 级 Cookie;跨域常用 中心登录页回调 + Token,或 OAuth2/OIDC 标准流程。

前端常见辅助:重定向到 IdPpostMessage 同步(需校验 origin)、iframe 静默检测(注意浏览器第三方 Cookie 限制)。


小结

没有万能方案:Cookie+Session 适合传统同域;前后端分离 / 多端 常见 Token + HTTPS + CSRF/XSS 防护组合拳