JWT 在浏览器中的存储策略

1. 前置

在讨论JWT的存储位置前,我们首先需要了解:

  • JWT主要用于验证数据完整性和来源可靠性,而非提供消息的机密性。由于JWT可能被解码,因此不建议直接存储敏感数据。
  • 在浏览器环境中,安全性相对较低,即使采用风险较低的方案,但是相比于后端等环境仍可能面临更高的潜在威胁。针对安全性需求较高的场景,推荐增加实施多因素认证(MFA)。

2. 存储环境对比

在浏览器环境中,常见的持久化存储位置包括:LocalStorage, SessionStorage, Cookie, 其中 Cookie 有一个特殊的 HttpOnly Cookie,以下是几个存储环境的特性对比:

特性LocalStorageSessionStorageCookieHttpOnly Cookie
数据持久性持久存储,除非手动清除或用户清理数据会话存储,关闭页面会话后数据被清除可设置过期时间,默认为会话cookie同Cookie
过期控制可设置过期时间可设置过期时间
存储容量通常约5MB通常约5MB较小,通常4KB同Cookie
数据共享不随HTTP请求发送不随HTTP请求发送随HTTP请求发送随HTTP请求发送,但不可通过JavaScript访问
访问限制可通过JavaScript访问可通过JavaScript访问可通过JavaScript访问不可通过JavaScript访问
自动发送不自动发送不自动发送自动随请求发送自动随请求发送
安全性存在 XSS 攻击风险存在 XSS 攻击风险存在 XSS, CSRF 攻击风险存在 CSRF 攻击风险;JS 无法访问,包括自己的
设置/获取方法localStorage.setItem(), localStorage.getItem()sessionStorage.setItem(), sessionStorage.getItem()document.cookiedocument.cookie
适用场景存储大量数据,非敏感数据临时存储会话数据用户认证,跟踪状态安全的用户认证,减少XSS风险

3. 具体存储方案探讨

3.1. 前置说明

  1. 此章节关于 Cookie 的讨论均基于 SameSite=Lax 属性。
  2. HttpOnly Cookie 禁止 JS 获取 Cookie,所以 React, Vue 等框架也无法获取 JWT 的值。

*虽然 SameSite=Lax 大幅降低了 CSRF 风险,但是 SameSite-Lax 在预加载等场景仍可能存在 CSRF 风险。

3.2. 具体方案以及对比

方案一:使用 Access Token 和 Refresh Token,在 LocalStorage 存放短期的 Access Token,再使用 HttpOnly Cookie 中存放 Refresh Token。

  • 在安全性与兼容性中取平衡,
  • 优点:
    • LocalStorage 中存放的 Access Token 可以便捷的放到 Header authentication 中,兼容大部分主流框架;
    • 同时 Access Token 有效期较短,可以一定程度上降低泄露的风险;
    • Refresh Token 放在 HttpOnly Cookie 中可以有效降低 XSS 攻击风险;
    • 开发中可以分步开发,先实现简单的 Access Token 之后再实现 Refresh Token。
  • 缺点:
    • 前后端需要额外维护 Refresh Token;
    • Access Token 相对存在更高的 XSS 攻击风险;
    • LocalStorage 无法控制 token 在本地存储的时间。

方案二:使用 HttpOnly Cookie 存放 JWT。

  • 优点:
    • XSS 风险较低;
    • 可以有效控制 JWT 的存放时间。
  • 缺点:
    • SameSite=Lax 在预加载等场景仍可能存在 CSRF 风险;
    • 前端 JS 无法实现获取 JWT,所以无法将 JWT 存放到 Header authentication 中,所以与第三方前后端框架交互存在一定程度的兼容性;
    • 前期开发成本相对较高,需要手动实现相关 JWT 的解析、封装和管理。

4. 附言

综合而言,在浏览器环境中安全性相对较低,使用 JWT 的目的之一,就是为了简化认证流程,多应用单点登录,过分的依赖于 JWT 不会被窃取,强化 JWT 来源的识别,反而违背了 JWT 的设计。针对安全性需求较高的场景,推荐增加更多的安全校验如 IP 地址识别,设备识别等,以及实施多因素认证(MFA)。

