文章目录

  • Web 安全与系统设计
    • Web存在的问题:Web 是无状态的
    • 解决方案
      • 一、早期解决方案:Session + Cookie 的诞生
      • 二、第二阶段:Token 的出现(前后端分离 + 移动端的解决方案)
      • 三、分析总结:
        • 1.早期版本:session+cookie存在的问题分析
          • ①分布式服务
          • ②非浏览器和前后端分离场景
        • 2.总结

Web 安全与系统设计

Web存在的问题:Web 是无状态的

HTTP 协议是“无状态”的,意思是:每次请求都是独立的,服务器不会自动记住“上一次是谁来的”。

举例说明:
你访问了电商首页,下一步点进购物车,但服务器根本“不知道你是刚才那个访问首页的人”。

🚨 于是问题来了:

  • 登录一次后,如何在后续请求中识别你是谁?
  • 登录后你是“管理员”还是“普通用户”,怎么让系统知道?
  • 如何控制你能不能查看某些敏感信息?

这就是认证、授权、鉴权、Session、Cookie、Token、鉴权这些概念诞生的原因。

解决方案

一、早期解决方案:Session + Cookie 的诞生

Session

  • 服务端用来保存“用户的登录状态”
  • 登录后创建一个 session,里面保存用户信息(比如用户名、权限)

Cookie

  • 浏览器存储的“小纸条”,由服务器发给客户端
  • 浏览器下次访问自动带上,服务器通过它知道“你是谁”

Session + Cookie 工作流程:

  • 用户登录成功,服务器保存一个 Session(如:userId=1)
  • 服务器发送一个 Cookie:Set-Cookie: sessionId=abc123
  • 浏览器保存 Cookie
  • 后续每次请求都自动带上 Cookie
  • 服务器根据 sessionId 找回用户信息

场景适合:

  • 传统网站:如早期的 JSP、PHP、ASP 网页
  • 登录状态依赖服务端 Session 内存或 Redis

⚠️ 问题:

  • Session 保存在服务端,不好扩展(如分布式服务)
  • 前后端不分离,适合页面渲染型项目,不适合 App / 移动端

二、第二阶段:Token 的出现(前后端分离 + 移动端的解决方案)

为什么需要 Token?

  • 前端 Vue/React,后端 SpringBoot 分开部署
  • 客户端不能自动发送 Cookie(安全或跨域问题)
  • 希望服务器是无状态的,方便横向扩展、容灾

什么是 Token?

  • 一段字符串,用来代表用户身份
  • 登录成功后由服务器生成,发给前端
  • 前端以后每次请求都带上 Token(放在请求头)

JWT(JSON Web Token):主流 Token 形式

  • 格式固定、支持加密、不易伪造
    -通常结构为三段:header.payload.signature

Token 登录流程:

  • 用户输入账号密码,后端验证成功
  • 后端生成 Token 返回前端
  • 前端存到 localStorage 或 sessionStorage
  • 每次请求都在请求头加上 Token
  • 后端解析 Token,识别用户身份

适合场景:

  • 前后端分离的 Web 系统
    -移动端、小程序、App
    -分布式系统、微服务架构

三、分析总结:

1.早期版本:session+cookie存在的问题分析
①分布式服务

早期session+cookie无法解决分布式服务的原因:
举例如下:
你的服务不止部署在一台服务器上,而是:

用户请求 → 随机到 A 服务器 或 B 服务器 或 C 服务器(负载均衡)

Session 是默认保存在“当前服务器内存中的”,也就是说:

  • 用户第一次登录 → 分配到 A 服务器 → A 创建了一个 Session
  • 用户第二次请求 → 分配到 B 服务器 → B 根本没有 A 上那个 Session!

结果:用户虽然登录了,但在 B 看来是“未登录”,因为找不到 Session。

优雅解决:Token 模式
因为JWT 是“无状态”的,后端服务使用同一套验证机制。

验证过程:

  • 用户登录后,生成的 JWT Token 本身就包含用户信息(如 userId、role)
  • 后端只需验证 Token 是否有效,就能识别身份,无需存任何会话
  • 不需要服务器保存登录状态:哪台服务器收到请求都能独立完成校验 → 完全支持分布式!
