Java编程——Token 认证的来龙去脉
通常情况下,我们在探讨某个技术的时候,都是从问题开始。那么第一个问题:
为什么要使用 Token?
而要答复这个问题很简单——由于它能处理问题!
可以处理哪些问题呢?
1. Token 完全由应使用管理,所以它可以避开同源策略
2. Token 可以避免CSRF 攻击
3. Token 可以是无状态的,可以在多个服务间共享
Token 是在服务端产生的。假如前台用使用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前台。前台可以在每次请求的时候带上 Token 证实自己的合法地位。假如这个 Token 在服务端持久化(比方存入数据库),那它就是一个永久的身份令牌。
于是,又一个问题产生了:需要为 Token 设置有效期吗?
需要设置有效期吗?
对于这个问题,我们不妨先看两个例子。一个例子是登录密码,一般要求定期改变密码,以防止泄漏,所以密码是有有效期的;另一个例子是安全证书。SSL 安全证书都有有效期,目的是为理解决吊销的问题,对于这个问题的详细情况,来看看知乎的答复。所以无论是从安全的角度考虑,还是从吊销的角度考虑,Token 都需要设有效期。
那么有效期多长合适呢?
只能说,根据系统的安全需要,尽可能的短,但也不能短得离谱——想像一下手机的自动熄屏时间,假如设置为 10 秒钟无操作自动熄屏,再次点亮需要输入密码,会不会疯?假如你觉得不会,那就亲身试一试,设置成可以设置的最短时间,坚持一周就好(不排除有人适应这个时间,毕竟手机厂商也是有使用户体验研究的)。
而后新问题产生了,假如使用户在正常操作的过程中,Token 过期失效了,要求使用户重新登录……使用户体验岂不是很糟糕?
为理解决在操作过程不能让使用户感到 Token 失效这个问题,有一种方案是在服务器端保存 Token 状态,使用户每次操作都会自动刷新(延迟) Token 的过期时间——Session 就是采使用这种策略来保持使用户登录状态的。然而依然存在这样一个问题,在前后台分离、单页 App 这些情况下,每秒种可能发起很屡次请求,每次都去刷新过期时间会产生非常大的代价。假如 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 自动续期。
对本文感兴趣,喜欢的,欢迎关注笔者,如有不同意见可留言,多谢!
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Java编程——Token 认证的来龙去脉