更进一步思考,对称加密算法除了加密,还带有还原加密内容的功能,而这一功能在对 Token 签名时并无必要——既然不需要解密,摘要(散列)算法就会更快 。可以指定密码的散列算法,自然是 Hmac 。
上面说了这么多,还需要自己去实现吗?不用!JWT 已经定义了详细的规范,而且有各种语言的若干实现 。
不过在使用无状态 Token 的时候在服务端会有一些变化,服务端虽然不保存有效的 Token 了,却需要保存未到期却已注销的 Token 。如果一个 Token 未到期就被用户主动注销,那么服务器需要保存这个被注销的 Token,以便下次收到使用这个仍在有效期内的 Token 时判其无效 。有没有感到一点沮丧?
在前端可控的情况下(比如前端和服务端在同一个项目组内),可以协商:前端一但注销成功,就丢掉本地保存(比如保存在内存、LocalStorage 等)的 Token 和 Refresh Token 。基于这样的约定,服务器就可以假设收到的 Token 一定是没注销的(因为注销之后前端就不会再使用了) 。
如果前端不可控的情况,仍然可以进行上面的假设,但是这种情况下,需要尽量缩短 Token 的有效期,而且必须在用户主动注销的情况下让 Refresh Token 无效 。这个操作存在一定的安全漏洞,因为用户会认为已经注销了,实际上在较短的一段时间内并没有注销 。如果应用设计中,这点漏洞并不会造成什么损失,那采用这种策略就是可行的 。
在使用无状态 Token 的时候,有两点需要注意:
- Refresh Token 有效时间较长,所以它应该在服务器端有状态,以增强安全性,确保用户注销时可控
- 应该考虑使用二次认证来增强敏感操作的安全性
到此,关于 Token 的话题似乎差不多了——然而并没有,上面说的只是认证服务和业务服务集成在一起的情况,如果是分离的情况呢?
分离认证服务
当 Token 无状态之后,单点登录就变得容易了 。前端拿到一个有效的 Token,它就可以在任何同一体系的服务上认证通过——只要它们使用同样的密钥和算法来认证 Token 的有效性 。就样这样:

文章插图
当然,如果 Token 过期了,前端仍然需要去认证服务更新 Token:

文章插图
可见,虽然认证和业务分离了,实际即并没产生多大的差异 。当然,这是建立在认证服务器信任业务服务器的前提下,因为认证服务器产生 Token 的密钥和业务服务器认证 Token 的密钥和算法相同 。换句话说,业务服务器同样可以创建有效的 Token 。
如果业务服务器不能被信任,该怎么办?
不受信的业务服务器
遇到不受信的业务服务器时,很容易想到的办法是使用不同的密钥 。认证服务器使用密钥1签发,业务服务器使用密钥2验证——这是典型非对称加密签名的应用场景 。认证服务器自己使用私钥对 Token 签名,公开公钥 。信任这个认证服务器的业务服务器保存公钥,用于验证签名 。幸好,JWT 不仅可以使用 HMAC 签名,也可以使用 RSA(一种非对称加密算法)签名 。
不过,当业务服务器已经不受信任的时候,多个业务服务器之间使用相同的 Token 对用户来说是不安全的 。因为任何一个服务器拿到 Token 都可以仿冒用户去另一个服务器处理业务……悲剧随时可能发生 。
为了防止这种情况发生,就需要在认证服务器产生 Token 的时候,把使用该 Token 的业务服务器的信息记录在 Token 中,这样当另一个业务服务器拿到这个 Token 的时候,发现它并不是自己应该验证的 Token,就可以直接拒绝 。
现在,认证服务器不信任业务服务器,业务服务器相互也不信任,但前端是信任这些服务器的——如果前端不信任,就不会拿 Token 去请求验证 。那么为什么会信任?可能是因为这些是同一家公司或者同一个项目中提供的若干服务构成的服务体系 。
但是,前端信任不代表用户信任 。如果 Token 不没有携带用户隐私(比如姓名),那么用户不会关心信任问题 。但如果 Token 含有用户隐私的时候,用户得关心信任问题了 。这时候认证服务就不得不再啰嗦一些,当用户请求 Token 的时候,问上一句,你真的要授权给某某某业务服务吗?而这个“某某某”,用户怎么知道它是不是真的“某某某”呢?用户当然不知道,甚至认证服务也不知道,因为公钥已经公开了,任何一个业务都可以声明自己是“某某某” 。
推荐阅读
- 计算机病毒是怎么进行传播?本文根据病毒分类带你了解传播的方式
- 深入理解C语言的指针
- 健身|了解几个减肥基础常识,搞不懂,很难真正瘦下来!
- 非洲菊的风水作用你了解吗
- 网络安全:你真的了解防火墙吗?
- IaaS、PaaS、SaaS三种云服务模式,你了解多少?
- 关于滇红茶冲泡步骤您了解吗?
- 1分钟了解手机蓝牙的宝藏功能!很多人只用过1个,剩下5个太神奇
- 华为手机找回功能了解一下:帮你找回手机
- 失而复得 华为“查找手机”功能有多强大?快来了解一下
