Authentication 基于令牌的身份验证是否需要在数据库中存储令牌?

Authentication 基于令牌的身份验证是否需要在数据库中存储令牌?,authentication,token,Authentication,Token,我在身份验证中使用基于令牌的方法,但在许多博客中,我看到他们将令牌存储在数据库中 我们是否需要在DB中基于令牌的身份验证中存储令牌 在这个博客中,有人提到我们正在对令牌进行签名,而不是存储在数据库中,我认为这应该是实现真正无状态的方法。这取决于情况。 如果您有多台服务器,请在服务器重新启动之间保留令牌,而不是将其保留在某个位置。数据库通常是一个简单的选择。 如果您只有一台服务器,并且不关心用户在重新启动后必须再次登录,那么您可以将其保留在内存中。如果您使用链接/提及的网页中所述的令牌基础身份验

我在身份验证中使用基于令牌的方法,但在许多博客中,我看到他们将令牌存储在数据库中

我们是否需要在DB中基于令牌的身份验证中存储令牌

在这个博客中,有人提到我们正在对令牌进行签名,而不是存储在数据库中,我认为这应该是实现真正无状态的方法。

这取决于情况。 如果您有多台服务器,请在服务器重新启动之间保留令牌,而不是将其保留在某个位置。数据库通常是一个简单的选择。
如果您只有一台服务器,并且不关心用户在重新启动后必须再次登录,那么您可以将其保留在内存中。

如果您使用链接/提及的网页中所述的令牌基础身份验证,则无需将令牌存储在数据库中

您必须考虑的是,可以传输所有需要的信息,资源服务器需要完全填充,以安全的方式在令牌内传递所请求的资源。p> 例如,为了以安全的方式传输userId,您可以另外加密令牌。如果您希望确保某些数据不会出于安全原因离开数据中心,那么最好将这些数据保存在数据库中,并且令牌只包含对存储在数据库中的用户相关数据的引用(id)——这或多或少与中的描述相同

您还应该记住,将用户信息添加到令牌意味着每个请求都有额外的负载,并且可能需要更长的时间来加密/解密和签名/验证签名

如果您打算使用无状态/无数据库方法,您应该澄清:

  • 令牌的可能大小
  • 用于签名/验证/加密/解密令牌的额外cpu负载
  • 标题大小限制
  • 分发用于在数据中心内对令牌进行签名/验证/加密/解密的密钥
  • 延长令牌的生存期
  • 兑换代币
  • 其他保安规定— i、 e.如果攻击者能够读取/(解密加密的)令牌,是否存在问题

如果您正在构建web应用程序,您有两个选项:

  • HTML5 Web存储(本地存储/会话存储)
  • 饼干
  • 如果比较这些方法,两种方法都会在浏览器中接收JWT。两者都是无状态的,因为API需要的所有信息都在JWT中。这两种方法都很容易传递回受保护的API。区别在于媒介

    • 网络存储
    Web存储(localStorage/sessionStorage)可通过同一域上的JavaScript访问。这意味着在您的站点上运行的任何JavaScript都可以访问web存储,因此很容易受到跨站点脚本(XSS)攻击。简而言之,XSS是一种漏洞类型,攻击者可以在其中注入将在您的页面上运行的JavaScript。基本XSS攻击试图通过表单输入注入JavaScript,攻击者在表单输入中发出
    警报(“您被黑客攻击”)编码到表单中,以查看该表单是否由浏览器运行,是否可供其他用户查看

    作为一种存储机制,Web存储在传输过程中不强制执行任何安全标准。无论谁阅读并使用Web存储,都必须尽职尽责,确保始终通过HTTPS发送JWT,而不是HTTP

    • 饼干
    当cookie与
    HttpOnly
    cookie标志一起使用时,不能通过JavaScript访问,并且不受XSS的影响。您还可以设置
    Secure
    cookie标志,以确保cookie仅通过HTTPS发送。这是过去利用cookie存储令牌或会话数据的主要原因之一。现代开发人员对使用cookie犹豫不决,因为他们传统上要求状态存储在服务器上,从而打破了RESTful最佳实践。如果在cookie中存储JWT,则作为存储机制的cookie不需要在服务器上存储状态。这是因为JWT封装了服务器服务请求所需的一切

    但是,Cookie容易受到不同类型的攻击:跨站点请求伪造(CSRF)。CSRF攻击是一种攻击类型,当恶意网站、电子邮件或博客导致用户的web浏览器在用户当前已通过身份验证的受信任网站上执行不必要的操作时,会发生这种攻击

    通过包含
    xsrfToken
    JWT声明,可以使此CSRF保护成为无状态

    利用您的web应用程序框架的CSRF保护,使Cookie在存储JWT时坚如磐石。通过检查API中的HTTP
    Referer
    Origin
    头,也可以部分防止CSRF。CSRF攻击将具有与您的应用程序无关的
    Referer
    Origin


    有关更多详细信息,请参阅。

    我正在考虑web应用程序调用rest api的两种方法

     first: store on db and each request call we make a check token.
     second: store on cookies and it check in services memory
    

    你是说头认证?还有类似这样的
    身份验证:基本xSdaqsdfawEFdqweD
    ?但basic只是base64,不需要保存。你可以每次都计算它们。我在读,他们提到Java Web令牌,而不是将令牌存储在数据库中。这取决于,你希望身份验证保持不变吗?那不是真的。其思想是,在授权期间,(授权)服务器创建一个签名(并加密)令牌,客户端在每个请求中发送该令牌。任何具有正确密钥的(资源)服务器都可以(解密)和验证令牌,而无需本地持久性。这里有趣的问题是:如何分发如何在不知道令牌存在的情况下(由于缺乏持久性)构建重新登录列表,以及如何分发/交换/旋转加密/签名密钥。如果您有多台服务器,则需要