前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库Cookie HttpOnly Secure SameSite 属性作用
浏览浏览器存储与离线数据

Cookie 的 HttpOnly、Secure 和 SameSite 属性各自解决什么问题?

HttpOnly 阻止脚本读取 Cookie 以缓解 XSS 窃取,Secure 保证只在加密连接传输,SameSite 控制跨站请求是否携带 Cookie 以缓解 CSRF。

前端进阶之旅 · 一题精讲更新于 2026.09.05
浏览器#存储与离线数据#离线应用#安全#HTTP
先看核心答案读代码示例
理解线索

三个属性对应三类攻击路径

  1. HttpOnly禁 JS 访问,缓解 XSS 偷 Cookie
  2. Secure仅 HTTPS 传输,防中间人嗅探
  3. SameSite限跨站发送,缓解 CSRF 与追踪

三者互不替代:只配 HttpOnly 仍可能被跨站表单发起 CSRF。

核心回答

先记住这个答案

HttpOnly 阻止 JavaScript 通过 document.cookie 访问 Cookie,使 XSS 注入的脚本偷不走会话凭证。Secure 让 Cookie 只在 HTTPS 加密请求中发送,防止明文 HTTP 链路上的中间人窃听。SameSite 规定 Cookie 是否随跨站请求发送:Strict 完全禁止跨站携带,Lax 只允许顶级导航的 GET 请求携带,None 允许跨站但必须配合 Secure,主要缓解 CSRF 和第三方追踪。三者分工不同,防御的是攻击链上不同环节。

  • HttpOnly 防脚本窃取会话
  • Secure 防明文链路上的窃听
  • SameSite 控制跨站携带防 CSRF

三个属性分别切断的攻击链路

攻击者拿到会话 Cookie 通常有三条路:注入脚本读取、在明文链路上嗅探、诱导浏览器自动携带发起伪造请求。HttpOnly 切断第一条:设置后脚本无法通过 document.cookie 读取或修改该 Cookie,因此 XSS 攻击者即使执行任意脚本也拿不到凭证。它缓解的是凭证泄露,并不阻止 XSS 本身,攻击者仍可在受害页内直接发同源请求。

Secure 切断第二条:浏览器只在加密请求中发送该 Cookie,http:// 页面(除 localhost 等特例外)不会携带,中间人无法在明文流量里截获会话。注意 Secure 不是加密 Cookie 内容,磁盘上的值仍是明文,拿到本地文件或配合脚本仍可读取。SameSite 切断第三条:它按请求的发起站点决定是否附带 Cookie,跨站表单提交或第三方图片请求在 Lax 和 Strict 下不携带会话,伪造请求因此失效。

判断跨站请求是否携带 Cookie 的规则模拟JavaScript
function shouldSend(cookie, requestIsSameSite, method, isTopNav) {
  if (cookie.secure === false && cookie.sameSite === 'None') return 'rejected';
  if (requestIsSameSite) return 'send';
  if (cookie.sameSite === 'Strict') return 'withhold';
  if (cookie.sameSite === 'Lax') {
    return (method === 'GET' && isTopNav) ? 'send' : 'withhold';
  }
  return 'send';
}
const lax = { secure: true, sameSite: 'Lax' };
const strict = { secure: true, sameSite: 'Strict' };
const none = { secure: true, sameSite: 'None' };
console.log(shouldSend(lax, true, 'POST', false));
console.log(shouldSend(lax, false, 'POST', false));
console.log(shouldSend(lax, false, 'GET', true));
console.log(shouldSend(strict, false, 'GET', true));
console.log(shouldSend(none, false, 'POST', false));
console.log(shouldSend({ secure: false, sameSite: 'None' }, false, 'POST', false));
查看输出与解释
send
withhold
send
withhold
send
rejected

纯函数模拟浏览器对 SameSite 三个取值的核心判定逻辑,不依赖 DOM 或网络,可直接运行验证输出。

电商登录态 Cookie 的实际配置决策

