我正在使用AngularJS客户端创建一个网站,并在REST中与后端(在其他域中)进行通信。
为了验证每个调用,我通过每个HTTPS调用的头传递一个令牌:"Authorization:Bearer access_tokenXXXXXX"
代币到期后,我可以创建一个新的代币,这要归功于refresh_token。
access_token和refresh_token需要存储在客户端,因为在将其设置在HTTP请求标头中之前,浏览器需要将其设置为明文。
我的问题是:
问题1:建议用什么方法存储access_token和refresh_token以使其可用于浏览器,从而相对安全?(我有安静的敏感数据,如个人图片)
问题2:access_token和refresh_token的建议使用寿命(=不可用之前的时间)是多少?(仅供参考,我在401响应后刷新令牌,我的应用程序是一个社交应用程序)
问题3:我有架构问题吗?我是否应该更改它以使JavaScript完全不使用令牌,并使用HTTP-ONLY cookie?
谢谢:)
杰弗里
更新:
我终于选择了吃HTTP-ONLY饼干。我使用的是Django Oauth Toolkit,所以Django在HTTP头中等待授权,而不是在cookie中。
为了解决这个问题,我使用了一个中间件来收集cookie的令牌并将其设置在头中。它还应该允许我在access_token到期之前重新验证用户(使用刷新令牌)。
我认为你问问题3是对的。一定要使用仅HTTP cookie,这是最安全的浏览器存储类型。
正如smwikipedia提供的链接中所述,使用仅HTTP cookie有助于抵御XSS。为了防御CSRF,您应该查看这个AngularJS机制。
cookie的实际格式可以是JWT或其他任何格式。
问题2的答案实际上取决于用户在严格的安全性和便利性之间进行权衡的最佳点。你最了解你的用户,所以这真的是你自己的判断。
我面临着与您类似的问题。
我正在为browser-based
和non-browser
客户端开发服务层。我计划使用JWT(JSONWebToken)对两者进行身份验证。
评论太长了,所以我把它作为一个答案发布。
对于问题1,根据此处,出于安全考虑,他们建议将JWT令牌存储在cookie中。
对于问题2,这里有一个关于JWT过期处理的线程。
关于问题3,我还没有发表评论。