“日防夜防,家贼难防。”“打铁还需自身硬!”养成铁的纪律,有助于铸造坚固的城池。本文从八个方面全面排查你的令牌系统。
![4cb132f33ff87667ff63367e2397e2db.png](https://img-blog.csdnimg.cn/img_convert/4cb132f33ff87667ff63367e2397e2db.png)
1 - 注意OAuth凭据的泄漏
你把应用程序代码推到GitHub了?
OAuth应用程序凭据是否也存储在仓库里,特别是客户端密码?这可是当今头号凭据泄漏来源。
如果那些凭证被窃取了,任何人都可以冒充你。如果你察觉凭据可能已被破坏,请立即重新生成。
2 - 不要在应用程序中硬编码令牌
为了长时间使令牌有效,并直接写在应用程序中,用于简化代码可能很有诱惑力。
但,千万不要这么做!
3 - 对待令牌就像对待密码一样
token就是门钥匙!令牌和API密钥允许任何拥有它们的人访问资源。
因此,令牌和密码一样重要。以同样的方式重视它们!
4 - OAuth不是一个身份验证协议
OAuth是用于指派对资源的访问权限的,它不是一个身份验证协议。
把token看作是门禁卡。你需要验证自己以获得密钥,它无法区分使用者身份,别人盗用了你的token,就拥有了你的访问权限。API提供者坚决不能依赖于令牌作为唯一的身份证明。
您确实应该考虑OpenID Connect (OIDC),这是一种补充规范,而不是尝试自己在OAuth上实现身份验证。OIDC允许用户与应用程序共享其一部分个人资料,而无需共享其凭证。
![f307765a940cd880b1c632a9d0c2ea38.png](https://img-blog.csdnimg.cn/img_convert/f307765a940cd880b1c632a9d0c2ea38.png)
5 - 注意在JWTs中存储的内容,并控制访问权限
JWTs可以用声明的形式存储大量信息,如果捕获了这些信息,就可以轻松地进行解析(除非额外进行了加密)。
如果你使用JWTs来携带一些精简必要的信息,则可以采用不同的方法:
- 在客户端和后端之间,使用不透明字符串或基本的JWT。
- 在后端,验证请求,并使用请求参数注入新的JWT。许多API网关也提供了开箱即用的功能。
如果你希望在整个流中使用相同的令牌,同时可能携带敏感信息,那就对令牌信息进行加密。也就是说,永远不要使用JWT来携带用户的凭证。
6 - 从头至尾彻底验证JWTs
在服务器端接收JWT时,必须彻底验证其内容。
特别是,你应该拒绝任何不符合期望的签名算法,或者使用弱算法,或弱的非对称/对称密钥进行签名的JWT。
此外,你必须验证所有payload、过期日期、发行者和用户。
7 - 不要在本地存储中存储令牌!要用就要使用安全的cookies
浏览器本地存储和会话存储可以从JavaScript读取,因此存储敏感信息(如token)是不安全的。
使用安全cookie、httpOnly标志和CSRF措施来防止令牌被窃取。
8 - 始终通过HTTPS在请求体中传输令牌
这样做可以限制令牌在运行中被捕获,避免被写入代理日志或服务器日志的风险。
你还应该确保在所有涉及发布和验证令牌的参与者之间,只使用TLS 1.2/1.3和最安全的密码套件。
写在最后
令牌访问是现代应用程序实现的基础,但是必须小心处理。
作为后端开发人员,你必须确保提供适当的授权类型,来获取令牌,并彻底验证JWTs。
作为前端开发人员,也应该谨慎处理JWTs的存储,并确保应用程序凭据的安全。
Happy coding :)
我是@程序员小助手,持续分享编程知识,欢迎关注。