前言
web1.0强调的是资源的共享:http协议是无状态的
web2.0强调资源的交互:为了防止信息被篡改,请求与请求之间就涉及到了身份的验证
web3.0强调共赢
cookie
cookie是一种客户端存储技术
cookie的产生背景与HTTP协议的无状态特性密切相关。HTTP协议本身无法识别两个请求是否来自同一个浏览器,也无法记住用户之前的活动或状态。为了解决这个问题,需要一种机制来在客户端和服务器之间保持状态,这就是cookie技术诞生的初衷。通过使用cookie,服务器可以在用户的浏览器上存储一些信息,以便在用户进行后续请求时,服务器能够识别并记住用户的状态和偏好。
cookie的运行机制
首先客户端向服务器发起HTTP请求
然后服务器收到请求后处理请求,并在响应数据的响应头中添加上一个cookie响应回客户端
客户端接收到响应后把cookie存储到本地浏览器中
然后在以后的请求中都会自动的携带这个cookie以便让服务器知道我是谁(确认身份)
然后服务器识别请求头中的cookie,服务器根据cookie中的信息,执行相应的操作,如用户认证、个性化设置等
cookie的优缺点
说完cookie的运行机制,那么接下来就分析一下cookie具有哪些优缺点
优点:
- 数据持久性:Cookie存储在用户的浏览器中,即使在浏览器关闭后,数据依然可以保持,直到过期或被清除。
- 减轻服务器负担:由于Cookie存储在客户端,因此不需要服务器资源来维护状态信息。
- 简单性:Cookie基于文本的轻量结构,易于使用和实现。
- 安全性:通过加密和安全传输技术(如SSL),可以减少Cookie被破解的可能性。
- 扩展性:可以通过编程控制Cookie的大小和生命周期,适应不同的应用需求。
- 个性化服务:网站可以根据Cookie中的信息提供个性化服务,如保存用户偏好设置。
缺点:
- 大小和数量限制:每个Cookie的大小通常限制在4KB左右,每个域名下的Cookie数量也有限制,通常是20个。
- 安全性问题:如果Cookie被拦截或篡改,可能会泄露用户的会话信息。
- 用户配置限制:有些用户可能会禁用浏览器接受Cookie的功能,这会限制Cookie的使用。
- 不适合存储复杂数据:由于大小和格式的限制,Cookie不适合存储复杂的数据类型。
- 每次HTTP请求都会发送:Cookie会在每次HTTP请求中发送,这可能会增加不必要的网络流量和响应时间。
- 不能跨域请求: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的优缺点:
优点:
- 安全性:与Cookie相比,Session数据存储在服务器端,因此更难被用户或第三方访问和篡改。
- 存储容量:Session理论上没有大小限制,可以存储大量数据,适合需要存储复杂或大量信息的场景。
- 灵活性:服务器可以灵活地控制Session的生命周期和内容,包括创建、更新和销毁Session。
- 个性化体验:网站可以根据Session中存储的用户信息提供个性化的用户体验。
- 跨设备支持:Session不依赖于客户端浏览器的设置,即使用户禁用了Cookie,Session仍然可以正常工作。
缺点:
- 服务器资源:Session数据存储在服务器端,因此会占用服务器的内存或存储资源,尤其是在高并发的情况下。
- 扩展性问题:在分布式系统中,Session共享和管理可能会变得复杂,需要额外的配置和优化。
- 性能影响:每次用户请求都需要在服务器上查找和验证Session,可能会对服务器性能产生一定影响。
- Session丢失:如果用户关闭浏览器或Session过期,Session数据将丢失,需要重新登录或重新创建Session。
- 跨域限制:Session通常与创建它的域绑定,不能跨域使用,除非通过一些技术手段实现跨域Session共享。
token (令牌机制)
cookie和session都解决了一些问题,但是也重新引入了更复杂的问题,经过前两种技术手段的锤炼,token令牌技术的诞生绝对是一个开天辟地的事,我直接最精炼的说一下token的机制
你客户端向我服务端发送请求,我对携带过来的登录信息进行编码和签名,生成一个包含用户信息和有效期限的JWT响应给你,我服务器不需要存储任何信息,下次你再向我发送请求时,服务器验证JWT的签名,如果有效,根据JWT中的信息处理请求
JWT的结构
一个JWT实际上由三部分组成,用点(.)分隔:
-
Header(头部):描述了令牌的元数据,如使用的签名算法等。
- 通常格式为:
{"alg": "HS256", "typ": "JWT"}
- 通常格式为:
-
Payload(负载):包含了所谓的Claims(声明),即关于实体(通常是用户)和其他数据的声明。
- 例如:
{"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
- 例如:
-
Signature(签名):用于验证消息在传输过程中未被篡改,并且,对于使用私钥签名的令牌,可以验证发送者的身份。
- 签名通过使用Header中指定的算法和密钥生成。
JWT的优点:
- 安全性:JWT可以通过使用强加密算法进行签名,确保数据不被篡改。
- 简单性:JWT是JSON格式,易于理解和实现。
- 无状态和可扩展性:由于不需要服务器存储会话信息,JWT适合大规模分布式系统。
JWT的缺点:
- 性能:JWT通常比传统的会话Token更大,可能会增加请求/响应的大小。
- 安全性:如果JWT被截获,由于它是自包含的,攻击者可以获取其中的所有信息,除非使用HTTPS。
- 刷新机制:JWT一旦签发,其内容就固定了,如果需要刷新,必须重新颁发新的JWT。