浅谈JWT
昨天读到一篇文章谈到了jwt的应用和安全,其中提到jwt令牌存在localStorage不安全,可以存到cookie会话里面,呃。。。<br>
在互联网打了几年杂稍微谈谈我对jwt的理解吧。
JWT全称json web tokens,是目前业界使用比较广泛的前后端分离用户认证解决方案。怎么广泛起来的呢,因为像海外谷歌、苹果这样的大厂都带头用,jwt这套方案又比较成熟规范。我最先接触jwt是在<a href="https://laravel.com">laravel框架</a>上面,算是比较晚。由于项目需要完全的前后端分离采取了这套解决方案。<br>
先说说早前使用的会话模式(session):传统的用户授权一般是账号+密码登陆,这时候服务端需要记录一下用户的登陆信息用于区分用户,在网站上总不能张三买了东西算在李四头上。那么服务端一般会把当前登陆的用户信息存在session会话中,然后客户端会对应生成cookie信息,可以理解为下馆子点了菜的时候给发了号码牌。由于http协议是无序的,这时候用户无论做什么都会默认客户端(浏览器)都会带上cookie会话信息,一切安好。用户这个会话信息是不跨域的,不额外设置的话甚至不能跨目录,比如默认情况下你在www.zhangsan.com/aaa生成的会话不能在www.zhangsan.com/bbb用,更不能在www.lisi.com用。那么问题来了,业务上有多个网站zhangsan.com、game.zhangsan.com、lisi.com,几个网站之间要互通用户信息怎么办?早前我是见过一种奇葩的方案:A网站登陆后生成一个口令带在地址链接后面跳到B网站,然后B网站服务端去根据这个口令查询用户信息自动登陆,这样做的问题很多,也不安全。当前后端完全分离以后这种问题更突出,前端和后端可能不在同一个域名或者端口,甚至不在同一台服务器。随着业务的扩大后端也可能会搞集群分布式,后端可能不再是一台服务器一个ip,这时候再使用seesion会话这种认证方式就很费劲了,除了要解决跨域问题还要解决授权数据同步问题,与其花大力气改造不如换一种授权方式,JWT迎来了春天。<br>
jwt授权基本思路也是用户登陆后生成一个用户的凭证(token口令),用户每次和后端交互都带上这个口令,以此来识别用户。不同的是jwt的提倡只简单颁发一个token凭证,不参与其他逻辑,只要token签发时间没过期那么无论谁持有以及从哪里发起请求服务端都认可,除非服务端另外做逻辑。来看看jwt的基本结构:header(头部).payload(载荷).sign(签名)。其中header和payload是一般采用json格式再base64来的,sign签名部分一般是H256也就是HMACSHA256来的,当然也有像苹果这样用ES256的。生成的令牌一般存放在客户端localStorage,使用的时候在header里面带上Authorization: Bearer <jwt token>这种方式,当然你硬要放在cookie里面也是能用的,但安全上并没有什么本质的不同,并不存在谁比谁更安全的问题。有人会说我一开调试模式就能看到token,拿到授权后我想干嘛干嘛毫无安全性。你想想session会话里面的cookie自然也能用这种方式拿来变造伪请求,一般的应对都是给授权信息一个过期时间,不然你仔细想想就算你买了个基因认证才能开的保险柜,在别人能进你屋里(打开你桌面和浏览器)柜子开着(token未失效)的情况下谁都能拿里面的东西不是吗?养成保护密码和人走了随时退出登陆状态的好习惯才能避免这种问题。当然保险柜也应该设置一个过期时间,开了很久都没人在里面拿东西的时候应该自动锁上,也就是token间隔一定时间不使用就自动失效。同时使用完全的前后端分离如果前后端不同域且客户端是浏览器的时候则需要服务端在服务中间件或代码里面开放跨域,也就是允许一些像Authorization、Token、POST、PUT等实际需要使用到的header请求头<br>
jwt颁发的token通常情况下是不需要服务端存下来的,并且不推荐在里面放任何像用户信息之类的真实数据。因为像以前session会话这种方式实际上是要在服务器上的缓存目录中存放认证数据的,用户多了会占用不少的储存空间。这点上jwt解决了这个痛点,每次签发的token都让客户端存,且只校验有效性和是否过期。当然有时候也会在服务端存token来实现一些复杂或者特殊的业务和功能(比如在特定时间点要强制某个用户的token失效),但大多数情况下服务端都应该不存token,更不应该把token放在服务端session会话中。<br>
说到底jwt也好session会话也好,产生和运用都是顺应时代发展和业务需求来的,并不用纠结于哪个好哪个更先进。安全是相对的,没有绝对的安全,只有不断地探索和进步。今天的jwt杂谈就分享到这里。
更多>>