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

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

wxin55 2025-05-03 17:09 2 浏览 0 评论

看到很多文章介绍将 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

相关推荐

Shiro学习系列教程三:集成web(web集成环境)

相关推荐:《Shiro学习系列教程一:Shiro之helloworld》《Shiro学习系列教程三:集成web》《Shiro学习系列教程四:集成web(二)》《Shiro学习系列教程五:自定义Real...

写了这么多年代码,这样的登录方式还是头一回见

SpringSecurity系列还没搞完,最近还在研究。有的时候我不禁想,如果从SpringSecurity诞生的第一天开始,我们就一直在追踪它,那么今天再去看它的源码一定很简单,因为我们了...

Shiro框架:认证和授权原理(shiro框架授权的四种方式)

优质文章,及时送达前言Shiro作为解决权限问题的常用框架,常用于解决认证、授权、加密、会话管理等场景。本文将对Shiro的认证和授权原理进行介绍:Shiro可以做什么?、Shiro是由什么组成的?举...

Spring Boot 整合 Shiro-登录认证和权限管理

这篇文章我们来学习如何使用SpringBoot集成ApacheShiro。安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求。在Java领域一般有SpringS...

Apache Shiro权限管理解析二Apache Shiro核心组件

ApacheShiro核心组件Subject(用户主体)Subject是Shiro中的核心概念之一,表示当前用户(可以是登录的用户或匿名用户)。它是与用户交互的主要接口,提供了对用户身份验证...

详细介绍一下Apache Shiro的实现原理?

ApacheShiro是一个强大、灵活的Java安全框架,设计目标是简化复杂的安全需求,提供灵活的API,使开发者能方便地将安全功能集成到任何应用中。主要作用是用于管理身份验证、授权、会话管理和加...

什么是Apache Shiro?SpringBoot中如何整合Apache Shiro?

ApacheShiro是一个功能强大且易于使用的Java安全框架,主要用于构建安全的企业应用程序,例如在应用中处理身份验证(Authentication)、授权(Authorization)、加密(...

Apache Shiro权限管理解析三Apache Shiro应用

Shiro的优势与适用场景优势简单易用:API设计直观,适合中小型项目快速实现权限管理。灵活性高:支持多种数据源(数据库、LDAP等),并允许开发者自定义Realm。跨平台支持:不仅限于We...

那些通用清除软件不曾注意的秘密(清理不需要的应用)

系统清理就像卫生检查前的大扫除,即使你使出吃奶的劲儿把一切可能的地方都打扫过,还会留下边边角角的遗漏。随着大家电脑安全意识的提高,越来越多的朋友开始关注自己的电脑安全,也知道安装360系列软件来"武装...

JWT在跨域认证中的奇妙应用(jq解决跨域)

JWT在跨域认证中的奇妙应用什么是JWT?让我们先来聊聊JWT(JSONWebToken)。它是一种轻量级的认证机制,就像一张电子车票,能让用户在不同的站点间通行无阻。JWT由三部分组成:头部(H...

开启无痕浏览模式真能保护个人隐私吗?

在访问网站页面时,你是否有过这样的疑虑,自己访问的会不会是山寨网站?用公用电脑上网,个人信息会被别人看到吗?这时,有人会说,使用浏览器的“无痕浏览”模式不就行了,可以在操作中不留下“蛛丝马迹”,但,真...

辅助上网为啥会被抛弃 曲奇(Cookie)虽甜但有毒

近期有个小新闻,大概很多小伙伴都没有注意到,那就是谷歌Chrome浏览器要弃用Cookie了!说到Cookie功能,很多小伙伴大概觉得不怎么熟悉,有可能还不如前一段时间被弃用的Flash“出名”,但它...

cookie、session和token(cookie,session和token的区别)

Cookie的概念最早是在1994年由NetscapeCommunications的程序员LouMontulli发明的,目的是为了解决当时早期互联网的一个关键问题:HTTP无状态协...

小白都能看懂的session与cookie的区别理解

cookie/session都是跟踪识别浏览器用户身份的一个东西。cookie的理解:我们要知道,服务器和客户端之间进行数据传输,需要使用到一个超文本传输协议(http协议),而http协议本身是个...

面试:网易一面:支撑10万QPS的电商购物车系统如何架构设计呢?

1.需求分析:10万QPS的购物车系统需要满足哪些需求?回答:10万QPS的购物车系统需要满足以下核心需求和挑战:核心功能:添加、删除、修改购物车商品实时查看购物车列表支持高并发读写(10万QPS)...

取消回复欢迎 发表评论: