社区活动
官方社群
交流群:250325468
公众号:粟米前端
哔哩哔哩:粟米前端
token 是放到 cookie 里好 还是放到 session里好
sumiLV2 4月22日 14:58 阅读 151 回答 3 回复 3 点赞 0
151 3 3 0

各自的优缺点是什么

扫码分享到移动端
3个回答,3 条回复:
破晓★晨曦LV2 回答于 6月9日 11:27

放到Header里面

2A5FLV4 回答于 4月22日 19:45

session 本身就需要一个 token, 用 token 去找 token,多此一举

粟米社区小李LV5 回答于 4月22日 17:38 最后更新于 4月25日 02:45
3人赞同了该回答

1、session和cookie的特点

session

  • 服务器会为每一个浏览器会话,分配一个独立的session。当前会话,可以利用服务器分配的专属session,存取数据,数据存储在服务器端。
  • 当我们重启浏览器,再请求服务器,这时候服务器会判定当前浏览器为一个新的会话,重新分配session。
  • session也可设置过期时间,当会话超过设定的时长没有活动,session也会自动过期。

cookie

  • cookie的数据存放在客户端浏览器中。
  • 在每次http请求中,request header中都会自动带上cookie,无需手工传递。服务端可根据客户端request,获取客户端发送过来的cookie信息。
  • 重启浏览器,cookie自身只要没过期,就依旧存在。所以cookie数据可以跨越浏览器会话。

他们俩通常不是二选一,而是相互结合。例如最常见的sessionId,通常就会存放在cookie中,并在会话过程中,每次请求都自动回传sessionId。服务器会校验sessionId是否过期,来判断当前请求是否合法。

2、回到问题,token放到cookie里好还是session里好?

假设你这个token,是自定义的用于请求后端服务必传的授权参数。

客户端的方案

  • 在客户端首次获取到了服务端颁发的token后,接下来的时间里,客户端需要解决的问题就是,如何在每次请求时,带上这个必传参数token。
  • 把token存放在页面变量中,显然不是个好的做法,每次页面刷新,变量就会丢失。
  • 所以,客户端启用cookie的情况下,cookie是个很好的方案。类似的替代方案,新支持的localStorage也是可以的,但是需要手工去读取、传参。

服务端的方案

  • 服务端有两个问题需要解决——token的生成和校验。
  • token的生成,可以设计成根据session生成,也就是为当前会话颁发token。也可以根据其他标志生成,例如用户Id、手机号、设备标志等参数。
  • token的校验,常见的可以设计成白名单校验。服务器维护一份有效的token名单,校验客户端传递过来的token是否在白名单中,以识别token的有效性。
    • 如果你的token根据session颁发,你可以直接借助session来简单实现这个白名单,例如判断当前会话中session["token"]是否等于客户端传递过来的token,也可以将这份白名单,额外存放在内存中、数据库中或文件中。
    • 如果你的token不是根据session颁发,那么白名单存储和校验完全可以放飞自我。
  • token的校验,还有的做法是通过算法验签。token是包含了时间戳等核心参数的加密信息,通过加密和解密的过程来校验token有效性。这种方案,不依赖数据存取。

另外,当你的应用上了一定规模,不太推荐用session,因为应用服务器采用了分布式部署和负载均衡后,多服务器之间共享session就比较麻烦。

参与回答互动
登录即可参与回答和互动哦