当前位置: 首页 > news >正文

详解 Cookies 和 WebStorage

Cookies 和 WebStorage

  • Cookies 和 WebStorage
    • Cookies
      • 简要介绍
      • 操作 Cookies(document.cookie)
      • 不足之处
    • WebStorage
      • 简要介绍
      • LocalStorage Vs. SessionStorage
      • 操作 WebStorage
    • 三种数据存储方式的对比分析
      • 共性
      • 差异
    • REFERENCES

Cookies 和 WebStorage

Cookies 和 WebStorage(包括 LocalStorage、SessionStorage)是三种常见的将数据存储在客户端的方式。在任意一个网页中打开开发者工具(F12),我们可以在 Application 选项卡的中看到 LocalStorage、SessionStorage、Cookies ——这些存储于当前域名(Current Domain)下的数据。下边我们对这三种数据存储方式进行介绍,并比较分析他们的共性与区别。

image-20240526134716059

Cookies

简要介绍

Cookies 有一系列别名,如 HTTP Cookies、Internet Cookies、Browser Cookies、Web Cookies,这些名词指向的都是同一个含义。

Cookies 是服务器发送给浏览器少量数据。同时,服务器端存储着该数据以及对应的用户 ID。通过 Cookie 请求头,每次浏览器发送 HTTP 请求时, Cookies 都会被自动发送给服务端

Cookies 是以键值对(key-value)形式存储的数据。我们也可以设置 Cookies 的过期时间(expiry date)和对应路径

操作 Cookies(document.cookie)

我们可以在 JavaScript 中使用document.cookie 创建、读取、删除 Cookies,同时也可以设置 Cookies 的过期时间和对应路径。使用示例如下,

document.cookie = “username=John Doe”; // 创建 Cookiesdocument.cookie = “username=John Doe; expires=Thu, 14 Dec 2034 12:00:00 UTC; // 创建 Cookies 并设置 Cookies 的过期时间。时间到了 Cookies 就会被自动删除。
/* 注意:如果没有指定过期时间(expiration date),Cookies 会在浏览器关闭时自动删除 */document.cookie = "username=John Doe; expires=Thu, 14 Dec 2034 12:00:00 UTC; path=/"; // 创建 Cookie 并设置 Cookies 的过期时间和对应路径。设置对应路径为 /,表示该 Cookie 对应当前域名(current domain)下的根路径(root path)。
/* 强调:我们知道 Cookies 是对应域名存储的,但是 Cookies 也可以对应域名下的路径存储。例如,如果我们创建 Cookies 并设置 path=/admin:当 URL 类型为 /admin 或 /admin/... (.../admin 不行!!!) 时,我们就可以访问到对应 /admin 路径存储的 Cookies;反之,当 URL 类型为 /cart/... 时,我们就无法访问到对应 /admin 路径存储的 Cookies 数据 */
/* 注意:当我们没有设置 Cookies 的对应路径时,Cookies 所属的对应路径为当前页面(即当前 URL 路径) */

