token 应该存在 Cookie、SessionStorage 还是 LocalStorage 中?

2023-11-14

在Web开发中,token(令牌)可以存储在多个地方,包括cookie、sessionStorage和localStorage。每种存储方式都有其优点和缺点,选择哪种方式取决于你的应用需求。

1. Cookie:将token存储在cookie中是一种常见的做法。这种方式的优点是,即使在浏览器关闭后,cookie仍然存在,因此用户可以保持登录状态。然而,cookie的缺点是容易受到CSRF(跨站请求伪造)攻击。

2. SessionStorage:将token存储在sessionStorage中的优点是,它只在当前会话中存在,当用户关闭浏览器后,sessionStorage中的数据将被清除。这种方式的缺点是,如果用户在浏览器中打开新的标签页或窗口,那么新的页面将无法访问sessionStorage中的数据。

3. LocalStorage:将token存储在localStorage中的优点是,即使在浏览器关闭后,localStorage中的数据仍然存在,因此用户可以保持登录状态。此外,localStorage中的数据可以在同一浏览器的所有标签页和窗口中共享。然而,localStorage的缺点是容易受到XSS(跨站脚本)攻击。

总的来说,将token存储在哪里取决于你的应用需求。如果你的应用需要在用户关闭浏览器后保持登录状态,那么你可以选择将token存储在cookie或localStorage中。如果你的应用需要在用户关闭浏览器后清除token,那么你可以选择将token存储在sessionStorage中。

在Web开发中,安全性是非常重要的。无论你选择哪种存储方式,都需要采取适当的安全措施,以防止CSRF和XSS攻击。

// 存储token
document.cookie = "token=your_token";  // 存储在cookie
sessionStorage.setItem("token", "your_token");  // 存储在sessionStorage
localStorage.setItem("token", "your_token");  // 存储在localStorage

// 获取token
var tokenFromCookie = document.cookie.replace(/(?:(?:^|.*;\s*)token\s*\=\s*([^;]*).*$)|^.*$/, "$1");  // 从cookie获取
var tokenFromSessionStorage = sessionStorage.getItem("token");  // 从sessionStorage获取
var tokenFromLocalStorage = localStorage.getItem("token");  // 从localStorage获取

针对存在 cookie 中的 token 如何避免 CSRF 攻击?

1. 使用SameSite属性:在设置cookie时,可以使用SameSite属性来防止CSRF攻击。SameSite属性可以设置为Strict、Lax或None。当设置为Strict时,cookie只会在同源请求中发送。当设置为Lax时,cookie会在同源请求和顶级导航(例如链接点击)中发送。当设置为None时,cookie会在所有请求中发送,但这需要Secure属性同时设置为true。

2. 使用CSRF Token:在每个请求中添加一个随机生成的CSRF Token,然后在服务器端验证这个Token。如果Token不匹配,那么请求将被拒绝。

3. 使用Referer Header:在服务器端检查Referer Header,如果请求不是来自同一源,那么请求将被拒绝。

针对存在 localStorage 中的 token ,如何避免 XSS 攻击?

1. 使用Content Security Policy(CSP):CSP可以限制浏览器只加载和执行来自特定源的脚本,从而防止XSS攻击。

2. 对用户输入进行验证和转义:对所有用户输入进行验证,并对特殊字符进行转义,以防止恶意脚本被执行。

3. 使用HttpOnly属性:虽然HttpOnly属性不能直接应用于localStorage,但你可以将token存储在一个HttpOnly的cookie中,然后在服务器端验证token。这样,即使网站受到XSS攻击,攻击者也无法通过JavaScript访问到cookie。

// 设置带有SameSite属性的cookie
document.cookie = "token=your_token; SameSite=Strict";

// 设置Content Security Policy
// 这需要在服务器端设置HTTP响应头
// Content-Security-Policy: script-src 'self'

// 对用户输入进行转义
var userInput = "<script>malicious code</script>";
var escapedInput = userInput.replace(/</g, "&lt;").replace(/>/g, "&gt;");

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

token 应该存在 Cookie、SessionStorage 还是 LocalStorage 中? 的相关文章

