0

0

JavaScript中如何操作Cookie_Cookie安全性你注意了吗

狼影

狼影

发布时间:2026-01-01 19:21:10

|

765人浏览过

|

来源于php中文网

原创

document.cookie 受同源策略和 Cookie 属性双重限制:无法跨域读取、HttpOnly Cookie 不可被 JS 读取;Secure Cookie 在 HTTP 页面中设置会被丢弃;SameSite 影响跨站发送;写入不支持删除或修改属性,读取需手动解析。

javascript中如何操作cookie_cookie安全性你注意了吗

直接读写 document.cookie 有啥限制?

浏览器document.cookie 的读写是受同源策略和 Cookie 属性双重约束的。你不能跨域读取其他站点的 Cookie,也不能通过 JS 读取设置了 HttpOnly 标志的 Cookie —— 这类 Cookie 只能由服务端在响应头中设置、由浏览器自动携带,JS 调用 document.cookie 时完全看不见它。

写入时也受限:如果当前页面协议是 http://,却尝试设置 Secure 属性,该 Cookie 会被浏览器静默丢弃;同样,SameSite=StrictSameSite=Lax 在某些跨站请求场景下会阻止发送。

  • document.cookie = "a=1" 只会新增或覆盖同名 Cookie,无法删除或修改已有属性(如过期时间、路径)
  • 读取 document.cookie 返回的是字符串,格式为 "a=1; b=2; c=3",需手动解析,没有内置 API 解析
  • 所有写入操作都必须拼接完整属性字符串,漏掉 Path=/ 可能导致后续读不到(默认路径是当前路径,不是根路径)

如何安全地封装一个 Cookie 操作函数?

原生操作太脆弱,建议封装最小可用的 setCookiegetCookie,重点处理编码、路径、作用域和安全属性:

function setCookie(name, value, options = {}) {
  const { expires, path = '/', domain, secure, sameSite = 'Lax', httpOnly } = options;
  let cookieStr = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
  if (expires instanceof Date) cookieStr += `; Expires=${expires.toUTCString()}`;
  if (path) cookieStr += `; Path=${path}`;
  if (domain) cookieStr += `; Domain=${domain}`;
  if (secure) cookieStr += '; Secure';
  if (sameSite) cookieStr += `; SameSite=${sameSite}`;
  // 注意:httpOnly 是响应头字段,JS 无法设置,这里仅作提醒,不参与拼接
  document.cookie = cookieStr;
}
<p>function getCookie(name) {
const cookies = document.cookie.split('; ').reduce((acc, pair) => {
const [k, v] = pair.split('=');
acc[decodeURIComponent(k)] = decodeURIComponent(v);
return acc;
}, {});
return cookies[name];
}

关键点:

立即学习Java免费学习笔记(深入)”;

  • 始终对 namevalueencodeURIComponent,否则含空格、分号、等号会破坏格式
  • Path=/ 必须显式指定,否则默认是当前 URL 路径(比如 /admin/user),导致首页读不到
  • SameSite=Lax 是当前推荐值,能兼顾 CSRF 防护与大部分正常跳转场景;Strict 过于严格,用户从外部链接进站时可能丢失登录态

SecureHttpOnly 到底谁管什么?

这两个属性常被混淆,但职责完全不同:

Programming Helper
Programming Helper

AI代码自动生成器,在AI的帮助下更快地编程

下载
  • Secure:只允许 Cookie 通过 HTTPS 协议传输。JS 写入时若当前是 HTTP 页面,加了 Secure 会被忽略;服务端 Set-Cookie 响应头中加了,则浏览器只在 HTTPS 请求中带上它
  • HttpOnly:纯服务端控制字段,JS 完全无法访问。它防的是 XSS 后的 Cookie 窃取,比如攻击者注入 <script>alert(document.cookie)</script>,有 HttpOnly 的 Cookie 就不会出现在 document.cookie 字符串里
  • 二者可共存:Set-Cookie: sessionid=abc123; HttpOnly; Secure; SameSite=Lax

注意:前端 JS 设置 Cookie 时,HttpOnly 字段会被浏览器直接忽略——它只能由服务端在响应头中声明。

为什么你设的 Cookie 明明写了 Expires 却还是会话级?

常见错误是把时间戳当日期对象传给 Expires

  • ❌ 错误:expires: Date.now() + 24 * 60 * 60 * 1000(这是毫秒数,不是 Date 对象)
  • ✅ 正确:expires: new Date(Date.now() + 24 * 60 * 60 * 1000)
  • 更稳妥写法是用 Max-Age(单位秒),它比 Expires 更可靠,不受客户端时间偏差影响,但 JS 无法通过 document.cookie 设置 Max-Age,只能靠服务端响应头

另一个坑:Chrome 94+ 对第三方 Cookie 加强限制,默认开启 SameSite=Lax,如果你的 Cookie 是嵌在 iframe 或跨站表单提交中使用的,很可能根本发不出去——这时得确认是否真需要跨站共享,否则优先改用后端透传或 Storage API 配合 postMessage。

真正容易被忽略的,是开发环境混用 localhost127.0.0.1:它们被视为不同域名,带 Domain 属性的 Cookie 在其中一个下设了,在另一个下就读不到。调试时统一用 localhost,别来回切。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

1058

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

838

2023.11.06

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6500

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

368

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

446

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号