浏览器本地存储cookie、localStorage、session

41 阅读5分钟

推荐文章juejin.cn/post/727594…

Cookies、Local Storage、Session Storage、WebSQL 和 IndexedDB

一、面试补充

采取什么措施来保护cookie的安全性?

  • 设置Cookie 核心安全属性

  • (1)HttpOnly 属性

  • 作用:防止 JavaScript 通过 document.cookie 访问 Cookie,有效缓解 XSS 攻击。

  • (2)secure属性

  • 作用:确保 Cookie 仅通过 HTTPS 加密通道传输,防止明文传输被窃取。

  • (3)samesite属性

  • 作用:控制 Cookie 在跨站请求中的发送行为,防御 CSRF 攻击。

  • 三种模式

    • Strict:完全禁止跨站携带
    • Lax:允许部分安全跨站请求(如导航链接)
    • None:允许跨站携带(必须配合 Secure 属性)
  • (4)Domain 属性:明确指定 Cookie 生效的域名,避免泄露给子域。

  • (5)Path 属性:限制 Cookie 仅在特定路径下有效,减少暴露面。

  • (6)其他方法

  1. 内容安全策略(CSP)
  • 通过限制资源加载来源,间接减少 XSS 风险,保护 Cookie 不被窃取。
  1. 服务端安全实践
  • 签名验证:对 Cookie 内容进行签名,防止篡改
  • 定期轮换:定期更新会话标识,缩短攻击窗口
  • 敏感信息分离:不在 Cookie 中存储敏感数据,仅存储会话 ID
  1. 浏览器安全机制
  • 同源策略:Cookie 默认遵循同源策略,提供基础隔离
  • 第三方 Cookie 限制:现代浏览器逐步限制第三方 Cookie 的访问

localStroage大小,受同源策略限制吗?如果需要存储大的多得多的文件,如何实现

  • 受;
  • 方案:
  • (1)indexdb:
  • 异步操作,不阻塞主线程
  • 容量大(通常为磁盘空间的50%)
  • 支持事务和索引查询
  • (2)Cache API(适用于PWA场景
  • (3)组合策略(实际项目常用)

对于超大文件,我通常采用:

  1. 分片存储:将文件切分为多个chunk
  2. 元数据管理:记录分片信息
  3. 懒加载:按需加载所需分片

从cookie的角度说明如何防止csrf攻击

二、前端存储方式

  • cookies: 在HTML5标准前本地储存的主要方式,优点是兼容性好,请求头自带cookie方便,缺点是大小只有4k,自动请求头加入cookie浪费流量,每个domain限制20个cookie,使用起来麻烦,需要自行封装;
  • localStorage:HTML5加⼊的以键值对(Key-Value)为标准的方式,优点是操作方便,永久性储存(除非手动删除),大小为5M,兼容IE8+ ;
  • sessionStorage:与localStorage基本类似,区别是sessionStorage当页面关闭后会被清理,而且与cookie、localStorage不同,他不能在所有同源窗口中共享,是会话级别的储存方式;
  • Web SQL:2010年被W3C废弃的本地数据库数据存储⽅案,但是主流浏览器(火狐除外)都已经有了相关的实现,web sql类似于SQLite,是真正意义上的关系型数据库,用sql进行操作,当我们用JavaScript时要进行转换,较为繁琐;
  • IndexedDB: 是被正式纳入HTML5标准的数据库储存方案,它是NoSQL数据库,用键值对进行储存,可以进行快速读取操作,非常适合web场景,同时用JavaScript进行操作会非常方便。

三、细说存储方式/区别

1、cookie

  • Cookie一旦创建成功,名称就无法修改
  • 生存时间由 expires 属性指定,并且 cookie 只能被同源的页面访问共享。
  • 每个域名下Cookie的数量不能超过20个,每个Cookie的大小不能超过4kb
  • 有安全问题,如果Cookie被拦截了,那就可获得session的所有信息,即使加密也于事无补,无需知道cookie的意义,只要转发cookie就能达到目的
  • Cookie在请求一个新的页面的时候都会被发送过去,它是一种纯文本文件,每次发起HTTP请求都会携带Cookie。

2、localstorage

  • HTML5新引入的特性
  • 大小一般为5MB
  • 持久储存除非主动清理,不然会永久存在
  • 仅储存在本地,不像Cookie那样每次HTTP请求都会被携带
  • 受到同源策略限制
  • 浏览器设置为隐私模式,那我们将无法读取到LocalStorage
  • 存在浏览器兼容问题,IE8以下版本的浏览器不支持

3、SessionStorage(限制更加严格)

  • HTML5提出(同localstorage)
  • 临时保存同一窗口(或标签页)的数据,刷新页面不会删除,关闭窗口或标签页之后会删除这些数据
  • 本地进行数据存储(同localstorage)
  • SessionStorage也有同源策略的限制,但是SessionStorage有一条更加严格的限制,SessionStorage只有在同一浏览器的同一窗口下才能够共享
  • Local Storage 与 Session Storage 都属于 Web Storage,都不能被爬虫爬取
  • 能够存储 5M 或者更大的数据

4、indexdb

  • IndexedDB 的储存空间比 LocalStorage 大得多,一般来说不少于 250MB,甚至没有上限
  • 键值对储存:IndexedDB 内部采用对象仓库存放数据。所有类型的数据都可以直接存入,包括 JavaScript 对象。
  • 异步:IndexedDB 操作时不会锁死浏览器,用户依然可以进行其他操作,这与 LocalStorage 形成对比,后者的操作是同步的。异步设计是为了防止大量数据的读写,拖慢网页的表现。
  • IndexedDB 受到同源限制,每一个数据库对应创建它的域名。网页只能访问自身域名下的数据库,而不能访问跨域的数据库。
  • 支持二进制储存:IndexedDB 不仅可以储存字符串,还可以储存二进制数据(ArrayBuffer 对象和 Blob 对象)。

其他:token为什么设置到期时间