如果用于认证的JWT令牌保存在HTTP-Only cookie中,你如何从cookie中读取它,以便我可以在请求头中包含它?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果用于认证的JWT令牌保存在HTTP-Only cookie中,你如何从cookie中读取它,以便我可以在请求头中包含它?相关的知识,希望对你有一定的参考价值。

我正在构建一个使用JWT进行用户认证的Node网络应用。

我的服务器将JWT发送到 HTTP-Only 当用户提交正确的ID和密码时,通过'Set-Cookie'访问cookie,但我被如何访问存储在cookie中的JWT卡住了,这样我就可以在授权的API请求时将其包含在授权头中。

我如何从客户端访问HTTP-Only cookie,以便在向服务器发送API请求时包含它?

或者,让服务器在响应体中发送JWT,完全不使用cookie是否安全? 这样我就可以通过把JWT放在客户端的变量中来使用它? 这样一来,我相信只有在用户关闭浏览器之前,这个变量才是活的。

我找了很多资源,但都没能找到明确的答案,我被这个问题卡住了。

答案

虽然有许多方法来解决这个问题,我将建议的方法,客户端发送JWT两次在每个请求:在一个HttpOnly cookie,也是一个 Authentication: 头。


让我们来看看每一个都在解决什么安全问题。

HttpOnly Cookie

来自 Mozilla文档:

为了帮助减轻跨站点脚本(XSS)攻击,HttpOnly cookies是无法访问javascript的Document.cookie API的;它们只被发送到服务器。

这是为了减轻跨站脚本风险;想象一下,你的网站有一个XSS vuln -- 例如,我可以在网站上放上 <script>some_code{..}</script> 到评论中,任何浏览我的评论的用户都会在他们的浏览器中运行我的代码。是的,攻击者的代码是在受害者登录的浏览器内运行,但由于受害者的 HttpOnly 标志,它不能提取会话cookie并发送给攻击者。

认证头

Cookie认证的问题是,浏览器会自动将它们附加到任何对Cookie所属域的请求中,这使得 跨站请求伪造 攻击。为了防止这种情况的发生,通常的方法是将会话标记(在你的例子中是JWT)用cookie以外的方法发送给客户端,即用不同的头,或者用隐藏的html字段。

如果客户端能够在下一个请求中把JWT标记回传给你,这就意味着他们能够读取之前的响应,而不是盲目注入CSRF攻击的攻击者。


总体建议

将两者结合起来!

这两种方法有不同的作用。HttpOnly cookie可以防止XSS攻击,而认证头可以防止CSRF攻击。

有许多方法可以将它们结合起来,但它们都归结为将JWT放在某种认证头中,并在cookie中放入sessionID,让服务器检查这些是否属于同一个会话。重要的是:记住,在你的网站上实现XSS的攻击者将能够读取JWT,所以为了让cookie发挥它的作用,cookie应该是一个独立的值,不包含在JWT中。(即如果攻击者可以通过查看JWT找出正确的cookie值,那么这个cookie就没有提供任何安全性)。

以上是关于如果用于认证的JWT令牌保存在HTTP-Only cookie中,你如何从cookie中读取它,以便我可以在请求头中包含它?的主要内容,如果未能解决你的问题,请参考以下文章

节点js jwt认证

springboot集成jwt令牌前后端分离模式下的身份认证方式

JWT 令牌是如何认证的?

JWT认证方案与禁用令牌策略

为啥不将 JWT 访问令牌存储在内存中并在 cookie 中刷新令牌?

什么是JWT令牌认证?