基于令牌的身份验证是否需要将令牌存储在数据库中?
does Token Based Authentication requires to store token in DB?
我在身份验证中使用基于令牌的方法,但在许多博客中我读到他们将令牌存储在数据库中。
我们是否需要将令牌存储在数据库中基于令牌的身份验证中?
https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication
在这个博客中,提到我们正在签署令牌而不是存储在数据库中,我认为这应该是实现真正无状态的方法。
视情况而定。
如果您有多个服务器在服务器重启之间保留令牌,那么您需要将其保存在某个地方。数据库通常是一个简单的选择。
如果您只有一台服务器并且不关心您的用户在重启后必须重新登录,那么您可以将其保留在内存中。
如果您正在使用 linked/mentioned 网页中所述的基于令牌的身份验证,则无需将令牌存储在数据库中。
您必须考虑的是,是否有可能以安全的方式传输资源服务器所需的所有必需信息,以在令牌内传输所需的资源。
要以安全的方式传输例如 userId,您可以额外加密令牌。如果您想确保某些数据永远不会出于安全原因离开您的数据中心,那么将这些数据保存在数据库中是一个好主意,并且令牌仅包含对存储在数据库中的用户相关数据的引用(id) - 更多或更少 Open ID connect.
中描述的内容
您还应该记住,将用户信息添加到令牌意味着每个请求都会有额外的有效负载,并且可能需要更长的时间来加密/解密和签署/验证签名。
如果您打算使用无状态/无数据库的方法,您应该澄清:
- 令牌的可能大小
- 附加 cpu 加载以签署/验证/加密/解密令牌
- header 大小限制
- 分发用于在您的数据中心内签署/验证/加密/解密令牌的密钥
- 延长令牌的生命周期
- 令牌的撤销
- 额外的安全要求 -
即,如果攻击者能够读取/(解密加密的)令牌,这是一个问题吗?
如果您要构建 Web 应用程序,您有几个选择:
- HTML5 网络存储 (localStorage/sessionStorage)
- Cookies
如果您比较这些方法,都会收到一个 JWT 到浏览器。两者都是无状态的,因为您 API 需要的所有信息都在 JWT 中。两者都很容易传递回您受保护的 APIs。区别在于介质。
- 网络存储
Web 存储 (localStorage/sessionStorage) 可通过同一域中的 JavaScript 访问。这意味着您网站上的任何 JavaScript 运行 都可以访问网络存储,因此容易受到 cross-site 脚本 (XSS) 攻击。简而言之,XSS 是一种漏洞,攻击者可以在其中注入 JavaScript,从而在您的页面上 运行。基本的 XSS 攻击试图通过表单输入注入 JavaScript,攻击者将 <script>alert('You are Hacked');</script>
放入表单中以查看它是否被浏览器 运行 以及是否可以被其他用户查看。
作为一种存储机制,网络存储在传输过程中不强制执行任何安全标准。任何阅读和使用 Web Storage 的人都必须尽职调查以确保他们始终通过 HTTPS 而不是 HTTP 发送 JWT。
- Cookies
Cookie 与 HttpOnly
cookie 标志一起使用时,无法通过 JavaScript 访问,并且不受 XSS 攻击。您还可以设置 Secure
cookie 标志以保证 cookie 仅通过 HTTPS 发送。这是过去利用 cookie 来存储令牌或 session 数据的主要原因之一。现代开发人员对使用 cookie 犹豫不决,因为他们传统上需要将状态存储在服务器上,从而打破了 RESTful 最佳实践。如果您在 cookie 中存储 JWT,则 Cookie 作为一种存储机制不需要将状态存储在服务器上。这是因为 JWT 封装了服务器为请求提供服务所需的一切。
但是,cookie 容易受到另一种类型的攻击:cross-site 请求伪造 (CSRF)。 CSRF 攻击是一种攻击,当恶意网站、电子邮件或博客导致用户的 Web 浏览器在用户当前已通过身份验证的受信任站点上执行不需要的操作时发生。
您可以通过包含 xsrfToken
JWT 声明使此 CSRF 保护无状态。
利用您的 Web 应用程序框架的 CSRF 保护使 cookie 非常适合存储 JWT。通过检查 API 中的 HTTP Referer
和 Origin
header 也可以部分阻止 CSRF。 CSRF 攻击将有 Referer
和 Origin
header 与您的应用程序无关。
Read this great blog post from Stormpath了解更多详情。
我正在考虑 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
我在身份验证中使用基于令牌的方法,但在许多博客中我读到他们将令牌存储在数据库中。
我们是否需要将令牌存储在数据库中基于令牌的身份验证中?
https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication
在这个博客中,提到我们正在签署令牌而不是存储在数据库中,我认为这应该是实现真正无状态的方法。
视情况而定。 如果您有多个服务器在服务器重启之间保留令牌,那么您需要将其保存在某个地方。数据库通常是一个简单的选择。 如果您只有一台服务器并且不关心您的用户在重启后必须重新登录,那么您可以将其保留在内存中。
如果您正在使用 linked/mentioned 网页中所述的基于令牌的身份验证,则无需将令牌存储在数据库中。
您必须考虑的是,是否有可能以安全的方式传输资源服务器所需的所有必需信息,以在令牌内传输所需的资源。
要以安全的方式传输例如 userId,您可以额外加密令牌。如果您想确保某些数据永远不会出于安全原因离开您的数据中心,那么将这些数据保存在数据库中是一个好主意,并且令牌仅包含对存储在数据库中的用户相关数据的引用(id) - 更多或更少 Open ID connect.
中描述的内容您还应该记住,将用户信息添加到令牌意味着每个请求都会有额外的有效负载,并且可能需要更长的时间来加密/解密和签署/验证签名。
如果您打算使用无状态/无数据库的方法,您应该澄清:
- 令牌的可能大小
- 附加 cpu 加载以签署/验证/加密/解密令牌
- header 大小限制
- 分发用于在您的数据中心内签署/验证/加密/解密令牌的密钥
- 延长令牌的生命周期
- 令牌的撤销
- 额外的安全要求 - 即,如果攻击者能够读取/(解密加密的)令牌,这是一个问题吗?
如果您要构建 Web 应用程序,您有几个选择:
- HTML5 网络存储 (localStorage/sessionStorage)
- Cookies
如果您比较这些方法,都会收到一个 JWT 到浏览器。两者都是无状态的,因为您 API 需要的所有信息都在 JWT 中。两者都很容易传递回您受保护的 APIs。区别在于介质。
- 网络存储
Web 存储 (localStorage/sessionStorage) 可通过同一域中的 JavaScript 访问。这意味着您网站上的任何 JavaScript 运行 都可以访问网络存储,因此容易受到 cross-site 脚本 (XSS) 攻击。简而言之,XSS 是一种漏洞,攻击者可以在其中注入 JavaScript,从而在您的页面上 运行。基本的 XSS 攻击试图通过表单输入注入 JavaScript,攻击者将 <script>alert('You are Hacked');</script>
放入表单中以查看它是否被浏览器 运行 以及是否可以被其他用户查看。
作为一种存储机制,网络存储在传输过程中不强制执行任何安全标准。任何阅读和使用 Web Storage 的人都必须尽职调查以确保他们始终通过 HTTPS 而不是 HTTP 发送 JWT。
- Cookies
Cookie 与 HttpOnly
cookie 标志一起使用时,无法通过 JavaScript 访问,并且不受 XSS 攻击。您还可以设置 Secure
cookie 标志以保证 cookie 仅通过 HTTPS 发送。这是过去利用 cookie 来存储令牌或 session 数据的主要原因之一。现代开发人员对使用 cookie 犹豫不决,因为他们传统上需要将状态存储在服务器上,从而打破了 RESTful 最佳实践。如果您在 cookie 中存储 JWT,则 Cookie 作为一种存储机制不需要将状态存储在服务器上。这是因为 JWT 封装了服务器为请求提供服务所需的一切。
但是,cookie 容易受到另一种类型的攻击:cross-site 请求伪造 (CSRF)。 CSRF 攻击是一种攻击,当恶意网站、电子邮件或博客导致用户的 Web 浏览器在用户当前已通过身份验证的受信任站点上执行不需要的操作时发生。
您可以通过包含 xsrfToken
JWT 声明使此 CSRF 保护无状态。
利用您的 Web 应用程序框架的 CSRF 保护使 cookie 非常适合存储 JWT。通过检查 API 中的 HTTP Referer
和 Origin
header 也可以部分阻止 CSRF。 CSRF 攻击将有 Referer
和 Origin
header 与您的应用程序无关。
Read this great blog post from Stormpath了解更多详情。
我正在考虑 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