我已经实现了一个OAuth流,一旦用户使用google进行身份验证,我的Django后端就会为他们创建一个配置文件,并为他们创建JWT令牌,用于访问一些受限的API端点。我目前遇到的问题是如何将令牌发送到前端。现在,我正在将令牌附加到前端URL,并将用户重定向到前端,在前端,令牌从URL中提取并保存在本地存储中。这是一个安全问题吗?如果是,我应该如何克服它?
如果您有一个与自己的后端对话的前端,那么我会考虑使用带有cookie的普通旧会话,而不是JWT。不幸的是,令牌在浏览器中永远不安全。你不应该把它们保存在本地存储中,因为任何恶意代码都很容易从那里提取出来。将令牌保存在内存中更安全,但更复杂的XSS仍然能够窃取该令牌。
我最近主持了一个网络研讨会,我们讨论了在浏览器中处理代币的安全性,以及为什么我们认为你应该坚持会议:https://curity.io/resources/webinars/hardening-single-page-app-security.你也可以看看这个很棒的视频,它深入了解了浏览器中代币攻击的更多技术细节:https://pragmaticwebsecurity.com/talks/xssoauth.html
不过,如果你想坚持你的解决方案,我会考虑几件事:
- 在URL的片段部分发送令牌。多亏了这一点,代币将更加安全(例如,不会保存在历史中等(
- 尽量只将令牌保存在内存中,避免将其保存在本地存储中,除非丢失令牌对您的应用程序来说不是真正的问题(例如,您没有任何由令牌保护的个人信息等(。我知道,在考虑用户体验时,这一要求可能会有点棘手,因为令牌会在刷新页面时丢失