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。
相关推荐
源代码•宸6 分钟前
GoLang八股(Go语言基础)
开发语言·后端·golang·map·defer·recover·panic
czlczl200209257 分钟前
OAuth 2.0 解析:后端开发者视角的原理与流程讲解
java·spring boot·后端
颜淡慕潇15 分钟前
Spring Boot 3.3.x、3.4.x、3.5.x 深度对比与演进分析
java·后端·架构
布列瑟农的星空15 分钟前
WebAssembly入门(一)——Emscripten
前端·后端
小突突突2 小时前
Spring框架中的单例bean是线程安全的吗?
java·后端·spring
iso少年2 小时前
Go 语言并发编程核心与用法
开发语言·后端·golang
掘金码甲哥2 小时前
云原生算力平台的架构解读
后端
码事漫谈2 小时前
智谱AI从清华实验室到“全球大模型第一股”的六年征程
后端
码事漫谈2 小时前
现代软件开发中常用架构的系统梳理与实践指南
后端
Mr.Entropy2 小时前
JdbcTemplate 性能好,但 Hibernate 生产力高。 如何选择?
java·后端·hibernate