`HttpOnly`、`Secure` 和 `SameSite` 安全三剑客”

📅 2026/7/29 9:37:27
`HttpOnly`、`Secure` 和 `SameSite`  安全三剑客”
实际的 Web 安全中HttpOnly、Secure和SameSite通常被称为 Cookie 的“安全三剑客”。单独使用HttpOnly只能防 XSS加上Secure可以防网络窃听加上SameSite则可以防 CSRF跨站请求伪造。以下是这三个属性配合使用的各语言后端设置示例1. PHP 示例在 PHP 中推荐使用数组形式的参数来同时设置这三个属性setcookie(sessionid,QmFieWxvbiA1,[expirestime()3600,// 1小时后过期path/,domainexample.com,securetrue,// 仅通过 HTTPS 传输httponlytrue,// 禁止 JS 读取samesiteLax// 允许顶级导航的 GET 请求携带防 CSRF]);2. Node.js (Express) 示例Express 的res.cookie方法原生支持这三个属性的配置res.cookie(sessionid,abc123,{maxAge:3600000,// 毫秒1小时httpOnly:true,secure:true,sameSite:lax// 可选值: strict, lax, none});3. Java (Spring Boot) 示例在 Spring Boot 中推荐使用ResponseCookie构建器或者在application.yml中全局配置方式一代码级别设置ResponseCookiecookieResponseCookie.from(sessionid,abc123).httpOnly(true).secure(true).sameSite(Lax).path(/).maxAge(3600).build();response.addHeader(HttpHeaders.SET_COOKIE,cookie.toString());方式二全局配置推荐# application.ymlserver:servlet:session:cookie:http-only:truesecure:truesame-site:Lax4. C# (.NET Core / .NET 5) 示例在 ASP.NET Core 中可以通过CookieOptions对象进行统一设置varcookieOptionsnewCookieOptions{HttpOnlytrue,Securetrue,SameSiteSameSiteMode.Lax,ExpiresDateTimeOffset.UtcNow.AddHours(1)};Response.Cookies.Append(sessionid,abc123,cookieOptions);5. Python (Flask) 示例Flask 的set_cookie方法同样支持这些参数respmake_response(Cookie已设置)resp.set_cookie(keysessionid,valueabc123,httponlyTrue,secureTrue,samesiteLax,max_age3600)returnresp 核心注意事项关于 SameSite 的选择在使用SameSite时需要根据业务场景选择合适的值**Lax**推荐默认值允许第三方网站通过顶级导航如点击a链接携带 Cookie但会阻止通过表单 POST 或 AJAX 跨站提交。这能在防 CSRF 和保证基本用户体验之间取得良好平衡。**Strict**最安全。只要是从第三方网站发起的请求一律不携带Cookie。缺点是用户从邮件或外部链接点击跳转到你的网站时会被视为未登录状态。**None**允许所有跨站请求携带 Cookie。注意如果设置为None则必须同时设置Securetrue否则现代浏览器会直接拒绝该 Cookie。⚠️ 本地开发避坑指南Securetrue要求必须是 HTTPS 协议。在本地开发环境通常是http://localhost中部分浏览器如 Chrome对 localhost 做了白名单豁免但有些浏览器可能会拦截。如果在本地测试发现 Cookie 没种上可以临时将secure设为false或者使用环境变量区分环境secure:process.env.NODE_ENVproduction