如何在客户端处理访问令牌和刷新令牌

how to deal with access token and refresh token in client side

我正在使用 AngularJS 客户端创建一个网站,并在 REST 中与后端(在其他域中)进行通信。

为了验证每个调用,我通过每个 HTTPS 调用的 header 传递一个令牌:"Authorization : Bearer access_tokenXXXXXX"

当令牌过期时,由于 refresh_token,我可以创建一个新令牌。

access_token 和 refresh_token 需要存储在客户端,因为浏览器需要在 HTTP 请求中设置它之前以明文形式存在 header.

我的问题是:

问题 1 : 推荐的存储 access_token 和 refresh_token 的方法是什么,以便浏览器可以使用它,因此相对安全? (我有个人照片等安静的敏感数据)

问题 2 : access_token 和 refresh_token 的推荐寿命是多少? (仅供参考,我在 401 响应后刷新令牌,我的应用程序是社交应用程序)

问题 3:我有架构问题吗?我是否应该更改它以便 JavaScript 完全不使用令牌,并使用 HTTP-ONLY cookies?

谢谢:)

杰弗里

更新:

我最终选择了 HTTP-ONLY 饼干。我正在使用 Django Oauth 工具包,因此 Django 正在等待 HTTP header 中的授权,而不是在 cookie 中。

为了解决这个问题,我使用了一个中间件来收集 cookie 的令牌并将其设置在 header 中。它还应该允许我在 access_token 到期之前 re-authenticate 用户(使用刷新令牌)。

我遇到了和你类似的问题。

我正在为 browser-basednon-browser 客户端开发服务层。我计划使用 JWT(JSON Web Token)来验证两者。

评论太长所以我post它作为答案。

对于问题1,根据here,出于安全考虑,他们建议将JWT令牌存储在cookie中。

对于问题 2,here 是关于 JWT 过期处理的帖子。

对于问题3,我还没有评论。

我认为你问问题 3 是对的。一定要使用 HTTP-Only cookie,这是最安全的浏览器存储类型。

如 smwikipedia 提供的链接中所述,使用 HTTP-Only cookie 有助于防御 XSS。为了抵御 CSRF,您应该查看 this AngularJS 机制。

cookie 的实际格式可以是 JWT 或任何其他格式。

问题 2 的答案实际上取决于您的用户在严密安全性和便利性之间权衡的最佳平衡点。您最了解您的用户,所以这真的是您自己的判断。