javascript cookie如何操作_怎样安全地存储用户状态【教程】

发布时间 - 2026-02-01 00:00:00    点击率:
document.cookie 是分号分隔的字符串而非键值对象,读写需手动解析与拼接;存敏感信息如 token 易受 XSS 攻击,应优先用 HttpOnly + Secure Cookie 配合 Authorization 请求头;前端状态推荐 localStorage 或 sessionStorage。

JavaScript 中 document.cookie 的基本读写逻辑

原生操作 Cookie 并不复杂,但容易误以为它是类似 localStorage 的键值对对象——实际上它是一段用分号分隔的字符串,每次读取都得手动解析,写入也得拼接完整格式。

写入示例:
document.cookie = "token=abc123; path=/; expires=Wed, 01 Jan 2025 00:00:00 GMT; Secure; HttpOnly";
注意:这里 HttpOnly 是服务端设置的,JS 无法通过 document.cookie 写入该标志;Secure 表示仅在 HTTPS 下发送,JS 可以声明,但无效(浏览器忽略)。

  • 必须显式指定 path,否则默认为当前路径,导致跨路由读不到
  • expiresmax-age 缺失时,Cookie 变成会话级(关闭浏览器即失效)
  • 中文或特殊字符需先 encodeURIComponent(),否则可能截断或报错

为什么不能用 document.cookie 存 token 或敏感状态

因为 document.cookie 暴露在 JS 环境中,XSS 攻击可直接窃取。哪怕加了 HttpOnly,那 JS 就根本读不到——这恰恰说明:如果 JS 需要读写,它就一定不是 HttpOnly。

  • 前端存 token 做自动鉴权?优先走 Authorization: Bearer xxx 请求头,token 由后端下发并设为 HttpOnly + Secure
  • 若必须前端维护状态(如语言偏好、主题),用 localStorage 更合适,且无需担心过期逻辑
  • 需要服务端参与的状态(如登录态),Cookie 仅作传输载体,真实校验和续期全由后端控制

封装一个安全可用的 Cookie 工具函数

避免每次手动拼字符串出错,建议封装最小可用函数,只处理编码、路径、过期时间等基础项,不尝试模拟对象 API。

function setCookie(name, value, options = {}) {
  let cookieStr = `${name}=${encodeURIComponent(value)}`;
  if (options.expires) cookieStr += `; expires=${options.expires.toUTCString()}`;
  if (options.maxAge) cookieStr += `; max-age=${options.maxAge}`;
  if (options.path) cookieStr += `; path=${options.path}`;
  if (options.domain) cookieStr += `; domain=${options.domain}`;
  if (options.secure) cookieStr += '; secure';
  document.cookie = cookieStr;
}

function getCookie(name) {
  const match = document.cookie.match(new RegExp(`(^| )${name}=([^;]+)`));
  return match ? decodeURICompone

nt(match[2]) : null; }
  • 不支持 SameSite 自动注入,需手动传 options.sameSite = 'Strict' 并拼进字符串
  • 删除 Cookie:调用 setCookie('name', '', { expires: new Date(0) })
  • 不要试图用正则匹配多个同名 Cookie,浏览器只返回第一个匹配项

现代替代方案比 Cookie 更适合前端状态管理

除非明确需要服务端读取或依赖浏览器自动携带(如传统表单提交),否则大多数用户状态不需要 Cookie。

  • 纯前端状态(如折叠菜单、暗色模式):用 localStorage + useEffect(React)或事件监听同步
  • 需要服务端感知但又不想暴露敏感字段:用短时效 sessionStorage 存非敏感标识,后端用该标识查 session
  • SSR/SEO 场景下需首屏读取状态:服务端渲染时注入到 window.__INITIAL_STATE__,前端优先读它

真正难的不是怎么写 Cookie,而是判断「这个状态到底该不该放 Cookie 里」——多数时候答案是否定的。


# react  # javascript  # java  # js  # 前端  # cookie  # seo  # 编码  # 浏览器  # 工具  # session  # 后端  # xss  # 封装  # date 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  油猴 教程,油猴搜脚本为什么会网页无法显示?  如何快速配置高效服务器建站软件?  jQuery中的100个技巧汇总  香港服务器网站推广:SEO优化与外贸独立站搭建策略  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何用y主机助手快速搭建网站?  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  如何自定义建站之星模板颜色并下载新样式?  图册素材网站设计制作软件,图册的导出方式有几种?  如何有效防御Web建站篡改攻击?  网站制作壁纸教程视频,电脑壁纸网站?  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  微信h5制作网站有哪些,免费微信H5页面制作工具?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  java获取注册ip实例  Laravel怎么实现验证码(Captcha)功能  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  如何在建站之星绑定自定义域名?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何用AWS免费套餐快速搭建高效网站?  西安专业网站制作公司有哪些,陕西省建行官方网站?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  如何快速查询网站的真实建站时间?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  敲碗10年!Mac系列传将迎来「触控与联网」双革新  EditPlus中的正则表达式 实战(1)  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Java类加载基本过程详细介绍  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何选择可靠的免备案建站服务器?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  Laravel storage目录权限问题_Laravel文件写入权限设置  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Android仿QQ列表左滑删除操作  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  如何用VPS主机快速搭建个人网站?  Laravel如何实现本地化和多语言支持?(i18n教程)  Laravel如何实现API资源集合?(Resource Collection教程)  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Swift中swift中的switch 语句