如何将 JWT 令牌存储在仅 HTTP 的 cookie 中?

2024-03-05

我创建了一个应用程序,它仅使用服务器根据正确的登录凭据发送的 JWT,并对任何内容进行授权/api我的后端 Express.js 服务器上的路由。

另一方面,AngularJS 获取此令牌,将其存储在会话存储中,并每次都使用身份验证拦截器将令牌发送回服务器。

我最近才了解到这种做法有多么危险。

我了解在这种情况下代币来回转移的方法。但是,是否有人能从高层次上解释一下当您想要将该 JWT 存储在客户端 Javascript 无法读取的安全、仅 HTTP 的 cookie 中时所采用的方法?

例如:证书成功后

  1. cookie是在服务器上创建的,
  2. 与 cookie 同时创建 JWT
  3. 将 JWT 存储在名为 token 等的 cookie 属性中。

我试图在这里获得一个关于它如何工作的心理模型。如果我的理解是正确的,那么这样做将不再需要身份验证拦截器,因为在正确的凭据登录后,服务器将完成 cookie 内令牌的所有传输。


处理 cookie 有其微妙之处,但从高层次来看,cookie 是您的 Web 服务器可以设置的一段数据,然后由用户的 Web 浏览器存储,并在将来出现任何请求时发送回服务器。只要 cookie 有效且适用于所发出的请求,浏览器就会向同一服务器发出请求。

(这就是为什么您不再需要使用 Angular 拦截器,因为浏览器本身可以确保发送 cookie)

除了一些特殊标志选项(例如仅 HTTP)之外,您还可以在更高级别将 cookie 设置为与给定域和路径关联。例如,您的服务器可以设置一个 cookie,这样浏览器稍后才会将其发送到在/api path.

综上所述,cookie是HTTP的一种状态管理机制,参见相关RFC 2617 https://www.rfc-editor.org/rfc/rfc6265更多细节。

相比之下,JWT 只是一些具有众所周知的表示形式并遵循一些约定的数据。更具体地说,JWT 由标头、有效负载和签名部分组成,通常建议在大多数 JWT 用例中保持较小的有效负载大小。看JSON Web 令牌入门 https://auth0.com/learn/json-web-tokens/更多细节。

如果您阅读上一篇文章,您会注意到 JWT 的最终表示形式是三个用点分隔的 Base64url 编码字符串。这是特别令人感兴趣的,因为这意味着 JWT 非常适合在 HTTP 中使用,包括作为 cookie 的值。

需要记住的一件事是,根据规范,您只能保证浏览器将支持每个 cookie 最多 4096 字节的 cookie(通过 cookie 名称、值和属性的长度总和来衡量)。除非您在令牌中存储大量数据,否则您不应该遇到问题,但这始终是需要考虑的事情。是的,您还可以将 JWT 令牌分解为多个 cookie,但事情开始变得更加复杂。

此外,cookie 有其过期概念,因此请记住这一点,因为 JWT 本身在身份验证范围内使用时也会有自己的过期概念。

最后,我只想解决您对将 JWT 存储在中的一些担忧localStorage/sessionStorage。您是对的,如果您这样做,您必须了解其含义,例如,与存储关联的域内的任何 Javascript 代码都将能够读取令牌。然而,仅 HTTP 的 cookie 也不是灵丹妙药。我想读一下下面的文章:Cookie 与令牌:权威指南 https://dzone.com/articles/cookies-vs-tokens-the-definitive-guide.

它重点介绍传统会话标识符 cookie 与基于令牌 (JWT) 的身份验证系统之间的差异,该部分名为在哪里存储令牌?值得一读,因为它解决了存储的安全相关方面。

给 TL:DR 人员的总结:

网站面临的两个最常见的攻击媒介是跨站点 脚本编写 (XSS) 和跨站请求伪造(XSRF 或 CSRF)。当外部实体能够在您的网站或应用程序中执行代码时,就会发生跨站点脚本攻击。 (...)

如果攻击者可以在您的域上执行代码,您的 JWT 令牌(在本地存储中)是脆弱的。 (...)

如果您将 JWT 与本地存储结合使用,跨站点请求伪造攻击就不是问题。另一方面,如果您的用例要求您将 JWT 存储在 cookie 中,您需要防范 XSRF。

(重点是我的)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 JWT 令牌存储在仅 HTTP 的 cookie 中? 的相关文章

