我是一个web服务器,个人工做是给人类提供上网服务,我天天要为数以万计的人提供网页浏览服务。nginx
已是深夜了,我还在和手下几个兄弟为了一件事紧张讨论着。程序员
“老大,如今我们天天处理的请求愈来愈多了,session同步的问题不能再拖了,必须想个办法”web
“二哥说的是啊,老大,不能再拖了”redis
“老二,老三,我们是一个集群,大家说的问题我不是不知道,我昨天听程序员们在讨论说要给咱们接入一个叫Redis的家伙,相信这一问题很快就能获得解决啦,你们再忍忍。”算法
“Redis,他是谁,什么来头?怎么没听过这号人物”编程
“我也没见过,等等看吧”跨域
究竟是什么问题,让咱们兄弟几个如此着急上火?事情还得从多年之前提及······浏览器
那时候,这俩兄弟还没来,就我一个web服务器,天天处理的不过是一些静态资源文件,像HTML、CSS、JS、图片等等,日子过的悠闲自在。缓存
日子一每天过着,互联网却悄然发生着变化。除了静态网页以外,能够动态交互的网络应用开始如雨后春笋般涌现,像各类各样的论坛啊,购物网站啊之类的。服务器
这家公司的老板也不例外,招了一帮程序员要搞一套支持动态网页交互的网站出来。
以往的时候,我只须要按照HTTP协议的规范处理请求就完事儿了。不过动态交互应用出现后,我还得记住每个请求背后的用户是谁,要否则就张冠李戴,全乱套了。
为了解决这个问题,程序员们想出了一个叫session的办法:
浏览器登录之后,我就分配一个session id,表示一个会话,而后返回给浏览器,让它保存着。后续再来请求的时候,就把它给带上,我就能知道是谁啦!
还别说,这办法仍是挺管用的,成功解决了用户身份识别的问题,这一用就是好几年。
不过,互联网的发展实在是太快了,用户量蹭蹭上涨,而我却发起了愁。
原先用户量少的时候,session id管理起来倒也简单,如今用户愈来愈多,对应的session id数量也与日俱增,我有点不堪重负了。
终于前不久,公司对web服务器进行了扩展,给我找来了两个小弟,还专门添置了一个nginx来进行负载均衡,这一下咱们变成了3台web服务器组成的小集群了。
个人工做一下轻松了许多,两位小兄弟为了分担了很多。我原觉得之后的日子要好过一些了,可没想到,两位小兄弟的加入却引入了新的问题。
原先的session id虽然不少,我一我的累是累点,可是方便管理啊!如今人手是增长了,但是这个session id的管理问题却变得复杂起来。
由于我们如今是个集群,请求若是发到我这,我给登记了session id,但下一次请求说不定就发到老二那里,一下子又发到老三那里,这个就说不许了,这样咱们几个手头的信息不一致,就会出现一些异常状况,用户估计要破口大骂:这什么辣鸡网站?
后来咱们跟nginx商量了一下,让他同一个用户来的请求都发给咱们固定的一我的,这才稳住了局面。
不过好景不长,后面咱们三兄弟都相继出现过宕机的状况,这时候nginx仍是得把请求交给还在工做的兄弟,原来的问题就又出现了!
咱们几个逼急了,商量了一下,干脆你们伙来同步session id的信息好了,有新增、失效的状况都给其余几个兄弟招呼一下,你们都管理一份,这样就不会出现不一致的问题了。
搞了半天,又变成之前一我的管理全部session id的状况了,不只如此,还要抽出时间和几位兄弟同步,把session id搬来搬去,工做量不减反增了。
就这样艰难的过了一段日子,你们都怨声载道,因此有了开头的那一番讨论。
这一次,但愿这位新来的叫Redis的伙伴能拯救咱们。
过了几天,总算把这个叫Redis的小伙伴给盼来了!
这小子看起来特别精神,了解清楚状况后,告诉咱们说:“三位老哥,之后这session id都统一存在我这里吧,大家别各自保存了,这不是各位的擅长”
“你行吗?”,老二看着不太相信他的话,一脸不屑。
“行不行,试试不就知道了吗?”
接下来,咱们遵从了Redis的建议,再也不保存这烦人的session id,所有一古脑儿交给了他,咱们须要的时候再找他获取。
你还别说,这小子个子不大,本事不小,读写速度都特快,让咱们头疼的问题总算是解决了!
几个月后的一天···
“据说了吗?程序员们又要更改session id的存储方案了”,这一天,老二神神秘秘的说到。
“不对不对,我听到的版本是之后不用session id了,要变天了!”,老三也凑了上来。
一旁的redis老哥一听不乐意了,“咋的?是嫌我干的很差吗?”
我也赶忙催促,“你俩就别卖关子了,听到了什么,快说说”
老三示意你们围拢一些,小声说到:“我上次听两个程序员在议论,不知道他们在哪里学来了一套叫JWT(JSON Web Token) 的技术,硬说让咱们来管理保存session id负担过重了,之后不保存了!还说,还说···”
“还说啥,你却是说啊!”
“还说,Redis也不是万能的,也有崩溃的风险,一崩溃就全完了,因此要革新技术”,老三继续说到。
Redis一听更着急上火了,“我工做这么久以来,从没有撂过挑子吧,怎么能这么说我呢?再不行我也能够像大家搞个集群嘛”
“Redis老弟你先别急。唉,老三,这不保存session id,之后怎么鉴别用户呢?你有没有听到他们怎么说的?”
“听他们说,没有session id,可是换了一个token,用它来识别用户”
老二一听不觉得意:“换了个名字,换汤不换药嘛!我们还不是要保存token,才能匹配谁是谁”
老三摇了摇头:“不是的,这可不仅是改了个名字那么简单!这个token是由三部分构成,就像这样:”
“大家看,第一部分是JWT的基本信息,而后把用户的身份信息放在第二部分,接着和第一部分合在一块儿作一个计算,计算的时候加入了一个只有咱们才知道的密钥secretkey
,计算结果做为第三部分。最后三部分拼在一块儿做为最终的token发送给客户端保存着···”
还没等老三说完,老二点出了其中的关键:“我知道了,后面我们再收到这个token的时候,就能够经过一样的算法验证前面两部分的结果和第三部分是否是相同,就知道这个token是否是伪造的啦!由于密钥只有咱们知道,别人没办法伪造出一个token的!最后确认有效以后,再取第二部分的用户身份信息,就知道这是谁了!”
听完他们的分析,我和Redis老兄都默默的点了点头,“有点意思啊,这样一来,我们确实不用存了!不过如今我们几个工做配合的也挺好的,他们费这么大劲是为了什么啊?”
“我猜他们是想节约开支,把Redis老哥给裁掉!”,老二说到。
老三摇了摇头,“依我看,八成他们是想展现技术给领导看,这不又快到职级晋升答辩了,他们想搞事情!唉,老大,这事你怎么看?”
“我啊,我···”
朋友们,你怎么看?session-cookie和JWT,你更倾向谁?