某电商站会话 Cookie 名为 sid,登录后用 HTTPS 下发,前端既有页面内 AJAX 读自己的接口,也支持从邮件营销页跳回购物车。决策是:sid 必须 HttpOnly,因为前端没有任何需要读它的逻辑;必须 Secure,因为全站已强制 HTTPS;SameSite 选 Lax 而非 Strict,因为邮件链接跳回属于跨站顶级导航 GET,Lax 下仍携带 Cookie,用户落地即处于登录态。

Strict 曾被考虑但否决:用户从邮件或搜索结果点进来时浏览器不携带 sid,会显示未登录,购物车页强制跳登录,转化率受损。None 也不需要,因为没有第三方 iframe 嵌入本站的需求。假设进行渗透测试,预期注入的脚本读不到 sid,跨站 POST 表单伪造下单请求时浏览器不携带 Cookie,服务端收到匿名请求直接拒绝。三者叠加才同时堵住窃取与伪造两条路径。

属性在什么条件下会失效

HttpOnly 的常见失效场景是服务端同时提供 document.cookie 可读的副本:有人把用户 ID 另存一个非 HttpOnly 的 Cookie 供前端展示,攻击者改偷那个或利用 XSS 直接代发请求。它还挡不住攻击者在受害页内以受害者身份发同源请求,所以 XSS 修复仍是根本。Secure 的边界是:只要站点任一子域或旧入口仍走 HTTP,浏览器可能在加密前泄露其他未加 Secure 的 Cookie,且本地磁盘读取不受它保护。

SameSite 的失效边界更隐蔽:Lax 允许跨站顶级导航 GET 携带 Cookie,若站点把改状态操作放在 GET 接口上,CSRF 依然成立;判断依据是所有变更接口必须走 POST 并校验。另一个边界是新旧浏览器差异,未写 SameSite 的旧客户端可能按 None 处理,跨站仍携带。对应处理是显式声明 SameSite 并在服务端用 CSRF Token 做第二道防线,代价是每次表单渲染要注入并校验 Token。

回答前,多想一步

容易答错的地方

以为配了 HttpOnly 就免疫 XSS
HttpOnly 只让脚本读不到 Cookie,XSS 攻击者仍可在受害页面内向同源接口直接发请求,请求会自动携带 Cookie。它缓解凭证外泄,不能替代输出编码等 XSS 根治手段。
以为 Secure 会加密 Cookie 内容
Secure 只是限定浏览器只在 HTTPS 请求中发送该 Cookie,磁盘存储和服务端收到的值都是明文。要保护内容机密性需在服务端加密或使用不透明会话标识符。
试着用自己的话回答

面试官还会怎么问?

SameSite 不设值时浏览器怎么处理?

现代浏览器默认按 Lax 处理,即跨站子资源请求(如图片、脚本、表单提交)不携带,跨站顶级导航 GET 携带。但旧浏览器可能按 None 处理,安全敏感站点应显式声明,避免依赖默认行为差异。

为什么 SameSite=None 必须配合 Secure?

None 表示允许第三方站点请求携带 Cookie,若不限制在加密通道传输,跨站发送的凭证会在明文链路上暴露。浏览器直接拒绝 SameSite=None 且未加 Secure 的 Cookie。

会话 Cookie 三个属性的推荐组合是什么?

通常是 HttpOnly + Secure + SameSite=Lax,服务端用不透明随机会话 ID。若需第三方嵌入则用 SameSite=None; Secure,并配合服务端 CSRF Token 作为纵深防御。

从一道题,走向一组知识

把知识连起来

存储与离线数据

IndexedDB 事务的原子性如何保证?

同属「存储与离线数据」专题,接着看 IndexedDB 事务原子性保证 在具体场景中的处理方式。

存储与离线数据

sessionStorage 的数据生命周期与标签页或刷新有什么关系?

同属「存储与离线数据」专题,接着看 sessionStorage 生命周期与标签页刷新 在具体场景中的处理方式。

存储与离线数据

为什么 storage 事件不会在当前页面触发?

同属「存储与离线数据」专题,接着看 storage 事件为什么不在当前页面触发 在具体场景中的处理方式。

参考资料

  • Using HTTP cookies

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 三个属性分别切断的攻击链路
  3. 电商登录态 Cookie 的实际配置决策
  4. 属性在什么条件下会失效
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