随机推荐

  • 无法使用 jquery 的单击事件处理程序来检测右键单击

    在尝试使用 jquery 检测鼠标右键单击时 我注意到单击事件处理程序似乎不会通过鼠标右键单击触发 而 mousedown 或 mouseup 事件处理程序则会触发 例如 右键单击测试 div 后 会出现以下警报 正在测试 test mou
  • 如何禁用 .htaccess 中的 mod_security 和 mod_security2

    我创建了一个 WordPress 插件 该插件很受欢迎 但我收到很多抱怨它不起作用 登录到许多用户的 WP 网站后 在询问管理员密码后 我注意到我无法轻松解决的最后一个问题是 mod security 和 mod security2 阻止了
  • load 在本地路径上工作,require 则不行

    装载者 rb puts gt This is the second file 加载演示 rb puts This is the first master program file load loadee rb puts And back a
  • Excel:按行内容对列进行排序

    这很难描述 我有一些专栏 比如说三个 10 20 20 20 22 24 24 24 26 我喜欢得到的是 10 XX XX 20 20 20 XX 22 XX 24 24 24 XX XX 26 其中 XX 是空单元格 有办法得到这个吗
  • python 计算列表中的元素数量

    我需要能够计算出列表中有多少个字符串 O top board None None None None None None None None None None None None None None None None None None
  • 使用服务的 DDD 实体

    我有一个应用程序 我试图使用至少一个名义上的 DDD 类型的域模型来构建 并且正在努力解决某个部分 我的实体有一些业务逻辑 这些逻辑使用我当前在某些域服务中拥有的一些财务计算和费率计算 以及我放入值对象中的一些常量值 我正在努力解决如何让实
  • 如何在不使用任何框架或库的情况下在屏幕上绘制图形?

    我想手动绘制图形 这意味着不使用任何库或框架 如 QT directX whindow h 就像向屏幕上的每个像素发出命令以在不同时间显示某种特定颜色 每个机构都会根据这些库或它们的名称提供教程 我想要的是制作我自己的 GUI 据我所知 这
  • 强制从外部页面刷新网页

    我有这样的情况 100 台计算机正在显示一个网页 我可以从后端更新此网页 我希望我的 100 台计算机上显示的网页能够自动更新 有没有办法在不轮询的情况下刷新 更新页面 最好的方法是外部页面可以强制页面重新加载 但我认为这是不可能的 Tha
  • 如何在 mariadb 中使用 -> 运算符查询 JSON 列

    我正在尝试获取时间表 将 json 列数据与 Laravel 项目中的以下代码进行比较 schedules Schedule where schedule with gt company person contact company per
  • Cassandra 3.10 debug.log 频繁包含“FailureDetector.java:457 - 忽略间隔时间...”

    我们的 Cassandra 3 10 集群之一的 debug log 文件经常出现类似于 FailureDetector java 457 忽略 的间隔时间 的消息 即使集群处于空闲状态 也会显示这些消息 我在这个 6 节点集群 两个数据中
  • 使用 Ruby 读取文件的上一行

    如何读取文件的前一行 与 IO gets 相反 我最初想将 IO lineno 设置为我想要读取的行号 但这并没有按预期工作 您实际上如何阅读前一行 一个简单的方法是记住您读过的上一行 prev nil File foreach vimrc
  • 如何获取未知 JSON 层次结构的总深度?

    我一直在努力寻找 构建一个递归函数来解析这个 JSON 文件并获取其子文件的总深度 该文件看起来像这样 var input name positive children name product service children name
  • 从点云到 Mat 的转换

    假设我初始化了一个点云 我想将其 RGB 通道存储在 opencv 的 Mat 数据类型中 我怎样才能做到这一点 pcl PointCloud
  • Chartjs 示例无法重现

    我希望从 Chartjs 文档中重现此示例的结果 https www chartjs org docs latest samples scales time line html https www chartjs org docs late
  • R 3.0.x 中的 RExcel

    兰德之友 http rcom univie ac at download html RAndFriends 其中包括运行所需的所有项目RExcel 仅包括R 2 15 2 我目前使用的是最新版本R but rcom 2 3 1 and rs
  • Android StaggeredGridLayoutManager 偏移错误

    当你清除你的adapter并打电话notifyDataSetChanged 交错网格布局管理器经理还有mCachedStart End in Span 实例 因此 当您向适配器添加新项目时 布局管理器会使用以下命令绘制项目offset 这是
  • 修改可变对象的方法?

    鉴于函数式编程在尽可能坚持不可变变量时是最好的 并且 Ramda 总是进行浅拷贝 那么对象如何must在大多数纯功能框架中处理可变的问题 例如 考虑 PIXI Sprite 在 pixi js 中 显示系统具有链接在一起的固有层次结构 并且
  • 在堆积条形图中添加组之间的间距

    假设我有一个带有分组条形的条形图 酒吧有一个大团体和多个非常小的团体 组标签位于组上 为了增加可读性 我想在组之间引入一定的间距 我使用以下代码和图像编辑器创建了一个示例图像 library ggplot2 g lt ggplot mpg
  • 指示函数使用“参数”对象的最清晰方法是什么?

    指示函数使用 参数 对象的最佳方式是什么 这显然是基于意见的 但是有任何约定吗 什么时候使用参数数组更好 一些例子 Function takes n arguments and makes them pretty function many
  • 如何将 JWT 令牌存储在仅 HTTP 的 cookie 中?

    我创建了一个应用程序 它仅使用服务器根据正确的登录凭据发送的 JWT 并对任何内容进行授权 api我的后端 Express js 服务器上的路由 另一方面 AngularJS 获取此令牌 将其存储在会话存储中 并每次都使用身份验证拦截器将令