① Token: 实在服务端产生的,用于证明请求的合法性的凭证;
如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回token给前端。前端在以后每次的请求中带上token来证明自己的合法性地位;
② 为什么要用token?
token可以解决问题,1)token完全由应用管理,所以可以避开同源策略;2)token可以避免CSRF攻击;3)token可以是无状态的,可以在多个服务间共享;
③ token的有效期
从安全的角度考虑,有效期越短越好,只要不离谱,影响用户体验就好;
为了解决用户由于token失效带来的不良用户体验,方案一:一般会把token的过期时间保存到缓存或者内存中;方案二:使用Refresh token,它可以避免频繁的读写操作,这种方案中,服务端不需要刷新token的过期时间,一旦token过期,就会反馈给前端,前端使用Refresh token申请一个全新token继续使用,这种方案中,服务端只需要在客户端请求更新token的时候对Refresh token的有效性进行一次检查,大大减少了更新有效期的操作,也就避免了频繁的读写,当然,Refresh token也是有有效期的,但是有效期就可以长一点了,比如,按天为单位;
时序图表示:
使用token和Refresh token的时序图如下
1、登录
2、业务请求
3、token过期,刷新token
上面的时序图中并未提到 Refresh Token 过期怎么办。不过很显然,Refresh Token 既然已经过期,就该要求用户重新登录了。
当然还可以把这个机制设计得更复杂一些,比如,Refresh Token 每次使用的时候,都更新它的过期时间,直到与它的创建时间相比,已经超过了非常长的一段时间(比如三个月),这等于是在相当长一段时间内允许 Refresh Token 自动续期。
关于无状态token和分离认证单点登录等,请参考https://www.cnblogs.com/xuxinstyle/p/9675541.html