Cookie单个值最大4KB,超限静默截断;单域名最多20个,超限覆盖最老的;Secure/HttpOnly/SameSite/Path配置不当会导致Cookie失效;大容量状态应使用服务端Session而非Cookie。

Cookie单个值最大4KB,超出会静默截断
浏览器对单个Cookie的值(value)强制限制为约4096字节,超出部分会被直接丢弃,且不报错、不提示。这不是Echo或Go的限制,而是所有主流浏览器(Chrome/Firefox/Safari/Edge)共同遵守的HTTP规范行为。你调用c.SetCookie()传入一个5KB的字符串,最终写入浏览器的只有前4KB,后续数据消失——前端读不到,后端也收不回。
常见错误是把JWT Token、用户权限列表、长加密串直接塞进单个Cookie,结果随机出现“登录态失效”“权限丢失”;更隐蔽的是,某些浏览器(如旧版Safari)实际阈值更低(≈3KB),导致跨浏览器行为不一致。
- 用
len(cookie.Value)在写入前主动检查,超4096就拒绝或拆分 - 避免在Cookie里存结构化数据(如JSON数组),优先用服务端Session存储主体内容,Cookie只存短token ID
- 若必须存大值,手动分片:生成
mydata_1、mydata_2等键,客户端拼接还原(但受总Cookie数限制,见下条)
单域名最多20个Cookie,总数超限会覆盖最老的
同一域名下,浏览器最多允许存储20个Cookie(RFC 6265建议值,Chrome/Firefox实际执行严格)。第21个写入时,最早设置的那个会被自动删除。这和大小限制一样不报错,极易引发“偶发性登录掉线”——比如你同时写了user_id、auth_token、theme、lang、tracking_id等,再加几个第三方SDK埋点Cookie,很容易触顶。
注意:domain属性会影响计数范围。设为.example.com时,sub.example.com和www.example.com共享这20个名额;若各子域独立设domain=www.example.com和domain=api.example.com,则各自有20个配额。
- 用
c.Cookies()在调试时打印当前全部Cookie,确认数量是否逼近20 - 合并用途相近的Cookie,例如把
user_role和user_tier合成一个user_profileJSON字符串(但注意4KB上限) - 禁用非必要第三方脚本的Cookie写入,尤其广告/分析SDK
Secure、HttpOnly、SameSite不是容量参数,但影响存活率
这些属性不改变大小或数量限制,但决定Cookie能否被正确发送。比如Secure要求HTTPS传输,HTTP环境下Set-Cookie头会被浏览器忽略,看似“写入成功”,实则根本没存;SameSite=Lax在跨站POST请求中不携带Cookie,导致接口返回401;HttpOnly虽防XSS,但也让前端JS无法读取——若你依赖document.cookie做状态判断,就会误判“Cookie不存在”。
最容易被忽略的是Path配置。默认Path=/,但如果API部署在/api/v1而Cookie设了Path=/api,那么根路径的页面请求就不会带上它,前端拿不到,后端也收不到。
- 用浏览器开发者工具Application → Cookies面板,逐项核对
Name、Value、Domain、Path、Expires/Max-Age是否符合预期 - 测试环境务必用真实HTTPS+域名,别依赖
localhost——它的Secure行为和生产不同 - 不要在同一个域名下混用
SameSite=Strict和Lax,浏览器按最严策略处理
真正需要大容量状态,该用Session而不是Cookie
当业务明确需要存>4KB或>20项的状态(如用户偏好配置、临时表单草稿、多步骤向导进度),硬撑Cookie只会不断踩坑。Echo本身不内置Session,但通过echo-contrib/session可接入文件、Redis、PostgreSQL等后端。此时Cookie只存一个加密的session_id(通常
关键点在于:Session ID的Cookie仍受4KB/20个限制,但它的值极小;而服务端存储无此约束。别把Session当成“更大的Cookie”——它是完全不同的机制,设计初衷就是解决Cookie的物理瓶颈。
- 初始化Session中间件时,确保
sessionKey长度≥32字节,否则AES加密会panic - Session过期时间(
MaxAge)和Cookie的MaxAge必须一致,否则用户可能看到“已登录”但服务端Session已销毁 - 文件系统存储(
FilesystemStore)仅适合开发,生产务必用Redis等分布式存储
实际部署时,Cookie的4KB和20个限制是硬边界,没有绕过方法——所谓“规避”,本质是承认边界、换用合适工具。一旦开始拼接、分片、压缩Cookie,就说明该切到Session了。