5. 参考

  1. Token 放 localStorage?sessionStorage?還是 Cookie?| 是 Ray 不是 Array: https://israynotarray.com/information-security/20230516/18406287/
  2. authentication - Store Auth-Token in Cookie or Header? - Information Security Stack Exchange: https://security.stackexchange.com/questions/180357/store-auth-token-in-cookie-or-header
  3. authentication - Secure HttpOnly Cookie or Header field for auth token securing an API? - Information Security Stack Exchange: https://security.stackexchange.com/questions/119892/secure-httponly-cookie-or-header-field-for-auth-token-securing-an-api
  4. Using HTTPOnly Cookies to Strengthen User Authentication - Technology - Notarize | Notarize Blog: https://www.notarize.com/blog/using-httponly-cookies-to-strengthen-user-authentication

  • 本作品采用 署名-相同方式共享 4.0 国际(CC BY-SA 4.0 DEED) 许可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904721.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开关灯问题(c语言)

样例&#xff1a;10 10 &#xff0c;输出&#xff1a;1&#xff0c;4&#xff0c;9 5 5 &#xff0c;输出&#xff1a;1&#xff0c;4 代码如下 #include<stdio.h> //引入bool值的概念 #include<stdbool.h> int main() {int n 0;//n为灯的数量int m 0;…

扫雷游戏(C语言详解)

扫雷游戏&#xff08;C语言详解&#xff09; 放在最前面的1、前言&#xff08;扫雷游戏的简介&#xff09;2、扫雷游戏的规则&#xff08;简易版&#xff09;3、代码实现&#xff08;3.1&#xff09;提醒一下&#xff1a;( i ) 提醒1&#xff1a;( ii ) 提醒2&#xff1a; &…

在面试了些外包以后,我有了些自己的思考

大家好&#xff0c;我是洋子&#xff0c;最近公司在降本增效&#xff0c;需要把外包从北京迁移到陕西的某新一线城市&#xff0c;其实就是变相裁员&#xff0c;减少外包的成本&#xff0c;裁掉现有的员工&#xff0c;重新招聘新人 在整个测试行业&#xff0c;外包测试的比重是…

论文 | Ignore Previous Prompt: Attack Techniques For Language Models

这篇论文探讨了针对大型语言模型&#xff08;LLM&#xff09;的“提示注入”攻击&#xff0c;并提出了一种名为 PROMPTINJECT 的框架来研究这类攻击。 论文的主要内容包括&#xff1a;1. 提示注入攻击&#xff1a; 论文定义了“提示注入”的概念&#xff0c;即通过在用…

Django-中间件

定义&#xff1a; 编写中间件&#xff1a; 注册中间件&#xff1a; 添加中间件&#xff1a; 1.在项目目录下添加一个文件夹&#xff08;名字随意&#xff09;&#xff0c;然后文件夹下创建.py文件 2.将中间件添加到setting文件中 MIDDLEWARE [django.middleware.security.Se…

MBR20100CT-ASEMI半塑封肖特基二极管MBR20100CT

编辑&#xff1a;ll MBR20100CT-ASEMI半塑封肖特基二极管MBR20100CT 型号&#xff1a;MBR20100CT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220 安装方式&#xff1a;插件 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环…

操作数据表

创建表 创建表语法&#xff1a; CREATE TABLE table_name ( field1 datatype [COMMENT 注释内容], field2 datatype [COMMENT 注释内容], field3 datatype ); 注意&#xff1a; 1. 蓝色字体为关键字 2. CREATE TABLE 是创建数据表的固定关键字&#xff0c;表…

一、ARMv8寄存器之通用、状态、特殊寄存器

ARMV8核心寄存器数量是非常大的&#xff0c;为了更好的学习&#xff0c;可以划分为以下几大类&#xff1a; 通用寄存器。这类寄存器主要是用来暂存数据和参与运算。通过load\store指令操作。状态寄存器。AArch64体系结构使用PSTATE寄存器表示当前处理器状态。特殊寄存器。有专门…

WPF+MVVM案例实战(六)- 自定义分页控件实现

文章目录 1、项目准备2、功能实现1、分页控件 DataPager 实现2、分页控件数据模型与查询行为3、数据界面实现 3、运行效果4、源代码获取 1、项目准备 打开项目 Wpf_Examples&#xff0c;新建 PageBarWindow.xaml 界面、PageBarViewModel.cs ,在用户控件库 UserControlLib中创建…

