当前位置: 首页 > news >正文

前端 vs 后端请求:核心差异与实战对比

1. 一句话速记

维度前端后端
核心差异浏览器沙箱限制服务器进程自由
一句话同源策略约束的 HTTP 调用不受同源策略约束的任意协议网络调用

2. 四维原理对比(详细版)

维度前端后端备注 / 示例
发起者浏览器渲染进程里的 JS 引擎Node、Java、Go、Python…SSR 时 Node 代码仍算后端请求
协议 / 库fetchXMLHttpRequest、WebSockethttp(s)netgrpcmysqlredisaxiosrequestcurl浏览器无法直接发 TCP/UDP
安全限制1. 同源策略 (scheme+host+port)
2. CORS 预检 OPTIONS
3. CSP
4. Cookie SameSite
浏览器级限制,仅受服务器防火墙/ACL 控制后端可携带任意 Header、私钥、SSH Key
身份凭证• 浏览器自动带 Cookie / Basic Auth
• 手动塞 JWT / Token 到 Header
• 自定义 Token、OAuth2、Service Mesh mTLS
• 数据库口令、Redis AUTH
后端可缓存长连接、连接池复用

3. 案例:登录 + 拉取并缓存天气

3.1 场景描述

  1. 用户在前端输入账号密码登录。
  2. 前端仅需要“上海”天气。
  3. 后端为了后续推荐,需要静默把“北京、广州、深圳”天气写入 Redis 缓存。

3.2 时序图(Mermaid)

用户浏览器后端 Node天气 APIRedis输入账号密码POST /api/login (带 Cookie)Set-Cookie: jwt=xxxGET /weather?city=shanghai (带 JWT)上海天气 JSONGET /weather?city=beijing (Service Token)GET /weather?city=guangzhouGET /weather?city=shenzhenSETEX beijing 300 {...}SETEX guangzhou 300 {...}SETEX shenzhen 300 {...}par[后台并行]用户浏览器后端 Node天气 APIRedis

4、安全限制(Security Boundaries)


  1. 底层原理:同源策略 Same-Origin Policy(SOP)
    • 定义:scheme + host + port 三元组完全一致才视为同源。
    • 作用域:DOM 访问、Cookie、LocalStorage、IndexedDB、fetch/XHR、WebSocket。
    • 设计目标:防止恶意站点读取其他站点的敏感数据(而不是阻止发请求)。

  2. 浏览器实际行为
    ┌─────────────┬──────────────┬──────────────┐
    │ 场景 │ 请求能否发出 │ 响应能否被 JS 读取 │
    ├─────────────┼──────────────┼──────────────┤
    │ 简单 CORS │ ✅ │ ✅(需 ACAO 头) │
    │ 带预检 CORS │ ✅(两次) │ ✅(需 ACAC 头) │
    │ no-cors │ ✅ │ ❌(opaque) │
    └─────────────┴──────────────┴──────────────┘

  3. 攻防视角
    • CSRF:利用“请求能发出去”的特点,让浏览器携带 Cookie 完成敏感操作。
    防护:SameSite=Lax/Strict、双重 Cookie、Token 在 Header。
    • XSS + SOP 绕过:通过 <script src> / <img> 标签天然不受 SOP 限制,窃取 JSONP 响应。
    • Spectre / 侧信道:借助高精度计时器读取跨源渲染像素 → 浏览器降低 SharedArrayBuffer 精度、COEP/COOP。

  4. 调试技巧
    • 浏览器 DevTools → Network → 查看 Access-Control-Allow-Origin 与预检 OPTIONS。
    chrome://flags/#disable-web-security临时关闭 SOP(仅本地调试)。
    curl -H "Origin: http://evil.com" 快速验证后端 CORS 配置。

================================================================

5、身份凭证(Identity Credentials)


浏览器与服务器在“谁能带什么、怎么带”上截然不同,可用下图概括:

浏览器:Cookie(自动)  └─ SameSite、Secure、HttpOnly  JWT / Token(手动放到 Header/Body)  
服务器:任意 HTTP Header(Authorization、X-Api-Key)  mTLS 双向证书  私网协议(Redis AUTH、MySQL 用户名密码、SSH Key 等)

5.1. Cookie 全景

• 属性速查表
Set-Cookie: sessionId=abc; Path=/; Domain=.foo.com; Secure; HttpOnly; SameSite=Lax; Max-Age=3600
• 生命周期
① 浏览器收到响应头 → 写入 Cookie 仓库
② 后续同源请求自动带 Cookie:
③ JS 无法读取 HttpOnly Cookie,可缓解 XSS 盗取。

• SameSite 行为矩阵
SameSite=Strict 仅同站导航携带 SameSite=Lax 顶级导航 GET 可带(默认 2022+) SameSite=None 任意跨站都带,必须 Secure

• 典型攻击
- CSRF:跨站 POST 自动带 Cookie → 后端需 Token 二次校验。
- 会话固定:登录前把 Cookie 注入到浏览器 → 登录后劫持会话。

5.2. Token / JWT

• 存储位置
- WebStorage(localStorage/sessionStorage):易受 XSS 窃取。
- Cookie(双 Cookie):防 XSS,但仍需防 CSRF。
- Memory:SPA 单页刷新丢失,需配合 refresh_token。
• 传输位置
- Authorization: Bearer <jwt>(前端手动)
- 或签在 Cookie 里(前端不碰,后端解析)。