②非浏览器和前后端分离场景

App、小程序不会自动携带 Cookie

  • Session 模式依赖浏览器自动发送 Cookie(尤其是跨页面请求)
  • 但 App / 小程序 / Postman 这类非浏览器客户端 不会自动管理 Cookie
  • 即使发送了,也很容易出现“session 丢失”、“登录失效”等问题

前后端分离:

  • 前后端分离中,前端(如 localhost:8080)和后端(如 api.xx.com)是不同域名
  • 跨域访问默认不会携带 Cookie

token优势

Token 模式特点对应优势
登录后发一个 Token(如 JWT)不依赖 Cookie,跨域没问题
Token 放在前端(localStorage、App 本地)多端可统一管理
每次请求手动带上 Authorization: Bearer xxx客户端完全控制,通用性强
服务端无状态(不用保存登录信息)更适合分布式架构、微服务系统
网关统一拦截 Token 验证方便统一接入与安全控制
Token 结构中可附带用户信息(如 userId、role)减少服务端查询
2.总结
项目Session + Cookie(传统方式)Token(现代方式)
客户端是否自动带登录信息✅ 浏览器自动带 Cookie❌ 客户端需手动加 Header
是否依赖浏览器✅ 是❌ 否,通用性强
是否易于跨域❌ 需特殊配置✅ 天然支持
是否需要服务端保存状态✅ 需要❌ 无状态
是否适合分布式架构❌ 不适合✅ 适合
是否适合前后端分离❌ 不适合✅ 非常适合
是否适合 App、小程序等❌ 不适合✅ 非常适合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910432.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910432.shtml
英文地址,请注明出处:http://en.pswp.cn/news/910432.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FlutterUnit TolyUI | 布局游乐场

FlutterUnit 基于 TolyUI 大大简化了界面构建的代码复杂程度,因此之前想要实现的一些小功能,就可以轻松支持。布局游乐场是通过交互的方式来 直观体验 组件的布局特性,从而更易学和掌握。目前 FlutterUnit 已在 知识集录模块新增了 布局宝库&…

【数据分析一:Data Collection】信息检索

本节内容含有各典型数据集的推荐,以及其网址,大家根据需要自取 一、检索 最简单、最灵活的数据获取方式就是依靠检索: Google:更适合搜索英文信息 Google Dataset Search(Google 数据集搜索) 网址&…

23.ssr和csr的对比?如何依赖node.js实现

1.为什么说ssr 的node中间层请求速度快。相当于内网? 那vue.js加载怎么没有ssr和csr的说法啊 第一问:为什么说 SSR 的 Node 中间层请求速度快?是不是相当于内网? ✅ 是的,本质上就是「内网请求」,所以更快…

力扣刷题(第六十四天)