随机推荐

  • 让chatGPT回答一些有趣?无聊的问题

    本来我是没有国外的手机号的 也就没法注册chatGPT并使用 不过好在 csdn 的猿如意 里面有体验功能 我就顺便体验一下 这一次主要是看看chatGPT能否理解我的目的 很可惜 这一次并没有 其实第一次 chatGPT准确的回答出了 自
  • 算法导论 练习 2.2

    2 2 1 答案 n theta n 渐进符号的定义会在第三章里明确给出 所以这里就不写证明了 详细证明见第三章习题 好多好多啊 2 2 2 选择排序 数据结构课程基本排序算法之一 代码 SELECTION SORT A n length
  • 算法研究---MNIST数据集

    MNIST简介 MNIST Mixed National Institute of Standards and Technology database 是一个计算机视觉数据集 它包含70000张手写数字的灰度图片 其中每一张图片包含 28
  • vue3按需导入element-plus后使用ElMessage报错或样式丢失

    在vue项目中已经自动导入element plus 但是直接使用ElMessage时编译会报错 async function userLogin Promise
  • 史上最全《计算机网络 自顶向下方法》答案合集

    史上最全 计算机网络 自顶向下方法 答案合集 封面 英文名 Computer Networking A Top Down Approach 7th Edition 答案 第一章 一 第一章 二 第二章 一 第二章 二 第三章 一 第三章 二
  • .NET Core API框架实战(五) 依赖注入 服务的注册与提供

    ASP NET Core 的底层设计支持和使用依赖注入 ASP NET Core 应用程序可以利用内置的框架服务将它们注入到启动类Startup的方法中 并且应用程序服务ConfigureServices能够配置注入 依赖注入 Depend
  • 【Unity入门计划】利用Cinemachine实现简单的相机跟随&设置相机边界

    目录 使用情景 1 从Packages载入Cinemachine 2 创建2D Camera的Cinemachine 3 设置摄像机跟随玩家角色 4 设置主摄像机边界 5 加上相机跟随和边界的效果 使用情景 Cinemachine是Unit
  • 【20230103】FROM_UNIXTIME和UNIX_TIMESTAMP函数

    首先知道UNIX TIMESTAMP函数的由来 是自 1970 01 01 的道当前时间的秒数差 累似1337276321 一般10位 1 FROM UNIXTIME 函数 FROM UNIXTIME unix timestamp form
  • python 2、python读取.htm文件报错:UnicodeDecodeError: 'utf8' codec can't decode byte 0xb3 in position 0的解决方法

    问题是这样的 我用python写的程序去读取 htm文件中的数据 刚开始我用 fr open 0 htm r 时 程序运行后直接崩溃 后来根据提示的错误信息 ValueError encoding must be one of utf 8
  • 不同文件格式与图像类型

    文件格式 通常有BMP 8 位 24 位 32 位 PNG JPG JPEG GIF PPM PNM 和 TIF 图像类型 单通道图像 每个像素由单个值表示 包括二值 单色 图像 每个像素由一个 0 1 位 和灰度图像 每个像素由 8 位表
  • Kotlin:Android世界的Swift

    转载自 http www infoq com cn news 2015 06 Android JVM JetBrains Kotlin Kotlin 是一门与 Swift 类似的静态类型 JVM 语言 由 JetBrains 设计开发并开源
  • 2019年7月3日星期三 恒指/美原油/美黄金 走势分析

    财经早餐 2019年7月3日重点关注的财经数据与事件 09 45 中国6月财新服务业PMI 15 50 法国6月服务业PMI终值 15 55 德国6月服务业PMI终值 16 00 欧元区6月服务业PMI终值 16 30 英国6月服务业PMI
  • malloc和free,brk和sbrk和mmap和munmap的使用和关系以及内存分配的原理

    目录 一 使用 1 1 malloc和free 2 brk和sbrk 2 1 sbrk 2 2 brk 3 mmap munmap 二 关系 三 内存分配原理 四 malloc底层 一 使用 1 1 malloc和free 参数 申请内存大
  • Android进阶——AIDL详解

    看这篇之前先看看binder Android Binder机制 1 简介 AIDL Android 接口定义语言 可以使用它定义客户端与服务端进程间通信 IPC 的编程接口 在 Android 中 进程之间无法共享内存 用户空间 不同进程之
  • 【第13篇】Bert论文翻译

    文章目录 摘要 1 简介 2 相关工作 2 1 无监督的基于特征的方法 2 2 无监督微调方法 2 3 从监督数据中迁移学习 3 Bert 3 1 预训练BERT 3 2 微调BERT 4 实验 4 1 GLUE 4 2 SQuAD v1
  • 应该选择使用哪个版本的 JDK?

    要构建和运行 Java 应用程序 就需要安装 JDK 环境 OpenJDK 是 Java SE 规范的开源软件 但它只是源代码 二进制发行版由不同的供应商提供 适用于许多受支持的平台 这些发行版在许可证 商业支持 支持的平台和更新频率方面有
  • All in AI,现在开始算不算太晚?

    编者按 目前大模型近乎可以帮助人类处理方方面面的事情 如对话 写文章 写代码等等 在大模型 狂飙 趋势下 想要从事AI领域的小伙伴可能会犹疑 现在进入AI领域会不会已经太晚了 本文作者结合自身转型经历和对AI市场的研判 阐述了进入人工智能领
  • 软件设计能力提升之设计匠艺

    简介 课程将高效率的软件项目质量管理 UML 重构设计与功能实现 单元测试几个课程合而为一 我们称之为设计匠艺 这几个课程当然可以分开来讲 但是如果把他们组织在一起 将会形成一个有效的开发闭环 事实上 在实际的开发过程中 它们本身就是一个整
  • 荣耀play4tpro能升级鸿蒙系统吗,荣耀Play4T Pro的Magic UI系统有哪些优化和升级

    一个好的体验度离不开一个好的系统支持 那咱们的这个荣耀Play4T Pro手机所采用的系统有哪些提升和改变呢 其实这个手机还是搭载了了大家比较熟悉的Magic UI系统 凭借华为方舟编译器先进的技术 系统的应用执行效率提升29 系统操作流畅
  • token 应该存在 Cookie、SessionStorage 还是 LocalStorage 中?

    在Web开发中 token 令牌 可以存储在多个地方 包括cookie sessionStorage和localStorage 每种存储方式都有其优点和缺点 选择哪种方式取决于你的应用需求 1 Cookie 将token存储在cookie中