5.3. 服务器端凭证

• Service-to-Service Token(OAuth2 Client Credentials Grant)
• mTLS:客户端证书自动带在 TLS 握手,无需应用层处理。
• 连接池复用:后端可长期保存数据库密码、Redis AUTH,浏览器做不到。

5.4. 调试 & 审计

• 浏览器:Application → Cookies → 查看属性 & 是否 HttpOnly。
• 后端:
curl -H "Authorization: Bearer $TOKEN" \ -H "Cookie: sessionId=abc" \ https://api.foo.com/user
• 日志:记录 X-Forwarded-ForUser-AgentAuthorization 前缀(脱敏后)。

一句话总结

  • 浏览器只能在“同源沙箱”里玩,携带的凭证要么 Cookie(自动),要么手动塞 Token;
  • 服务器处于“网络终端”,想发什么协议就发什么协议,想带什么凭证就带什么凭证,但必须自己做好鉴权、加密、审计。

5.6 Cookie和Token对比

维度CookieToken(以 JWT 为例)
存储位置浏览器提供的 Cookie 存储区(随请求由浏览器 自动 携带在 Cookie 头)。由前端 主动 保存:可放 Cookie、localStoragesessionStorage、内存等。
携带方式浏览器 自动 把同域 Cookie 附加到每一次 HTTP 请求(包括图片、CSS 等)。前端 手动 加到请求头,如 Authorization: Bearer <token>
大小限制单个 Cookie ≤ 4 KB,每个域名 ≤ ≈180 个(浏览器差异)。只受 URL 长度或服务器配置限制(一般 < 8 KB)。
安全性默认携带,CSRF 风险;可设置 HttpOnly/Secure/SameSite 缓解。不自动带,天然防 CSRF;但如存 localStorage 会受 XSS 威胁。
跨域同源策略 限制,可配合 withCredentials / CORS 跨域。只要前端能取到 token,任意域名都可主动带到服务器。
有效期通过 Expires / Max-Age 设置,可持久由服务器签发时决定(exp 字段),可设短/长,或配合 Refresh Token。
服务端校验通常只需检查 SessionId,实际会话数据存 服务端内存 / Redis典型 无状态:服务端仅验证签名即可拿到用户信息(JWT 自包含)。
注销 & 失效直接删除 Cookie 或让 Session 过期即可。需额外机制:黑名单、短有效期+刷新、版本号等。
适用场景传统 Session-Cookie 会话、自动登录、广告追踪。SPA / 移动端 / 微服务、跨域 API 调用、OAuth 2.0、Serverless。

5.7 Cookie、localStorage和sessionStorage对比

维度CookielocalStoragesessionStorage
存储大小4 KB(单条)5-10 MB5-10 MB
生命周期可设置过期时间;默认会话级永久,除非手动删除页面会话级(关闭标签页即清)
作用域同源请求 自动 携带到后端前端 可读写前端 可读写
是否随 HTTP 请求✅ 浏览器 自动 加到 Cookie❌ 不随请求❌ 不随请求
APIdocument.cookie = ...(字符串拼接)setItem / getItem / removeItem / clear同 localStorage
安全性默认带 CSRF 风险;可 HttpOnly 防 JS 访问XSS 威胁XSS 威胁
主要用途登录态、跟踪、偏好本地离线数据、缓存页面内临时数据
跨标签页共享✅ 同源共享✅ 同源共享❌ 同一标签页内共享
http://www.xdnf.cn/news/1360639.html

相关文章:

  • 05 线性代数【动手学深度学习v2】
  • 中介者模式与几个C++应用实例
  • imx6ull-驱动开发篇39——Linux INPUT 子系统实验
  • 【基础算法】初识搜索:递归型枚举与回溯剪枝
  • 【ElasticSearch】springboot整合es案例
  • Smooze Pro for mac 鼠标手势增强软件
  • 【C语言练习】青蛙跳台阶
  • Vue状态管理工具pinia的使用以及Vue组件通讯
  • 强光干扰下检出率↑93%!陌讯多模态融合算法在充电桩车位占用检测的实战解析
  • 力扣【1277. 统计全为1的正方形子矩阵】——从暴力到最优的思考过程
  • 【网络运维】Shell脚本编程:函数
  • 深度学习之第二课PyTorch与CUDA的安装
  • AOSP构建指南:从零开始的Android源码之旅
  • Docker 容器(一)
  • 【Docker基础】Docker-compose常用命令实践(三):镜像与配置管理
  • 【零代码】OpenCV C# 快速开发框架演示
  • 电路学习(四)二极管
  • 【计算机视觉】CaFormer
  • Java:LinkedList的使用
  • 【Protues仿真】基于AT89C52单片机的温湿度测量
  • 【文献阅读】生态恢复项目对生态系统稳定性的影响
  • 在JavaScript中,比较两个数组是否有相同元素(交集)的常用方法
  • 解决编译osgEarth中winsocket2.h找不到头文件问题
  • Node.js自研ORM框架深度解析与实践
  • C++11新特性全面解析(万字详解)
  • Starlink第三代终端和第二代终端的差异性有哪些?
  • Flink SQL执行SQL错误排查
  • MySQL的安装和卸载指南(入门到入土)
  • ZKmall模块商城的推荐数据体系:从多维度采集到高效存储的实践
  • 从“小麻烦”到“大难题”:Spring Boot 配置文件的坑与解