试想一下如果我们的网络空间没有安全验证,那会是一件多么恐怖的事情。所以安全验证就出现了三个剑士,Cookie,Session,Token,他们在不同的时代和环境下发挥着不同的作用。一起来了解一下他们。
Cookie
最初互联网时代是没有交互功能的,只是类似看报一样获取信息。随着交互式网络的出现,陆续多的交互式网站开始出现,其中的一些功能比如登录注册,评论需要辨别用户是谁。
可能有人会说,那我每次请求都带上我用户密码不就行了吗?
可以是可以,但是非常容易泄露密码,这个时候Cookie就出现了。
Cookie大致工作机制如下图:
灵魂画手怎么说
在Cookie拿到之后如果不进行加密处理会容易被猜测,俗称撞库。此时我们可以对Cookie进行签名加密校验,例如我现在有个Cookie是这样的。
Cookie:name=123
然后我们可以把它它和服务器上的密令拼接,取hash,结果好像这样
Cookie:name=123&signature=123456789hash
这样服务器校验hash值就可以验证这个Cookie是否合法,降低风险。
Cookie返回客户端后会浏览器保存在客户端本地,Cookie记录了用户的大部分信息,但是随着信息越来越多Cookie也越来越大,请求压力也随之增大,这个时候Session就出现了。
Session
当我们的Cookie数据太多,我们会考虑把数据存放在服务器里面,然后服务器生成一个K-V对进行存放。K就是返回给用户的key,V就是存放在服务器里面的用户数据,这就是Session。
工作机制概念图如下
随着技术越来越先进,Session的缺点越来越突出。
现在有两个一样的服务器进行集群,而Session只存在其中一个里面,另外一个服务器上是没有的,所以导致出现Session同步问题。
解决办法有三个
Session复制
当一台机器新生成Session的时候,把这个Session复制到另外的所有服务器里面,这样无论访问哪一台服务器都有用户信息。
虽然能解决这个问题,但是仅限服务器比较少的情况,试想一下成千上万的服务器存储着同样的数据,明明存储一份可以的数据多出了那么多,数据冗余极其严重。
Session粘连
通过Nginx的sticky模块,可以对用户请求定向发送到同一台机器里面,也就是说,A机器里面有用户数据,而B机器没有,可以把用户的请求全部发送到A机器里面,而不访问B机器。
但是这样也是存在一个致命缺点,倘若其中一台服务器宕机了,那被分配到次服务器的用户就不能访问了,造成用户体验下降的问题。
Session共享
通过增加中间件的方法,让所有拿到SessionId的服务器都去这个中间件查询一下是否有这个SessionId的对应用户数据,这样就可以把这些数据集中到一起进行管理查询。
但是中间件必须要做集群以及数据同步或主从复制,否则会出现宕机所有服务查询不到Session的情况
Token
随着时代的进步,科技越来越发达,系统架构也越来越庞大。服务器数量直线飙升,倘若用传统的Session,维护起来极其麻烦,那么有没有一种东西,既能安全加密验证又能一个钥匙走天下的呢。Token应邀而来。
这里说的Token笔者默认是JWT,JWT由三部分组成用 . 分割。
http请求的时候采用的是Authorization字段,而不是Cookie。
eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9. eyJuYW1lIjoiSm9obiIsImFkbWluIjp0cnVlfQ. 1lS3vNE_DGBDHfeo_GNwQWp4qUPc_Mao1TMkJnYPq__xTwoceuMOuGUnoURmfkVq86k9B6z2rURT_T7Q77r8fA
头部
记录了所采用的token类别和hash算法。
载体
此处记录了 用户的一些会话信息,但不会记录用户密码。
签名
此处是服务器使用密钥根据头部和载体生成的数据签名。
只要服务器的密钥不泄露的话,JWT是十分安全的,因为它的数据签名是根据服务器里面的加密密钥和用户的信息生成的,安全性很高。
生成过程和Cookie类似,验证过程如下
但是JWT是有一段的有效时间的,所有必须让它适当时候的消失。
比如现在有个JWT持续时间是30分钟,用户在浏览网站15分钟后就退出账号了,那产出的JWT还有15分钟的有效时间。此时如果有人拿到这个JWT,就可以对此用户的账号进行操作,这样十分危险。
所以,一般的退出会把用户客户端上的JWT删除掉。
小结
Cookie适合一些小型的论坛系统,而且不能跨站。
Session适合一些比较复制的系统,但是不适合分布式和单点登录的系统,比如拥有小程序,app和网页端的应用。
Token适合一些比较复杂的交互式系统,但是token有个缺点,技术一旦生成就必须等到过期才能失效。所有使用Token的时候一定要注意Token的删除。
阿,说了那么多,忘记给各位拜年了 祝各位:
一帆风顺,二八佳人,三阳开泰,四方之志,五谷丰登
六六大顺,七星高照,八仙过海,九天揽月,十全十美
请在评论区指出错误或对此文章的建议和意见,谢谢,我们共同成长!