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

cookie,session,token之间有什么关系

系列文章目录

http起初设计是无状态的,后来需要让请求和请求之间建立起有状态的联系,所以cookie应运而生,后面又有了session,token,但是最初我们想要解决的是请求和请求之间建立起有状态的联系,状态在哪里呢,要么在服务端,要么在客户端

再专业一点描述:
HTTP 协议最初是无状态的,这意味着服务器无法自动记住用户的状态。为了在多个请求之间建立有状态的联系,Cookie 应运而生,它将部分状态信息存储在客户端。随后,为了解决 Cookie 的安全性和扩展性问题,引入了 Session,它将状态信息存储在服务端。再后来,随着分布式系统的发展,Token(如 JWT)逐渐成为一种更轻量、更灵活的解决方案,它将状态信息封装在客户端,服务端只需验证 Token 的有效性即可。因此,无论状态存储在服务端还是客户端,其核心目标都是实现请求之间的状态关联。

文章目录

  • 系列文章目录
  • 一、cookie
  • 二、session
  • 三、token


一、cookie

在这里插入图片描述

cookie是存储在用户浏览器端的一个小型数据文件,用于跟踪和保存用户的状态信息
以上面截图为例,把一些信息放到cookie里,服务器就知道这个请求是谁发的了,cookie携带大量明文信息,不安全,所以又出现了session,但是最初我们想要解决的是请求和请求之间建立起有状态的联系

二、session

session把用户的会话信息存储在服务端,然后给客户端一个sessionid.
每个用户会话都会有一个唯一的session id,主要用于跟踪用户在服务器上的状态信息, 服务器接收到客户端的请求,就可以根据sessionid来识别这是来自于哪个用户的了

所以session特点是:存储在服务器端,然后对应的sessionid 通过cookie保存在客户端浏览器中。这种把状态信息存储到服务器中使得服务器有状态了。

但是有一个问题,服务器通常都是集群模式的,如果session存在某一台机器上,但是下一次请求被分配到其他机器,那么其他机器怎么同步session信息呢?
解决方式:
session 复制,每一台机器都存一份,容易产生冗余,有额外的开销,
session sticky,如果你的请求一直黏在某一个服务器,那么之后所有请求都被分到那一台服务器。如果服务器挂了,请求被分到B服务器,这样一来用户信息又丢失了。可以把session 放到第三方存储,比如redis。

三、token

Token 的出现主要是为了替代 Session,因为 Session 是有状态的,需要服务器存储用户信息,难以在分布式系统中扩展。而 Token 是无状态的,所有信息都包含在 Token 中,客户端每次请求都携带 Token,服务器只需验证其有效性即可,大大提升了系统的可扩展性和灵活性。此外,Token 更适合移动端、跨域访问以及现代身份认证体系(如 OAuth、JWT)

所以服务端颁发给用户的签过名的凭证,就是token.
token存在客户端,并在请求中传递,用来证明用户的身份或者权限。
所以服务器此时是无状态的,客户端有状态,有了token之后由于服务器无状态,所以在分布式系统随便扩展。

特性:
自包含:token,尤其是jwt通常自包含了用户的身份和权限信息,无需服务器存储会话数据
过期和刷新:有过期时间,用户需要重新登录或者通过刷新token获取新的token
安全性:token可以进行加密和签名,以保护内容不被篡改,并验证其来源的合法性

http://www.dtcms.com/a/349059.html

相关文章:

  • 大模型知识--Function Calls
  • Kubernetes — 学习 Sidecar 容器模式
  • 面经-自用
  • CVPR 2025 | 医学影像加速进化:深度学习×多模态,精准诊断再升级
  • Transformer 模型详解:从自注意力到编码器-解码器结构
  • 拓展:simulink中将仿真环境离散化
  • 关于熵减 - 飘升机
  • Vue3路由
  • C++11新特性全面解析(万字详解)
  • SQL Server从入门到项目实践(超值版)读书笔记 24
  • 详细的周任务清单(Week1-Week24,每周具体目标+任务)
  • Pod 生命周期:从创建到销毁的完整旅程
  • Linux shell编程初步认知与变量学习
  • 【基础算法】初识搜索:递归型枚举与回溯剪枝
  • 基于 Bright Data MCP + LangChain 构建实时网页问答 AI Agent:完整实战教程
  • 玩转深度学习数据填补!CNN-GRU组合模型数据填补(四个案例数据)
  • KVM虚拟化部署全攻略
  • 使用Python实现DLT645-2007智能电表协议
  • 【Docker基础】Docker-compose常用命令实践(三):镜像与配置管理
  • 纯净Win11游戏系统|24H2专业工作站版,预装运行库,无捆绑,开机快,游戏兼容性超强!
  • 27.编程思想
  • 【JVM内存结构系列】四、不同垃圾回收器与堆内存的适配关系:从分代GC到Region GC
  • kylin10-x64 离线安装docker28.3.3
  • 第16届蓝桥杯C++中高级选拔赛(STEMA)2025年3月9日真题
  • 互联网大厂Java面试模拟:核心技术点深度解析
  • 深度剖析Spring AI源码(四):RAG的基石,解密VectorStore的统一抽象
  • 冯·诺依曼体系结构
  • 【机器学习】5 Bayesian statistics
  • AOSP构建指南:从零开始的Android源码之旅
  • 青少年软件编程(python六级)等级考试试卷-客观题(2024年6月)