cookie,session,token它们到底是怎么一回事?一篇文章,彻底明白!

前言

web1.0强调的是资源的共享:http协议是无状态的

web2.0强调资源的交互:为了防止信息被篡改,请求与请求之间就涉及到了身份的验证

web3.0强调共赢

cookie

cookie是一种客户端存储技术

cookie的产生背景与HTTP协议的无状态特性密切相关。HTTP协议本身无法识别两个请求是否来自同一个浏览器,也无法记住用户之前的活动或状态。为了解决这个问题,需要一种机制来在客户端和服务器之间保持状态,这就是cookie技术诞生的初衷。通过使用cookie,服务器可以在用户的浏览器上存储一些信息,以便在用户进行后续请求时,服务器能够识别并记住用户的状态和偏好。

cookie的运行机制

首先客户端向服务器发起HTTP请求

然后服务器收到请求后处理请求,并在响应数据的响应头中添加上一个cookie响应回客户端

客户端接收到响应后把cookie存储到本地浏览器中

然后在以后的请求中都会自动的携带这个cookie以便让服务器知道我是谁(确认身份)

然后服务器识别请求头中的cookie,服务器根据cookie中的信息,执行相应的操作,如用户认证、个性化设置等

cookie的优缺点

说完cookie的运行机制,那么接下来就分析一下cookie具有哪些优缺点

优点:

  1. 数据持久性:Cookie存储在用户的浏览器中,即使在浏览器关闭后,数据依然可以保持,直到过期或被清除。
  2. 减轻服务器负担:由于Cookie存储在客户端,因此不需要服务器资源来维护状态信息。
  3. 简单性:Cookie基于文本的轻量结构,易于使用和实现。
  4. 安全性:通过加密和安全传输技术(如SSL),可以减少Cookie被破解的可能性。
  5. 扩展性:可以通过编程控制Cookie的大小和生命周期,适应不同的应用需求。
  6. 个性化服务:网站可以根据Cookie中的信息提供个性化服务,如保存用户偏好设置。

缺点:

  1. 大小和数量限制:每个Cookie的大小通常限制在4KB左右,每个域名下的Cookie数量也有限制,通常是20个。
  2. 安全性问题:如果Cookie被拦截或篡改,可能会泄露用户的会话信息。
  3. 用户配置限制:有些用户可能会禁用浏览器接受Cookie的功能,这会限制Cookie的使用。
  4. 不适合存储复杂数据:由于大小和格式的限制,Cookie不适合存储复杂的数据类型。
  5. 每次HTTP请求都会发送:Cookie会在每次HTTP请求中发送,这可能会增加不必要的网络流量和响应时间。
  6. 不能跨域请求: cookie不支持跨域之间的请求,所以在不同域中,cookie无法使用,仍然存在问题

session(会话管理机制):

Session是一种服务器端的存储机制

本质上session还是基于cookie技术来实现的,无非就是session照比cookie增加了一个session ID,你客户端向我服务端发送请求时,我服务端自动的生成一个session保存到我服务端,并且我返还给你客户端一个sessionID,下次客户端再向我发送请求时,会自动的携带上这个sessionID,然后我拿到这个sessionID后,就在我服务端的session中去检查是否存在这样的sessionID,如果有,那么就证明你的身份是对的,我给你放行,如果没有,那就证明你是伪造的sessionID,我就不给你放行,你也就访问不了我数据库中的数据,这样一来,就比cookie的安全性又强了一个等级,但是,也有不好的地方,因为是基于cookie来升级的技术,所以底层的cookie面临的跨域问题,session自然也存在,另外就是,后端要有一个足够大的空间来存储成千上百万个session数据,这样一来,就又多了一大笔开销,而且不同域名之间的请求也不方便。

session的运行机制

首先用户通过浏览器向服务器发送请求,请求可能包含登录信息。然后服务器接收到请求后,就开始验证用户的登录信息。如果用户验证成功,服务器会创建一个新的Session,并生成一个唯一的Session ID。服务器将Session ID发送给用户的浏览器,通常这个ID会存储在Cookie中,但也可以作为URL参数或隐藏表单字段发送。服务器在内存或数据库中存储Session数据,这个数据与Session ID关联。用户在进行后续请求时,浏览器会自动将存储的Session ID发送给服务器(如果存储在Cookie中)。服务器通过接收到的Session ID识别用户的Session,并获取关联的数据。服务器根据Session中的数据来处理用户的请求,例如,如果用户已经登录,服务器可以提供相应的用户界面或数据。服务器可能在处理请求的过程中更新Session数据,例如更新用户的最后活动时间。Session通常有一个过期时间,当用户长时间不活动或显式登出时,Session会被销毁。服务器和浏览器都可以在适当的时候销毁Session,通常是通过设置Session ID为无效或删除存储在浏览器端的Session ID。

