百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

前端架构师成长之路:避免将 JWT 存储在 localStorage 中

myzbx 2025-01-03 17:42 31 浏览

看到很多文章介绍将 JWT 存储在 localStorage 中,事实上,个人觉得建议最好不要。这就是将敏感信息存储在 localStorage 中,对于安全问题来说是个挑战,对于客户端的行为在安全问题上多数是不可靠的。

先简单介绍一下本地存储。

本地存储

localStorage 是 HTML5 的一项新特征,它基本上允许 Web 开发人员使用 JavaScript 在用户的浏览器中存储想要的任何信息,十分简单。

在操作上,localStorage 只是一个可以添加或删除数据的 JavaScript 对象,下面是一段 localStorage 操作的示例代码,该代码片段将创建一个指定 KeylocalStorage 数据,并可以为其更新、删除数据。

export const useStorage = (
    valKey = "authorization",
    keyPrefix = "DevPoint"
) => {
    const localKey = `${valKey}.${keyPrefix}`;
    const save = (data) => {
        window.localStorage.setItem(localKey, JSON.stringify(deepCopy(data)));
    };
    const get = () => {
        const localData = window.localStorage.getItem(localKey);
        if (localData && localData !== "") {
            return JSON.parse(localData);
        } else {
            return false;
        }
    };
    /**
     * 清除 localStorage 中 valKey 的值
     */
    const clear = () => {
        window.localStorage.setItem(localKey, "");
    };
    return {
        save,
        get,
        clear,
    };
};
// 清除所有的 localStorage
export const cleanAll = () => {
    window.localStorage.clear();
};

打开浏览器开发工具,在控制台窗口的 Application 的标签页下看到,左侧的 Storage 可以看到,如下图所示:

localStorage 是一个纯 JavaScript 对象。如果正在构建一个单页面站点,使用 localStorage 之类的东西意味着网页可以独立于任何 Web 服务器运行,只需要浏览器存储空间,而无需在服务器中存储任何数据。

此外,localStorage 的好处是大小限制:像 Cookie 一般是 4KB 的大小限制,而 localStorage 在所有主流浏览器中至少5MB 的数据存储。因此现在也越来越多的 Web 应用使用 localStorage 来存储一些数据。

安全问题

localStorage 尽管使用简单,但在安全问题上,没有任何的保护措施,这就意味着敏感信息存储在 localStorage 会带来安全问题。

将任何敏感信息存储在localStorage 中相当于在互联网中发布了这些信息。localStorage 设计的目的是为浏览器增加本地存储机制,被设计为简单的 key/avalue 存储,开发人员可以使用它来构建稍微复杂的单页应用程序。

当将敏感信息存储在 localStorage 中时,实际上是在使用世界上最危险的东西 JavaScript 将最敏感的信息存储在有史以来最糟糕的保险库中,绝对不是一个好注意

如果攻击者可以在您的网站上运行 JavaScript,他们就可以检索您存储在 localStorage 中的所有数据并将其发送到他们自己的域中。这意味着存储在 localStorage 中的敏感信息都有可能受到损害。

当然可能有足够的信息认为 Javascipt 无法在您的站点中运行,但是如果您的站点包含来自域外源的第三方 JavaScript 代码,例如一些第三方脚本库的CDN源:

  • bootstrap 源
  • jQuery
  • 广告脚本
  • 谷歌分析链接
  • 跟踪脚本
  • ...

一旦出现第三方脚本库被攻击了就会带来安全上的威胁,或许不曾使用第三方脚本库,又或者第三方脚本库绝对安全。

如果需要考虑所有可能的场景,为了降低安全事故的风险,建议尽量不要在 localStorage 中存储任何重要的敏感信息。

JWT 本质上与用户名/密码 在功能上相同,一旦知道 JWT 就相当于知道了用户名和密码。

如果攻击者可以获得 JWT 副本,就可以神不知鬼不觉的伪造请求向网站发出请求,因此建议不要将敏感信息存储在 localStorage 中。

JWT存储在 HttpOnly Cookie

本文只是介绍了将 JWT 存储在 localStorage 得不好,不推荐这样使用。

建议的方式是将JWT存储在 HttpOnly Cookie 中,优点是不需要在 JavaScript 代码中处理 Token , 后续请求中都会自动跟上 Token 信息的 Cookie

再者 Cookie 的 HttpOnly 标签是防御 XSS 的解决方案之一,因为 HttpOnly 在简单的条件下阻止客户端(JavaScript)访问 Cookie。如果再将 secure 标志设置为 true,则只会在安全或加密的网络中使用 Cookie,从而增加其安全性。

虽然上面的方式可以防御 XSS ,但还存在另一个威胁即跨站请求伪造(CSRF),可以采用 CORS 白名单机制,并且 CSRF 令牌(可以参阅《CSRF 攻击:解析、预防和 CSRF 令牌》)与 JWT 一起使用。

但是在某些情况下,例如当 API 被移动应用程序使用并且它需要 Authorization Bearer xxx 标头而不是 Cookie 时,或者当需要使用同一个 JWT 向多个后端发出 HTTP 请求时,把 JWT 存在 localStorage 中的方案就更方便。

还有一点 Cookie 存储的大小为 4KB ,因此在使用这个方案的时候需要注意 JWT 的大小。如果 JWT 超过了 4KB 就不适合使用 Cookie 存储 JWT的方案。

总结

JWT 是一个非常流行的标准,可以使用签名来信任请求,并在各方之间安全的交换信息。在实际项目开发中,建议避免将 JWT 存储在 localStorage 中,而是存储在 HttpOnly Cookie

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...