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

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

仲学真
2023-03-14

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

我们需要将令牌存储在DB中的基于令牌的身份验证中吗?

https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication

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

共有3个答案

柯波娃
2023-03-14

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

  1. HTML5 Web存储(本地存储/会话存储)
  2. 饼干

如果比较这些方法,则两者都会在浏览器中接收 JWT。两者都是无状态的,因为您的 API 所需的所有信息都在 JWT 中。两者都很容易传递回受保护的 API。区别在于介质。

  • 网络存储

可以通过同一域上的JavaScript访问Web存储。这意味着在您的站点上运行的任何JavaScript都可以访问Web存储,因此很容易受到跨站点脚本(XSS)攻击。简而言之,XSS是一种漏洞,攻击者可以注入将在您的页面上运行的JavaScript。基本的XSS攻击试图通过表单输入注入JavaScript,攻击者将

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

  • 饼干

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

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

您可以通过包含< code>xsrfToken JWT声明来使这种CSRF保护无状态。

利用 Web 应用程序框架的 CSRF 保护,使 cookie 成为存储 JWT 的坚如磐石。CSRF 也可以通过检查 API 中的 HTTP RefererOrigin 标头来部分阻止。CSRF 攻击将具有与您的应用程序无关的引用标头。

阅读Stormpath的这篇博文,了解更多细节。

葛烨
2023-03-14

看情况。如果有多台服务器在服务器重新启动之间保留令牌,则需要将其保存在某个地方。数据库通常是一个简单的选择。如果您只有一台服务器,并且不在乎重启后用户必须再次登录,那么您可以将它保存在内存中。

伯君浩
2023-03-14

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

您必须考虑的是,可以传输资源服务器所需的所有必需信息,以便以安全的方式在令牌中完成交付请求的资源。

为了以安全的方式传输例如userId,您可以额外加密令牌。如果您想确保某些数据出于安全原因永远不会离开您的数据中心,那么将这些数据保存在数据库中是一个好主意,并且令牌只包含对存储在数据库中的用户相关数据的引用(id)-这或多或少是Open id connect中所描述的。

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

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

  • 令牌的可能大小
  • 对令牌进行签名/验证/加密/解密的额外cpu负载
  • 标头大小限制
  • 在数据中心内分配用于签署/验证/encrpyt/解密令牌的密钥
  • 延长令牌的生命周期
  • 令牌的撤销
  • 额外的安全要求-即如果攻击者能够读取/(解密加密的)令牌是否有问题?
 类似资料:
  • 我正在构建一个基于令牌的身份验证(Node.js使用带有angular客户端的passport/JWT)。 用户输入凭证后,他将获得一个访问令牌,并在头中的每个请求中发送该令牌(头:bearer token)。 我不想每次他的访问令牌过期时都提示登录请求(我猜大约每天),我听说过刷新令牌。刷新令牌永不过期(或很少过期),并且能够无限期续订令牌。当访问令牌即将过期时,客户端可以通过发送刷新令牌来发送

  • 问题内容: 我有一个REST API,我正在使用Spring Security基本授权进行身份验证,客户端会为每个请求发送用户名和密码。现在,我想实现基于令牌的身份验证,当用户最初通过身份验证时,我将在响应标头中发送令牌。对于进一步的请求,客户端可以在令牌中包含该令牌,该令牌将用于对资源进行用户身份验证。我有两个身份验证提供程序tokenAuthenticationProvider和daoAuth

  • 在daoAuthenticationProvider中,我设置了自定义userDetailsService并通过从数据库中获取用户登录详细信息对其进行身份验证(只要使用授权传递用户名和密码就可以正常工作:basic bgllqxbpvxnlcjogn21wxidmqjrdturtr04pag==作为头) 但是当我使用X-AUTH-TOKEN(即constants.auth_header_name)

  • } 要获取令牌,我执行以下步骤: > 使用浏览器转到:http://localhost:9000/oauth/authorize?response_type=code&client_id=test&redirect_uri=http%3a%2f%2flocalhost%3a8080%2f&scope=write 首先,它将我重定向到一个登录表单,在那里我输入用户名和密码:admin abc 请帮我

  • 问题内容: 我正在PHP Lumen中构建一个应用程序,该应用程序在登录时会返回令牌。我不知道如何继续进行。 我应该如何使用这些令牌维护会话? 具体来说,如果我使用reactjs或原始HTML / CSS / jQuery,如何将令牌存储在客户端,并在我为Web应用程序的安全部分提出的每个请求中发送令牌? 问题答案: 我通常要做的是将令牌保留在本地存储中,这样即使用户离开站点,我也可以保留令牌。

  • 我正在PHP Lumen中构建一个应用程序,它在登录时返回令牌。我不知道如何继续。 我应该如何使用这些令牌维护会话? 具体来说,如果我使用reactjs或vanilla HTML/CSS/jQuery,我如何在客户端存储令牌,并在我为web应用程序的安全部分发出的每个请求中发送它们?