session的优缺点:

优点:

  1. 安全性:与Cookie相比,Session数据存储在服务器端,因此更难被用户或第三方访问和篡改。
  2. 存储容量:Session理论上没有大小限制,可以存储大量数据,适合需要存储复杂或大量信息的场景。
  3. 灵活性:服务器可以灵活地控制Session的生命周期和内容,包括创建、更新和销毁Session。
  4. 个性化体验:网站可以根据Session中存储的用户信息提供个性化的用户体验。
  5. 跨设备支持:Session不依赖于客户端浏览器的设置,即使用户禁用了Cookie,Session仍然可以正常工作。

缺点:

  1. 服务器资源:Session数据存储在服务器端,因此会占用服务器的内存或存储资源,尤其是在高并发的情况下。
  2. 扩展性问题:在分布式系统中,Session共享和管理可能会变得复杂,需要额外的配置和优化。
  3. 性能影响:每次用户请求都需要在服务器上查找和验证Session,可能会对服务器性能产生一定影响。
  4. Session丢失:如果用户关闭浏览器或Session过期,Session数据将丢失,需要重新登录或重新创建Session。
  5. 跨域限制:Session通常与创建它的域绑定,不能跨域使用,除非通过一些技术手段实现跨域Session共享。

token (令牌机制)

cookie和session都解决了一些问题,但是也重新引入了更复杂的问题,经过前两种技术手段的锤炼,token令牌技术的诞生绝对是一个开天辟地的事,我直接最精炼的说一下token的机制

你客户端向我服务端发送请求,我对携带过来的登录信息进行编码和签名,生成一个包含用户信息和有效期限的JWT响应给你,我服务器不需要存储任何信息,下次你再向我发送请求时,服务器验证JWT的签名,如果有效,根据JWT中的信息处理请求

JWT的结构

一个JWT实际上由三部分组成,用点(.)分隔:

  1. Header(头部) :描述了令牌的元数据,如使用的签名算法等。

    • 通常格式为:{"alg": "HS256", "typ": "JWT"}
  2. Payload(负载) :包含了所谓的Claims(声明),即关于实体(通常是用户)和其他数据的声明。

    • 例如:{"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
  3. Signature(签名) :用于验证消息在传输过程中未被篡改,并且,对于使用私钥签名的令牌,可以验证发送者的身份。

    • 签名通过使用Header中指定的算法和密钥生成。

JWT的优点:

  • 安全性:JWT可以通过使用强加密算法进行签名,确保数据不被篡改。
  • 简单性:JWT是JSON格式,易于理解和实现。
  • 无状态和可扩展性:由于不需要服务器存储会话信息,JWT适合大规模分布式系统。

JWT的缺点:

  • 性能:JWT通常比传统的会话Token更大,可能会增加请求/响应的大小。
  • 安全性:如果JWT被截获,由于它是自包含的,攻击者可以获取其中的所有信息,除非使用HTTPS。
  • 刷新机制:JWT一旦签发,其内容就固定了,如果需要刷新,必须重新颁发新的JWT。
相关推荐
默默且听风10 分钟前
Express.js中的中间件详解
后端·node.js·express
AskHarries36 分钟前
Spring Boot集成geode快速入门Demo
java·spring boot·后端·geode
知其然亦知其所以然1 小时前
深入Kafka:如何保证数据一致性与可靠性?
后端·面试·kafka
WHYBIGDATA1 小时前
Scala中高级的函数编程
开发语言·后端·scala
吃青椒的小新1 小时前
独一无二的设计模式——单例模式(Java实现)
java·后端·单例模式·设计模式
知识分享小能手1 小时前
从新手到高手:Scala函数式编程完全指南,Scala 访问修饰符(6)
大数据·开发语言·后端·python·数据分析·scala·函数式编程
蝎子莱莱爱打怪2 小时前
maven卸载旧版本3.1.0 并安装新版本3.8.8
后端
肖哥弹架构2 小时前
使用MarshallingView实现自动化的XML响应生成
后端
AskHarries2 小时前
Spring Boot集成findbug快速入门Demo
java·spring boot·后端·findbug
笔触狂放2 小时前
【Django】网上蛋糕项目商城-首页
后端·python·django