灵感来源 - 保持更新,努力学习 - python脚本学习 第一个错误的版本 解题思路 初始化左右边界:左边界 left 1,右边界 right n。二分查找循环: 计算中间版本号 mid。若 mid 是错误版本,说明第一个错误版本在 [le…

【图像处理入门】11. 深度学习初探:从CNN到GAN的视觉智能之旅

摘要 深度学习为图像处理注入了革命性动力。本文将系统讲解卷积神经网络(CNN)的核心原理,通过PyTorch实现图像分类实战;深入解析迁移学习的高效应用策略,利用预训练模型提升自定义任务性能;最后揭开生成对抗网络(GAN)的神秘面纱,展示图像生成与增强的前沿技术。结合代…

C++法则4: 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。

C法则4: 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。 拷贝构造函数的定义: 第一个参数是自身类类型的引用: 必须是引用(通常为const引用&…

从头搭建环境安装k8s遇到的问题

基本信息 master节点IP: 172.31.0.3 node01节点IP:172.31.0.4 node02节点IP:172.31.0.5 子网掩码:255.255.0.0 网关:172.31.0.2 DNS:114.114.114.114 安装前要检查的信息 检查三台主机的mac地址是否重复&#xff1a…

Flask入门指南:从零构建Python微服务

1. Flask 是什么? Flask 是一个 微框架(Microframework),特点包括: 轻量灵活:核心仅包含路由和模板引擎,其他功能通过扩展实现易于学习:代码直观,适合快速开发小型应用…

【LINUX网络】网络socet接口的基本使用以及实现简易UDP通信

根据本系列上两篇关于网络的初识介绍,现在我们开始实现一个UDP接口,以加强对该接口的理解。 1 . 服务器端 在本篇中,主要按照下面内容来实现: 创建并封装服务端:了解创建服务端的基本步骤 创建并封装客户端&#xff0…

MySQL的索引事务

索引 是什么 类似于目录,提高查询的速度,但是本身会占用空间,增删数据的时候也需要维护索引。所以查询操作频繁的时候可以创建索引。如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创…

安卓9.0系统修改定制化____第三方美化 bug修复 移植相关 辅助工具 常识篇 八

在修改rom中。有时候不可避免的需要对系统进行美化以及一些第三方系统的bug修复。在操作前需要了解系统的一些基本常识。例如同平台移植 跨平台移植以及内核移植 apk反编译等等相关的知识。今天解析的这款工具虽然不是直接面向安卓9.0.但对于了解以上的一些必备常识还是不错的 …

云服务器与物理服务器对比:选择最适合的业务服务器解决方案

更多云服务器知识,尽在hostol.com 在现代 IT 基础设施中,云服务器与物理服务器是两种常见的服务器解决方案。随着云计算技术的迅猛发展,越来越多的企业开始转向云服务器,但也有一些企业仍然坚持使用物理服务器,尤其是…

【redis使用场景——缓存——双写一致性】

redis使用场景——缓存——双写一致性 双写一致性问题的本质与场景典型不一致场景分析​​并发写操作导致的不一致​​​​读写交叉导致的不一致​​​​主从同步延迟导致的不一致​​ 解决延迟双删策略(推荐)优点​​:​​缺点​​&#xff…

【ArcGIS】在线影像底图调用

【ArcGIS】在线影像底图调用 一、 历史影像的调用二、ArcGIS online底图调用三、结语 一、 历史影像的调用 ESRI官方推出了World Imagery Wayback是一个提供全球范围内历史影像的在线服务。 官网地址:https://livingatlas.arcgis.com/wayback/ 操作步骤&#xff1…

密度估计:从零星足迹重建整体画像

想象你是一位侦探,案发现场只留下几个零散的脚印。**如何通过这些碎片,推断嫌疑人的身高体重?甚至预测他下一步的藏身之处?** 这种从局部反推整体的能力,正是**密度估计(Density Estimation)** …

B004基于STM32F401单片机简易交通灯实训数码管显示设计仿真资料

视频演示地址:https://www.bilibili.com/video/BV1GvNDzFEd9/ 运行环境 仿真软件:proteus8.17(切记别的版本不能运行) 编程软件:MDK525 STM32 cubmx版本:6.11.1(切记别的版本不能运行) 原理图画图软件:AD10 功能说明: 以STM32F401CB单片机为核心简易交通灯功能如下。…

没掌握的知识点记录

1、微内核的主要优点在于结构清晰、内核代码量少,安全性和可靠性高、可移植性强、可伸缩性、可扩展性高;其缺点是难以进行良好的整体优化、进程间互相通信的开销大、内核功能代码不能被直接调用而带来服务的效率低。 2、题目: 分页内存管理…

linux 远程终端执行qt应用显示到接入的物理显示器上

在显示器打开终端执行: xhost local: 在远程终端执行: export DISPLAY:0然后在终端执行qt应用就可以。 xhost local: 功能:允许本地用户(local:)访问 X 服务器(X11 图形系统)。 原理&#xf…

【AI驱动网络】

一、AI 驱动网络 1.1 什么是网络 1.1.1、网络的定义 ​网络是由若干节点​(如计算机、服务器、移动设备等)和连接这些节点的链路​(有线或无线传输介质)构成的系统,用于实现地理位置分散的独立设备之间的信息交换、资源共享与协同工作。在计算机领域,网络是信息传输、…

Python期末速成

一.基础内容 赋值语句: a 1 b "mayday" 标识符规则: 1.字母,数字,下划线,汉字组成。但数字不能开头 2.不能是保留字 3.特殊符号不行,*¥^等 注释是在语句前面加# …