JWT是用户身份验证的安全选项吗?

Ole*_*ann 4 security jwt

我喜欢JWT的简单性,只是在为Web应用程序实现身份验证机制时使用它们,我有一个Elixir/Phoenix后端,提供RESTful JSON API和Angular 2前端.

今天我偶然发现了这篇文章(我与这个网站没有任何关系),这让我对JWT的使用产生了一些疑问,我想讨论一下.主要是:

  • 没有关闭整个系统,没有真正的JWT无效方法.至少当他们是无国籍的时候.
  • 这意味着你无法撤销访问权限,这可能非常糟糕.
  • LocalStorage - JWT主要存储在前端 - 不如会话存储安全.

与cookie不同,本地存储不会在每次请求时发送数据存储的内容.从本地存储中检索数据的唯一方法是使用JavaScript,这意味着任何提供通过内容安全策略的JavaScript的攻击者都可以访问和泄露它.不仅如此,JavaScript还不关心或跟踪数据是否通过HTTPS发送.就JavaScript而言,它只是数据,浏览器将像任何其他数据一样对其进行操作.

在经历了所有麻烦后,这些工程师经历了确保没有人会用我们的饼干罐子来消磨,在这里我们试图忽略他们给我们的所有花哨的技巧.这似乎有点落后于我.

到目前为止,我认为他的观点无效 - 只要通过https服务一切并防止XSS和CORS攻击.我的意思是如果恶意JS可以在网站上执行,这实际上不是JWT的问题.JS不允许混合内容(http和https).

使所有令牌无效:只需使用类似JWT生成数字变量的东西,它可以存在于您的环境变量中并在每个令牌中编码.这是一个简单的整数.如果要使所有令牌无效,请将其递增.然后你只需要一种机制来检查世代号是否匹配.这不一定是数据库,不应该是性能问题.使用可靠的部署策略在多个实例上进行推广应该不会太困难.

对于使单个令牌无效:使用刷新令牌和JWT的非常短的生命周期(几分钟).如果JWT的TTL几乎结束,则用户通过刷新令牌获得新的TTL.这意味着数据库每隔几分钟命中一次.

还是我弄错了?

Sil*_*Fox 5

LocalStorage - JWT主要存储在前端 - 不如会话存储安全.

您可以随时将您的JWT存储在HttpOnly cookie中,这将降低它们被任何XSS漏洞窃取的风险.

当然所有其他通常的最佳实践都适用 - 安全标志,HSTS等.

使所有令牌无效:只需使用类似JWT生成数字变量的东西,它可以存在于您的环境变量中并在每个令牌中编码

是的,你可以做到这一点,甚至完全产生新的秘密.

对于使单个令牌无效:使用刷新令牌和JWT的非常短的生命周期(几分钟).如果JWT的TTL几乎结束,则用户通过刷新令牌获得新的TTL.这意味着数据库每隔几分钟命中一次.

所以我假设这意味着使用传统的服务器端会话状态机制为你的refesh-tokens?这似乎是一种有效的方法.尽管使用安全算法(例如SHA-2 - 不需要盐),确保会话令牌在服务器端进行哈希处理.

唯一棘手的部分是从客户端到服务器的时钟同步.如果您快速到期,那么任何小的时钟差异都可能使客户端感到困惑,他们也不会及时请求刷新令牌.这使事情变得更加复杂,复杂性是安全的主要敌人.

如果您快速到期令牌,那么使用传统的服务器端会话管理机制可能会更有意义.