PHP+Apache2环境HTTP请求中Secure Cookie被哪一组件丢弃?
结论
丢弃Cookie的主体是请求工具Insomnia,问题根源是你开启了Session Cookie的Secure标记。
原因说明
cookie_secure => true是PHP Session的安全配置项,开启后PHP向客户端返回Session Cookie时,会自动给该Cookie附加Secure属性。
根据HTTP Cookie标准,所有合规的HTTP客户端(浏览器、API调试工具等),仅会在HTTPS加密请求中主动携带带Secure标记的Cookie,明文HTTP请求场景下,客户端不会上传这类Cookie,从源头就不会把对应Cookie发给服务端。
你的场景流程拆解
- 第一次向
http://localhost:8000/test.php发GET请求时,Apache、PHP处理逻辑完全正常:PHP生成新Session、写入$_SESSION['token']值,通过响应头返回带Secure标记的Session Cookie,你在Insomnia中能看到首次响应拿到了Cookie,这一步没有异常。 - 第二次发送请求时,你使用的仍然是明文HTTP协议地址,Insomnia按照Cookie规范判定当前请求不符合
SecureCookie的携带条件,不会把之前存的Session Cookie加到请求头里,PHP侧收不到Session ID,自然会判定为全新的空会话,读不到之前存储的token值。
整个过程中Apache只负责转发请求/响应内容,PHP只会按照收到的请求头处理Session,二者都没有丢弃Cookie的行为。
修复方案
- 本地开发如果没有配置HTTPS证书:把
session_start()的配置改成session_start(['cookie_secure' => false]),HTTP请求下就能正常传递Session Cookie。 - 本地如果配置了HTTPS环境:把请求地址改成
https://开头的对应本地地址,第二次请求就能正常携带Cookie、读到之前存的token。 - 生产环境建议保持
cookie_secure => true开启,要求全站必须走HTTPS,避免Session Cookie在明文传输中被窃取。
内容的提问来源于stack exchange,提问作者ikhvjs
相关产品推荐
相关产品推荐

