cookie、session、token的实现机制(并用生活中事物进行举例)
Cookie
Cookie 是一种由浏览器存储的,跨域名、跨服务器的数据。当用户访问一个网站时,网站会将一些数据添加到用户的 Cookie 中,在用户下一次访问该网站时,浏览器会自动将 Cookie 发送给服务器。
举例来说,假设 Cookie 就像是一个小本子,里面记录着你喜欢吃的零食。当你第一次去一个店铺买零食时,店家就会在你的小本子上记下这个店铺的名字和你购买的零食种类和数量。下一次你再去这个店铺时,店家会查看你的小本子,发现你喜欢这家店的零食,就会给你推荐一些新品,从而提供更好的服务。
Cookie 的优点是
实现简单,可以保存较小的数据,存储在客户端,在多个页面中共享数据,
但它也有缺点:
容量有限,容易被篡改,敏感信息存在被盗窃的风险。
Session
Session 是服务器上的一块内存或文件,用于存储客户端与服务器之间的会话信息。当用户首次与服务器通信时,服务器会为其生成一个唯一的 Session ID,并将其存储在用户的 Cookie 中。在随后的每一次请求中,用户的浏览器都会将该 Session ID 与服务器通信,从而帮助服务器识别用户。
以购物为例,如果 Cookie 是一个小本子,那么 Session 就像是购物车。当你选购商品时,商品会被添加到购物车中。当你离开店铺并返回时,购物车中的商品仍然存在。Session 的特点是可以存储较大的数据,并且更安全,因为敏感数据存储在服务器上,而不是客户端。
Session 的优点是安全性高、存储容量大、对服务器的压力较小,
但它也有缺点,比如需要在客户端和服务器之间频繁传输数据,会增加网络传输的负担。
Token
Token 是一种用于身份验证的令牌,由服务器生成并存储在客户端上。当用户首次向服务器发送请求时,服务器将生成一个唯一的 Token,并将其存储在客户端的 Cookie 中。每次客户端向服务器发送请求时,都必须携带该 Token,以便服务器对客户端的请求进行身份验证。
假设你要去机场乘坐飞机,每次乘坐需要通过安全检查。安检员会在你的手腕上贴上一张带有机器码的标签,这个标签就像是 Token。当你需要通过安检时,需要将手腕放在扫描器上,以便安检员对你的身份进行确认。
Token 的优点是不会受到 XSS 攻击的影响,并且可以在多个域名之间共享,同时 Token 的服务器端存储解决了 Session 存储容量过大的问题。但 Token 的实现需要一定的算法实现,会增加开发工作量。
以上是三种常见的身份验证机制的实现机制和举例。
它们各有优缺点,选择使用应根据具体场景和安全需求来决定。
JWT的token是如何形成的?他是如何工作的?
JWT,即 JSON Web Token,是一种用于在网络环境中安全地传递信息的开放标准。它由三个部分组成:头部(header)、载荷(payload)和签名(signature)。具体而言:
头部包含了指定该 JWT 使用的算法(例如 HMAC SHA256 或 RSA),它通常由两部分组成:令牌类型和所使用的加密算法,在 Python 中通常是以字典形式存储的。
载荷包含了它所描述的实体(例如一个用户或一组数据)的一些基本信息,如用户名或所属组织,它通常由两部分组成:标准声明和自定义声明,在 Python 中通常是以字典形式存储的。
签名是将头部和载荷中的数据进行加密后所得到的字符串,用于验证 JWT 是否未被篡改过。签名包含了加密算法和使用该算法生成的哈希值,在 Python 中可以使用 Python 内置的 hmac 库或 PyJWT 库来生成签名。
在使用 JWT 的过程中,通常是将 payload 中携带的数据按照一定规则加密,并附加上头部和签名信息。具体来说,使用 HMAC SHA-256 或 RSA 等算法,将头部和载荷以及一个密钥(secret)作为输入,生成签名字符串并将签名信息添加到 JWT 字符串的末尾。
工作过程如下:
- 用户访问登录页面,输入账号密码提交登录请求。
- 服务器验证账号密码的正确性,如果验证通过,生成一个包含该用户信息的 JWT 并返回给客户端。
- 客户端收到 JWT 后,将其保存在 Cookie 或 Local Storage 中,并在后续请求中将 JWT 在请求头或参数中发送给服务器。
- 服务器在接收到请求后,从请求头或参数中获取 JWT,并进行验证,包括 jwt 格式、jwt 加密算法和密钥、过期时间等,如果验证通过,则认为该请求是合法的,并继续处理,否则认为非法请求。
- 处理完请求后,服务器将返回相应的响应给客户端(如 JSON 数据或网页内容)。
- 当客户端再次请求相应资源时,必须在请求头或参数中附带有效的 JWT ,否则服务器将拒绝该请求。
JWT 既达到了减少服务器查询数据库的作用,也保证了用户的信息安全。