Security JWT优于数据库中简单随机生成的令牌?

Security JWT优于数据库中简单随机生成的令牌?,security,jwt,token,Security,Jwt,Token,假设我有一个用于web应用程序的典型CRUDAPI。我需要通过令牌授权用户,检查用户角色等 有什么理由让我考虑JWT将一个随机生成的令牌存储在一个表中,比如令牌(令牌、刷新令牌、到期日)/?p> 在我看来,JWT在这里增加了更多的复杂性: 处理编码/解码的附加代码 需要存储JWT机密和密钥 令牌撤销问题 我必须点击数据库来检查用户角色(虽然我可以将它们包括在有效负载中,但我还应该在我的应用程序中检查其他内容),所以这里没有优势。我在这里看到的唯一好处是,我可以检查令牌过期数据,而无需访问数据库

假设我有一个用于web应用程序的典型CRUDAPI。我需要通过令牌授权用户,检查用户角色等

有什么理由让我考虑JWT将一个随机生成的令牌存储在一个表中,比如<代码>令牌(令牌、刷新令牌、到期日)/<代码>?p> 在我看来,JWT在这里增加了更多的复杂性:

  • 处理编码/解码的附加代码

  • 需要存储JWT机密和密钥

  • 令牌撤销问题

  • 我必须点击数据库来检查用户角色(虽然我可以将它们包括在有效负载中,但我还应该在我的应用程序中检查其他内容),所以这里没有优势。我在这里看到的唯一好处是,我可以检查令牌过期数据,而无需访问数据库

    同时,在数据库中存储随机生成的令牌是一个非常简单的解决方案


    我遗漏了什么吗?

    JWT经常被误解。它们提供的主要好处是无国籍。不管怎样,如果您去数据库查询每个请求的权限,如果不是从理论上而是从实践的角度来看,这几乎是丢失的

    它们通常不存储在仅http的Cookie中,这使它们容易受到XSS攻击,但同时允许Javascript客户端读取有效负载(例如,谁登录,他们拥有什么权限等等)。不存储在cookie中也允许将它们发送到不同的来源,这几乎是它们不应存储在仅http cookie中的唯一原因(如果且仅当您理解并接受此风险时)

    JWT决不会比普通的旧随机会话令牌更好或更安全——在大多数情况下恰恰相反,尤其是与服务器端会话相反,JWT负载是纯文本,这一点常常被忽略。它可以通过消息身份验证防止篡改,但不能防止用户查看,这有时可能会成为一个问题


    如果你不需要上面的特性(无状态,从JavaScript访问),你就不应该有JWT的额外复杂性,那么你只需要一个简单的旧会话。

    < P>你首先要考虑的是谁将生成令牌。 对于JWT,有效的OAUTH提供程序将生成令牌。好处如下:

  • 您可以验证令牌的合法性,这将包括以下检查:

    a。听众

    b。到期日

    c。于

    d。不在日期之前

    e。发行人

  • 您可以仅基于公钥检查颁发者,这将避免到另一个远程服务器(如数据库)的网络访问
  • 您可以注入任何负载,其中可以包括用户信息、电子邮件、角色或任何自定义属性
  • 对于标准OAUTH JWT,您可以使用诸如“Okta”之类的公共提供程序进行测试。与自定义生成器相反,在自定义生成器中,您必须向用户提供检索此类令牌的机制
  • 至于要检查的代码,JWT非常简单,有3个部分由一个“句点”分隔。但是有java和其他语言的库可以为您进行解析-
    com.auth0
    ,特别是
    jwt
    rsa
    ,它们可以让您进行解析和验证


    您的代码将兼容并易于移植到另一个提供商。

    JWT和OAuth之间几乎没有任何关系,只是OAuth碰巧使用JWTs作为令牌格式。在大多数语言中,实现令牌验证是不必要的,因为已经有了解决方案,但很容易出错。此外,您还错过了在进行此类验证时检查hmac这一最重要的事情。