趣解session、cookie、token

学如逆水行舟,不进则退

前言

实例引入

假设A使用淘宝购物,当A打开淘宝时,进入登录模块需要输入账号密码登录,选定商品添加到购物车后,付款时进入订单模块,又需要再次输入账号密码登录,才能成功支付。

为什么到订单模块需要再次登录?

因为http是一个无状态协议,无法确定发起支付请求的用户和A是同一个,所以需要登录验证。

存在问题?

用户无体验感,假如每次购物都需要进行验证,会造成系统延迟,占用时间空间做无用功。占用资源,频繁的做一些重复验证,极大消耗系统软硬件资源。

  1. 会话

http本身是无状态协议,服务器无法识别每一次的http的出处,他只会接收到一个请求信息,所以就存在一个问题:要将用户的响应返回给相应的用户,必须有一个技术让服务器知道这个请求来自哪里,这个技术就是会话技术。会话技术是客户端和服务端之间发生的一系列连续请求和响应的过程。会话状态指服务器和浏览器在会话过程中产生的状态信息,借助会话状态,服务器能够把属于同一次会话的请求和响应关联起来。

实现会话

session

session通过在服务端记录信息确定用户身份,客户端访问服务器时,服务器把客户端信息以某中形式存在session中。。属于同一次会话的请求都有一个相同的标识符sessionID。客户端再次访问时(发起请求)时只需要通过sessionID从session查出用户的状态就可以了。

后端如何把sessionID返回给客户端?

cookie

可以通过设置cookie的方式返回给客户端。Cookie是服务器在http响应中携带的一个文本文件(<=4kb)。一但浏览器保存了某个cookie,在之后的请求和响应过程中,会将这个cookie来回传递,这样就可以通过cookie完成B/S的数据交互。

流程

使用session进行认证时,当用户第一次通过浏览器使用用户名和密码访问服务器时,服务器会验证用户数据,成功后会在服务端将用户信息写入session,向客户返回sessionID(就是cookie),当用户再次访问时会携带sessionID,服务器会拿着sessionID从session中查询用户信息,在将信息返回,从而实现状态保持。

弊端
  1. 服务器亚历山大

通常session是存储在服务器内存中的,每个用户认证成功后,都会将自己的session存在服务器内存中,随着用户不断增加,服务器存储压力就会不断增大,直至崩溃。

  1. CSRF跨站伪造请求攻击

sessionID是存在cookie中的,假设cookie被截取,用户就很容易收到跨站请求伪造攻击。

跨站(Cross-Site)指的是攻击者利用用户已经登录了受信任的网站的身份来进行攻击。这种攻击方式利用了第三方站点对已登录用户的信任,向受信任站点发送伪造请求,从而让用户的浏览器执行恶意操作。
例如,攻击者可以在第三方站点上构建一个钓鱼页面,让用户在不知情的情况下点击链接或提交表单。当用户打开钓鱼页面时,内部 JavaScript 代码会自动向受信任站点发送恶意请求,并携带伪造的 CSRF token。由于用户已经登录了受信任站点,服务器会认为该请求是合法的,并执行相应的操作。

  1. 可扩展性差

例如项目部署在多个服务器上,user1访问了A服务器,就会在A中存储相应的session。下次user1访问B服务器,又会在B上存储一个session,同一个用户就造成两个sessionID的情况。

如果选择访问A时,将session存在数据库中,下次访问B时从数据库中读取,那么就又回到了问题1,随着用户数增加,在服务端要用多大的数据库去存储session呢?

token

为解决上面问题,提出新的技术Token,它的意思是"令牌",是服务端生成的一串加密字符串(不保存),作为客户端请求的一个标识。当用户第一次登录后,服务器会生成一个token,并将此token返回给客户端,以后用户只需要带上这个token去请求数据即可。

流程

浏览器将token存储在localStorage中,当用户访问时,服务端对请求的token进行解密,机密成功后,进行用户数据(账号、密码等信息)查询,查询成功则认证成功,就实现了状态保持,所以,即使有多台服务器,服务端也只是做了token解析和用户数据查询,不需要在服务端保留用户的认证、会话信息,就意味着基于token的认证机制不需要考虑用户在那一台服务器登录。

无状态token(时效性)

一个用户登录后,会生成相应的token,但这个token不会一直有效,它是有一个时间范围限制,如果一直有效,当token被窃取后就会存在安全隐患,这也变相解释了为什么有的网站登录后,几天内可以再次访问可以不用登录,直接进入,而间隔一个月或更久时,就需要重新认证。

总结

token是无状态的,后端不需要记录信息,每次请求过来进行解密就能得到对应信息。
 
session是有状态的,需要后端每次去检索id的有效性。不同的session都需要进行保存,但也可以设置单点登录,减少保存的数据。
 
session与token的选择是空间与时间博弈,为什么这么说呢,是因为token不需要保存,不占存储空间,但每次访问都需要进行解密,消耗了一定的时间。
 
在一般的前后端分离项目中,token展现出了它的优势,成为了比session更好的选择

扩展说明

localStorage 是一种 HTML5 Web 存储机制,允许 Web 应用程序在用户的浏览器中存储键值对。
localStorage 可以储存比 Cookie 更多的数据,它不会被发送到服务器端同时能够在浏览器关闭后依然存在。这使得 localStorage 成为一种非常方便的方式来存储和检索 Web 应用程序的数据,且不需要每次都向服务器发送请求。
localStorage 存储的数据是基于域名的。也就是说,同一域名下的页面可以通过 localStorage 在浏览器中共享数据。使用 localStorage 非常简单,只需调用其提供的 API 来读取、设置、更新或删除相应的键值对即可。
需要注意的是,由于 localStorage 中存储的数据只是保存在客户端本地浏览器,因此不应该将敏感信息存储在其中,以免被其他人恶意获取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值