Skip to content

cookie、localStorage、sessionStorage

  • Expires 和 Max-Age:Cookie的过期时间

  • Domain:Cookie的作用域,默认是当前域名

  • Path:只有特定目录下的页面才可以读取Cookie

  • Secure:设置Secure属性,确保Cookie仅在HTTPS连接中传输

  • HttpOnly:标记为HttpOnly的Cookie不能被JavaScript访问,减少XSS攻击风险

  • SameSite:防止CSRF攻击,取值: Strict、Lax、None。

    SameSite有三个属性:

    • ‌Strict‌:当网址与请求域名完全一致时,Cookie才会被发送;
    • ‌Lax‌:在跨站点的情况下,只有对GET请求才会发送Cookie,而对于POST请求等非安全的HTTP方法则不会发送;
    • ‌None‌:无论是跨站点还是同站点,Cookie都会被发送。当设置SameSite=None时,必须同时设置Secure属性,以确保Cookie只能通过HTTPS发送。

存储方式区别

存储大小

  • Cookie:单个 Cookie 的大小限制在 4KB 左右;
  • LocalStorage:存储容量为 5MB 左右;
  • SessionStorage:一般也是 5MB 左右;

数据有效期

  • Cookie:如果设置了过期时间,Cookie 会在指定时间后自动删除;如果没有设置过期时间,关闭浏览器就会被清空;

  • LocalStorage:数据会一直存储在浏览器中,除非手动清除;

  • SessionStorage:数据仅在当前会话期间有效,如果用户关闭当前标签页,SessionStorage 中的数据会被清除;

    通过 window.open 新建标签页后可以在新建会话时复制上一个会话,之后两个 sessionStorage 相互独立。

数据传输

  • Cookie:网址和接口域名同源时,异步请求头里会自动携带 Cookie;服务器也可以修改 Cookie 并将其返回给客户端;

    跨域请求时,异步请求(axios)需要设置 withCredentials: true

  • LocalStorage:数据仅存储在客户端,不会随 HTTP 请求发送到服务器;

  • SessionStorage:数据只存储在客户端,不会在请求中传输;

访问权限

  • Cookie:可以通过 JavaScript 的 document.cookie 属性进行读写操作;

JS设置Cookie:

const cookieExpirationHours = 7 * 24 // 7天后过期
const expiresIn = new Date(Date.now() + cookieExpirationHours * 60 * 60 * 1000)
document.cookie = "username=cookieName; expires=" + expiresIn + "; path=/; Secure; HttpOnly; SameSite=Strict"

alt text

  • LocalStorage:通过 JavaScript 的 localStorage 对象访问,不同域名下的 LocalStorage 是相互隔离的;
  • SessionStorage:通过 JavaScript 的 sessionStorage 对象访问,同样遵循同源策略;

应用场景

  • Cookie:常用于存储用户的登录信息、用户偏好设置等;
  • LocalStorage:适合存储一些不经常变化的数据,由于其数据持久性,用户下次访问页面时可以快速恢复之前的状态;
  • SessionStorage:适用于临时保存同一窗口(或标签页)的数据,在关闭窗口(或标签页)后数据不需要保留的场景;