关于 Cookies 可访问性的进一步说明

  • 设置了 path
    • 如果将 Cookie 的路径设置为path=/admin
      • 那么该 Cookie 将会在以下路径下可用:/admin/admin/... (例如,/admin/dashboard/admin/settings
      • 然而,它不会在以下路径下可用:/somethingelse/admin/cart/admin
  • 没有设置 path
    • 如果在/example/page 路径上设置了一个没有路径参数的 Cookie,那么这个 Cookie 将会在 /example/page 以及其任何子路径(如 /example/page/subpage)上可用。
    • 但是这个 Cookie 不会在/example/anotherpage或者/different/path路径上可用。

创建 Cookies 时指定的 path 对应的是网页 URL 的请求路径

不足之处

  • 浏览器每次发送 HTTP 请求都会携带 Cookies 数据到服务器,影响网站整体性能

    每次请求携带 Cookie 增加了请求的体积,会导致网络传输变慢、服务器处理请求时间变长等问题

  • 存储上限为 4KB

  • 安全问题

    跨站点脚本攻击(XSS)、跨站点请求伪造(SCRF)、Cookie 劫持、Cookie 欺骗

WebStorage

简要介绍

HTML5 提供了两个新的对象(LocalStorage、SessionStorage)用于网页数据的本地存储,统称为 WebStorage。

WebStorage 也以键值对(key-value)形式存储数据。

WebStorage 相比于 Cookies 有以下特点及优势

  • 存储的数据不会随着 HTTP 请求而重新加载或发送给服务器
  • 存储的数据大小高达 5MB (与浏览器有关),同时不会影响网页的整体性能
  • 存储的数据只能被客户端(client side)访问,因此数据更加安全

LocalStorage Vs. SessionStorage

当我们关闭浏览器后,LocalStorage 中的数据不会消失,但是 SessionStorage 中数据被自动删除

操作 WebStorage

下述五个基本方法既适用于 LocalStorage,也适用于 SessionStorage,从而实现对网页本地存储的数据进行操作。

  1. setItem(‘key’,‘value’); 给 LocalStorage 或 SessionStorage 中添加一个键值对数据

    localStorage.setItem('name', 'John Doe');
    sessionStorage.setItem('color', 'red');
    
  2. getItem(‘key’); 根据 key 查找 LocalStorage 或 SessionStorage 中存储的对应的 value;不存在对应数据则返回 null

    localStorage.getItem('name'); // output: John Due 
    sessionStorage.getItem('color'); // output: red
    sessionStorage.getItem('age'); // output: null
    
  3. removeItem(‘key’); 根据 key 删除 LocalStorage 或 SessionStorage 中存储的对应的键值对

    localStorage.removeItem('name'); 
    localStorage.getItem('name'); // output:nullsessionStorage.removeItem('color');
    sessionStorage.getItem('color'); // output: null
    
  4. key(index); 根据索引 index,返回 LocalStorage 或 SessionStorage 中存储的对应的 key

    localStorage.key(0); // output: "name"
    sessionStorage.key(0); // output: "color"
    
  5. clear(); 删除 LocalStorage 或 SessionStorage 中存储的所有数据

    localStorage.clear();
    sessionStorage.clear();
    

三种数据存储方式的对比分析

共性

Cookies、LocalStorage、SessionStorage 三者都

  • 将数据存储于客户端(client side),客户端可以对这些数据进行读取和修改。
  • 都是键值对(key-value)形式的数据。
  • value 必须是字符串。可以使用 JSON.stringify() 将对象序列化为一个字符串后再存储。

差异

准则CookiesLocalStorageSessionStorage
存储容量4kb5-10 MB5-10 MB
是否会过期×
服务端是否可访问××
数据是否随 HTTP 请求发送××
数据丢失时机过期时定期删除浏览器页签(tab)关闭
数据存储位置客户端 & 服务端客户端客户端

REFERENCES

https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage、

https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage

https://medium.com/segmentify-tech/cookie-vs-local-storage-session-storage-ee4c0a07b74e

https://medium.com/@dimplekumari0228/describe-the-difference-between-a-cookie-sessionstorage-and-localstorage-e731a627acb1

相关文章:

  • 软件测试面试题(四)
  • 【经典论文阅读10】MNS采样——召回双塔模型的最佳拍档
  • ffpmeg windows WSl 编译so
  • 【开源】大学生竞赛管理系统 JAVA+Vue+SpringBoot+MySQL
  • leedcode【142】. 环形链表 II——Java解法
  • K8s的常用命令以及yaml文件的创建
  • ABC354学习笔记
  • 基于Arduino IDE的ESP32开发环境搭建
  • PyQt6--Python桌面开发(33.QToolBar工具栏控件)
  • java “错误:编码GBK 的不可映射字符”
  • 云计算和大数据处理
  • 9.1 Go语言入门(环境篇)
  • 增强版 Kimi:AI 驱动的智能创作平台,实现一站式内容生成(图片、PPT、PDF)!
  • C++中string类的初步介绍
  • Spring Web MVC(2)
  • 【node学习】协程
  • 2017前端实习生面试总结
  • C++类中的特殊成员函数
  • centos安装java运行环境jdk+tomcat
  • IOS评论框不贴底(ios12新bug)
  • JS+CSS实现数字滚动
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PHP那些事儿
  • Redash本地开发环境搭建
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 闭包,sync使用细节
  • 关于for循环的简单归纳
  • 关于使用markdown的方法(引自CSDN教程)
  • 免费小说阅读小程序
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 我的zsh配置, 2019最新方案
  • 线性表及其算法(java实现)
  • 新书推荐|Windows黑客编程技术详解
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • kubernetes资源对象--ingress
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #### golang中【堆】的使用及底层 ####
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (13)DroneCAN 适配器节点(一)
  • (20050108)又读《平凡的世界》
  • (day 12)JavaScript学习笔记(数组3)
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (十六)视图变换 正交投影 透视投影
  • ***检测工具之RKHunter AIDE
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net core 6 redis操作类
  • .net访问oracle数据库性能问题
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • ??myeclipse+tomcat
  • @Autowired标签与 @Resource标签 的区别
  • @EnableConfigurationProperties注解使用