yii框架cookie配置需严格设置expire、httponly、domain和secure:expire须为unix时间戳,httponly建议始终为true,跨子域共享需domain='.example.com'且https下secure必须为true,参数不匹配将导致读取或删除失败。

Yii 框架的 Cookie 不是“设了就完事”,关键在生命周期、域范围和安全标记这三处,配错直接导致前端读不到、HTTPS 下被拦截、跨子域失效。
设置 Cookie 时必须显式指定 expire 和 httpOnly
Yii 默认用 yii\web\Cookie 类,但不设 expire 就是会话级 Cookie——关浏览器就丢,不是持久化;不设 httpOnly 则 JavaScript 可读,有 XSS 风险。
-
expire必须是 Unix 时间戳(如time() + 86400表示 24 小时后过期),设成字符串或相对时间(如'+1 day')会被忽略 -
httpOnly建议始终设为true,除非你明确需要 JS 读取(比如埋点统计) - 不设
domain时,Cookie 默认绑定当前完整域名(含子域),example.com和www.example.com视为不同域
跨子域共享 Cookie 要手动配 domain 和 secure
想让 user.example.com 和 api.example.com 共享登录态,光靠默认行为不行,domain 必须以点开头,且 secure 在 HTTPS 环境下必须为 true,否则浏览器拒绝写入。
- 正确写法:
domain => '.example.com'(注意开头的点) - HTTP 环境下设
secure => true,Cookie 直接被浏览器丢弃,不报错也不提示 - 开发时用
localhost测试跨域?不行——domain不支持localhost,得换成本机 IP 或 hosts 绑定真实域名
读取和删除 Cookie 必须用同一套参数规则
写入时用了 domain => '.example.com',读取或删除时也得带完全一致的 domain,否则 Yii::$app->response->cookies->remove() 找不到对应项。
- 删除不是清空值,而是发一个
Max-Age=0的响应头,所以参数必须和写入时严格匹配 - 用
get()读不到?先检查是否被httpOnly拦住(JS 无法读),再确认域名、路径(path默认是'/',改过就得同步) - 调试建议:用浏览器 DevTools 的 Application → Cookies 查看实际存入的 domain/path/secure 状态,比代码更准
敏感数据别往 Cookie 存,哪怕加了 httpOnly
Yii 的 Cookie 类默认不加密,明文存在客户端。就算设了 httpOnly 和 secure,攻击者仍可通过中间人或本地物理访问拿到原始值。
- 登录凭证、用户 ID、权限标识等,必须用 session(服务端存储)或 JWT(签名校验+短时效)
- 真要存轻量状态(如主题偏好、语言),可用
yii\web\Cookie的sameSite属性防 CSRF,推荐设为'Lax'(Yii 2.0.38+ 支持) - 自己加 AES 加密?别折腾——没意义,客户端密钥必然暴露,反而误导安全感
最常被忽略的是:Cookie 的 domain 和 secure 是浏览器强制校验的硬规则,不是 Yii 框架能绕过的。配错不会报错,只会静默失败。