【Docker】构建Linux云桌面环境

目录 一、说明 二、离线安装Docker 1&#xff09;将下载的包上传到服务器上去 2&#xff09;安装docker 3) 启动docker 4&#xff09;配置加速器 三、安装云桌面镜像 四、启动云桌面 方式一&#xff1a;docker命令直接运行 方式二&#xff1a;docker-compose方式 五…

Easysearch 与 LLM 融合打造知识库系统

文章目录 一、LangChain 简介二、RAG 产生的背景及其局限性三、RAG 工作流程四、 Easysearch 结合 LLM 实现 RAG&#xff08;1&#xff09;Easysearch 简介&#xff08;2&#xff09;结合实现RAG 五、 Easysearch 结合 LLM 实现 RAG 的优势&#xff08;1&#xff09;提高检索准…

驱动-----adc

在key1.c的基础上进行对adc1.c进行编写 首先将文件里面的key全部改为adc 再修改一下设备号 按键和adc的区别是什么,按键只需要按一下就触发了,并且不需要返回一个值出来, adc要初始化,启动,返回值 以下是裸机adc的代码: #include <s3c2440.h> #include "ad…

快速生成高质量提示词,Image to Prompt 更高效

抖知书老师推荐&#xff1a; 随着 AI 技术的不断发展&#xff0c;视觉信息与语言信息之间的转换变得越来越便捷。在如今的数字化生活中&#xff0c;图像与文字的交互需求愈发旺盛&#xff0c;很多人都希望能轻松将图像内容直接转化为文本描述。今天我们来推荐一款实用的 AI 工…

FileLink跨网文件传输与传统文件传输对比

在数字化时代&#xff0c;文件传输已成为企业日常运营不可或缺的一部分。然而&#xff0c;随着企业规模的扩大和业务的复杂化&#xff0c;传统的文件传输方式逐渐暴露出诸多不足。本文将对比FileLink跨网文件传输与传统文件传输方式&#xff0c;揭示FileLink在高效性、安全性和…

渗透测试-百日筑基—文件上传篇特征截断渲染%00绕过——下篇

目录 day10-渗透测试文件上传篇&绕过&特征&截断&渲染 一、黑名单大小写绕过代码分析 1、获取文件后缀名进行判断&#xff0c;如果后缀在这个字典里就禁止上传。 2、黑名单大小写绕过攻击 二、利用 windows 系统特征绕过上传 1、windows 系统特征绕过漏洞…

YoloV9改进策略:Block改进|RFE模块,提高小物体的识别精度|即插即用|代码+修改过程

摘要 论文介绍 本文介绍了一种基于YOLOv5的人脸检测方法,命名为YOLO-FaceV2。该方法旨在解决人脸检测中的尺度变化、简单与困难样本不平衡以及人脸遮挡等问题。通过引入一系列创新模块和损失函数,YOLO-FaceV2在WiderFace数据集上取得了优异的表现,特别是在小物体、遮挡和困…

CodeQL学习笔记(3)-QL语法(模块、变量、表达式、公式和注解)

最近在学习CodeQL&#xff0c;对于CodeQL就不介绍了&#xff0c;目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记&#xff0c;根据个人知识库笔记修改整理而来的&#xff0c;分享出来共同学习。个人觉得QL的语法比较反人类&#xff0c;至少与目前主流的这些OOP语言相比&…

QT-使用QSS美化UI界面

一、QSS简介&#xff1a; Qt Style Sheet&#xff1a;Qt样式表&#xff0c;用来自定义控件外观的一种机制&#xff0c;可以把他类比成CSS&#xff08;CSS主要功能与最终目的都是能使界面的表现与界面的元素分离&#xff09;。QSS机制使应用程序也能像web界面那样随意地改变外观…

江协科技STM32学习- P23 DMA 直接存储器存取

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Adb命令大全

本文列举了几乎所有的adb命令&#xff0c;方便Android学习者或者开发工程师在日常学习开发过程中查询使用。建议收藏。 Adb Server adb kill-server adb start-server 重启 adb reboot adb reboot recovery adb reboot-bootloader adb root //restarts adb with root permis…