【HTTP知识】cookies、session、token的区别

cookies、session、token的区别

  • cookies和session很多人都喜欢分开来讲,显然不太合适,只要讲清楚两者的合作关系,然后再讲独立性,就挺好的

cookies、session的协作关系

  • 当客户端发送请求,携带了登录的账号和密码的时候,会触发一个set cookies的机制请求,服务器验证ok的之后,会给客户端返回一个session-id
  • 对于服务器来说,首先发送session-id之前,会去建立一张表格,表格字段有session-id,这个id是一大串唯一的字符串,随机生成,还有字段session-value,用来存储用户信息,比如user=tongtong&expire_time=10000second,user_type=普通用户
  • 然后session-value就会通过加密算法,比如base64,那么session-value就会从user=tongtong&expire_time=10000second,user_type=普通用户 变成了一长串字符串
  • 服务器就把属于tongtong这个用户的session-id发给客户端了
  • 当客户端下次请求的时候,就会携带cookies:session-id=xxxxxxxx
  • 服务器拿到之后,获取session-id,然后通过表select session-value where session-id=xxxxxx,如果找到了value,就对value进行base64解密,后端去处理几个值,user值(你到底是谁),过期时间值(expire_time,这个session-id的有效期),身份地位(user_type,到底是管理者还是普通用户)
  • 计算之后发现,原来你是tongtong,只是一个普通用户,就返回tongtong的普通用户的登录后界面等相应的权限

session为什么要存在redis,不放在mysql

  • 因为redis速度快,然后session是有过期时间,redis也可以设置,而且redis只是hash对象,可以构建hash对象,存储id和value

token存在的意义

  • cookies其实是有缺点的,比如容易被CSRF攻击,别人只要内嵌了一些JS脚本,比如XSS攻击,就可以携带一些代码,自动挪用cookies,去请求一些网站,获得权限,从而伤害客户的权益
  • 而且session因为只能存储在一台服务器中,所以大量的 应用访问都需要经过这台session的服务器,那么就不适合做分布式了,无法做分布式,那么应用拓展就非常难了,我们的用户如果有10亿,这台session的服务器就得存10亿行,他本身又不能分开存储,虽然说是可以,但是把数据分几个数据库存储,访问的效率又变慢了
  • 我的应用规模都依靠这台session服务器,成为我的木桶短板,非常不好
  • 而且现在的存储都非常贵,10亿个数据,都放在redis上,redis是内存呀,内存好贵呀,存储session的成本非常高
  • token就产生了,token的本质原理就是用时间去换空间

token的原理

  • token根据jwt协议,分为三个部分
  • 第一个部分就是headers,这个头部有几个信息,一个是我们的协议是jwt,一个是我们的加密方式是什么,通常是一个json格式
  • 然后就会对这个头部进行一个base64位的加密,变成一串东西,比如变成了123456789
  • 第二个部分就是payload,也是一个json格式,相当于身份识别,就和session-value非常的像:有user、过期时间
  • 然后也通过base64,变成了一串东西,比如说987654321,那么现在我们的token就有了123456789.98765431的内容了
  • payload就不能放一些机密信息了,比如user_type,password,黑客拿到token的话破解的,因为base64,可以双向破解,非常简单
  • 服务器本身会有一个对称式加密的秘钥,这个秘钥只有服务器自己知道,别人都不知道,所以可以用这个对称式加密的秘钥对123456789.98765431进行加密,然后变成一串大家都看不懂的数据,比如555555555
  • 最终我们传的token,就是123456789.98765431.555555555
  • 当用户端发送请求,携带了这个token信息,然后服务器就拿到这个token值,然后就会对23456789.98765431这两个部分进行对称式的秘钥加密,发现结果是555555555,然后哦哦哦哦哦哦哦,我的验证对了,这个token的确是我发给客户端的
  • 然后服务器就会对payload也就是987654321进行base64解密,发现原来你是user=tongtong,就知道你的身份是对的了

为什么token可以替代session

  • 整个过程中,我们损失的是,cpu的运算,cpu对token进行对称式解密+一次base64解密,其实性能损失并不是特别的大
  • 完全用不上什么表格,session也就没啥卵用了,都是用计算替代了存储功能

token的安全性有问题?

  • 然后会有一种情况,我是不是可以伪造token呀
  • 比如我的header、payload都是可以根据服务器的定义去伪造
  • 然后对这两个值进行对称式秘钥加密,然后黑客(中间人)傻掉了,我tm没有服务器的对称式加密的秘钥,我不知道这个秘钥是多少呀?所以token是无法伪造的
  • 然后就会有人问了,token不是会被盗取吗,当然会呀,如果你不用https协议去传输,别人当然可以拿到,用了https协议传输,我们中间人在网络获取的内容都是一串经过加密的东西,中间人拿了没用,没有秘钥,只能暴力破解,破解个几百万年吧
3 个赞