如何在客户端持久保存不记名令牌

Posted

技术标签:

【中文标题】如何在客户端持久保存不记名令牌【英文标题】:How to persist bearer token on client side 【发布时间】:2014-03-19 14:00:03 【问题描述】:

我正在尝试了解 ASP.NET Web API 2 中基于声明的身份验证。在我的应用程序中,我使用了 VS 2013 模板,该模板实现了 OAuth 2.0 并使用了不记名令牌(我记得是 JWT)。我的问题是 - 在客户端保留令牌的最佳方式是什么。在他的书中,Badrinarayanan Lakshmiraghavan 将不记名令牌描述为

不记名令牌就像现金:发现者、保管者。

因此,将其保存到 cookie 中是否安全?这是否意味着任何人将窃取 cookie 将获得对应用程序的完全访问权限?另一方面,我可以在将令牌保存到 cookie 之前使用哈希加密令牌。会足够安全吗?还有其他选择吗?我见过很少有人在 *** 上提出类似的问题,但从未找到令人满意的答案。

【问题讨论】:

【参考方案1】:

将其保存到 cookie 中是否安全?

没有。 Cookie 可以通过 XSS 攻击(和其他载体)被盗 此外,这可能会受到 CSRF 的影响,因为任何请求都会自动提交 cookie。

我可以在将令牌保存到 cookie 之前使用哈希加密令牌

这也行不通。散列不是一种安全的加密方式(而且不允许解密)

还有其他选择吗?

基本上,您应该通过安全连接 (HTTPS) 将令牌提供给用户,但他们应该手动提交它以确保安全(再次通过 HTTPS)

【讨论】:

'基本上,您应该通过安全连接 (HTTPS) 将令牌提供给用户,但他们应该手动提交它以确保安全(再次通过 HTTPS)'。仍然没有完全回答这个问题。是不是说只要我用HTTPS就可以用cookie? 没有。 Cookie 可以通过 XSS 攻击轻松窃取。 Cookie 也会随任何 Web 请求自动提交,因此它们容易受到跨站点请求伪造的影响。查看 (owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29) 了解更多信息。 Web API 2 中不记名令牌的默认时间跨度为 14 天。那你如何在客户端保存这个令牌呢? 啊。如果不记名令牌在 14 天后过期,您可以将其存储在 cookie 中。重要的是不要将 cookie 用于永久机密。除了不记名令牌之外,请务必使用随机令牌支持您的状态更改操作(如果您的用户更改设置、创建/删除东西、购买物品)以保护 CSRF。 这不能回答问题。 JWT令牌应该如何在客户端持久化?

以上是关于如何在客户端持久保存不记名令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在请求标头上调用需要不记名令牌的 NSwag 客户端方法?

流动客户端主题时如何在 C# HttpClient 中设置 OIDC/OAuth 不记名令牌

代表客户端验证密钥斗篷不记名令牌

OAUTH2.0 不记名令牌不工作

如何在 Ktor-client for Android 中清除不记名令牌

使用 OAuth 令牌生成 WebApi 将更多数据返回给带有不记名令牌的客户端