当前位置: 首页 > 知识库问答 >
问题:

在基于web的应用程序中,应该在哪里正确安全地存储JWT令牌?

庞鸿骞
2023-03-14

我熟悉Web存储API和cookies,但是我不知道存储身份验证令牌最安全的方式是什么。我想知道这是否会破坏任何第三方库。

我想要一份详尽的可用方法列表,列出每种方法的优缺点,最重要的是最好的方法(如果有的话)。

共有2个答案

郦何平
2023-03-14
  1. JWT不应存储在本地存储
  2. 事实上,它们甚至不应该存储在您的Cookie中,除非您能够实施非常严格的CSRF保护

看看这个动机

  • JWT 作为id_token就像您的用户凭据
  • JWT 作为access_token就像您的会话令牌

最安全的选择是在内存中。看看这个进行深度潜水

何聪
2023-03-14

使用基于令牌的身份验证,您可以选择存储JWT的位置。我们强烈建议您将令牌存储在本地存储/会话存储或cookie中。

通常,JWT被放在浏览器的本地存储中,这对于大多数用例来说工作得很好。

使用用户名和密码登录用户时,响应正文包含access_tokenJWT。然后您需要在客户端代码中处理此响应。然后可以将此令牌存储在local存储或会话存储中。

单击此处查看使用会话存储的示例

本地存储和会话存储都扩展了存储。它们之间的唯一区别是数据的持久性:

local存储-数据会持续存在,直到显式删除。所做的更改会被保存并可用于当前和未来对站点的所有访问。

< code>sessionStorage -保存所做的更改,并可用于当前页面,以及同一窗口中对该站点的未来访问。一旦窗口关闭,存储就会被删除。

  • 与cookie不同,本地存储被沙盒到特定域,其数据不能被任何其他域(包括子域)访问
  • Web存储可以通过同一域上的JavaScript访问,因此在您的站点上运行的任何JavaScript都可以访问Web存储,因此很容易受到跨站点脚本(XSS)攻击
  • 开发人员必须确保JWT始终通过HTTPS发送,而不是HTTP

您还可以使用cookie来存储JWT。设置cookie的确切方式取决于您使用的客户端语言。

有不同的选项来控制cookie的生命周期:

  • 浏览器关闭后可以销毁Cookie(会话Cookie)
  • 实现服务器端检查(通常由正在使用的web框架为您完成),您可以实现过期或滑动窗口过期
  • Cookie可以是持久的(在浏览器关闭后不会被销毁),并且会过期
  • 如果设置了<code>httpOnly</code>标志,则JavaScript和服务器端代码都可以读取Cookie,或者只有服务器端才能读取Cookies
    < Li > cookie的最大大小仅为4kb,因此,如果您将许多声明附加到令牌,这可能会有问题。 < li > Cookies容易受到跨站点请求伪造(CSRF或XSRF)攻击。当恶意网站导致用户的web浏览器在用户当前经过身份验证的可信站点上执行不需要的操作时,就会发生这种类型的攻击。这是对浏览器如何处理cookies的利用。使用web应用程序框架的CSRF保护使cookies成为存储JWT的安全选项。通过检查HTTP Referer和< code>Origin头,也可以部分阻止CSRF。 < li >如果应用程序需要跨域访问,可能很难实现。cookie具有附加属性(域/路径),可以修改这些属性以允许您指定允许将cookie发送到的位置。

原文:https://auth 0 . com/docs/security/store-tokens #如何实现

 类似资料:
  • 我正在使用vue.js和vuex开发一个应用程序,它使用JWT令牌对JSON API服务器进行身份验证。所以我想知道存放JWT代币的最佳做法是什么? 如果我将其存储在vuex商店中,则页面刷新后它会丢失,因此用户需要再次登录,这不是很方便。 如果我将其存储在浏览器的本地存储中,它会在下次登录之前被弃用,然后假设身份验证令牌的组件会混淆。我不知道如何处理这个问题。 感谢你对此的暗示。

  • 我正在实现一个需要身份验证的REST服务。我正在使用JWT。 现在,Android应用程序在登录时发送一个请求,获得一个令牌,并且必须在每个后续请求的头中发送令牌。 我的问题是,如何存储令牌,或者我应该将其存储在哪里? 共享偏好 SQLite数据库 归档 最好的做法是什么?还是我完全错了?

  • 问题内容: 我正在使用ExpressJS,Mongodb(Mogoose)构建应用程序。应用程序包含访问用户之前必须对其进行身份验证的路由。 目前,我已经编写了一个快速的中间件来做同样的事情。在这里,借助JWT令牌,我正在进行mongodb查询以检查用户是否已通过身份验证。但是感觉这可能会在我的数据库上增加不必要的请求负载。 我应该针对此特定任务集成redis吗? 会改善API性能吗?还是应该继续

  • 问题内容: 实用程序函数在Django中应该存放在哪里?诸如自定义加密/解密数字,发送推文,发送电子邮件,验证对象所有权,自定义输入验证等功能。我在应用程序中的多个位置使用了重复性和自定义内容。我现在肯定要打破DRY。 我看到了一些演示,其中在models.py中定义了函数,尽管从概念上看这对我来说并不正确。他们是否应该使用导入到我的项目中的“实用程序”应用程序?如果是这样,它们在实用程序应用程序

  • 我觉得Angular对模型的使用让人困惑。Angular似乎采取的方法是,模型可以是任何你喜欢的--即。Angular不包含显式的模型类,您可以使用常规JavaScript对象作为模型。 “编辑”这个问题的第二个答案很有趣,也很接近我目前使用的。