cookie是什么?网站怎么记住你登录着的,我抓了个包,这枚小票最长能躺一年

上个月去发小家帮他调路由器,顺手在他电脑上登了一次网盘下载固件。这礼拜他又喊我过去,浏览器一打开,网盘还是登着的状态,文件列表就在那儿摆着。我密码没让他存,退出也没点,它凭什么认出我?回来我把这事拆开了看,答案就一小串文本,学名叫 cookie。今天这篇把它讲明白,顺带把「清缓存会不会把密码清掉」这个老问题一起结了。
先说清楚:cookie就是网站塞给你的一张寄存牌
得先从 HTTP 这门「语言」的天生缺陷说起。我之前抓包讲过 http 和 https 的区别,里面提过一句:http 是没有记忆的。你这次请求网页,服务器伺候完就忘了你是谁,下一秒你再刷新,在它眼里又是张三李四全新面孔。这叫无状态。
可网盘、邮箱、博客后台这些地方,偏偏需要「记住你」。工程师的解法特别土:你第一次来,服务器发响应的时候顺手塞给你一张小票,票上写着「编号 27315」。你的浏览器把票收进一个小本本里存着。下次再访问这个网站,浏览器翻出票来,自动夹在请求里递过去。服务器一对票号:哦,27315,老熟人,进来吧。
就这么个来回。所谓 cookie,就是这张由网站发放、浏览器代为保管的小票。你感觉「网站记住我了」,其实是浏览器在替你递票。换台电脑、换个浏览器,小本本是空的,没票可递,网站自然装不认识你——这就是为什么家里电脑登着,手机上还得再登一遍,两边的小本本各管各的。
我抓了个包,这枚小票长这样
光说比喻不过瘾,我拿 curl 抓了个真的。访问百度的首页,服务器响应里有一行:
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
逐段拆。BDORZ 是票的名字,27315 是票的编号,这俩用等号连着,是票面正文。domain=.baidu.com 说这票只在百度家的域名好使,别的网站不认,浏览器也不会把百度的票递给淘宝。path=/ 是管辖区间,斜杠代表整站通用。最有意思的是 max-age=86400——这是有效期,单位秒,86400 除以 24 除以 3600,正好一天。
为了验证「下次自动带上」,我把第一次访问收到的票存进文件,紧接着第二次访问原地址,抓请求头,果然多了一行 Cookie: BDORZ=27315。我没做任何操作,浏览器(这里是我替它干的 curl)自己把票递上去了。整套流程跟商场寄存包一模一样:存包给牌,取包交牌,牌在手里,包就是你的。
关浏览器就作废的、能躺一年的,是两种票
同样是 cookie,寿命分两档。我又抓了个对照——访问 github,它发下来的票里有一枚叫 _gh_sess 的,后面跟着 path=/; HttpOnly; Secure; SameSite=Lax,唯独没有 expires 也没有 max-age。没有到期时间的票,浏览器把它记成「会话 cookie」,窗口一关,票随会话一起作废。这类票装的多半是临时登录态,所以有的网站你关下浏览器再开,就得重新登录,不是它坏,是票本来就设计成一次性的。
另一档是带明确到期日的持久 cookie。github 同时还发了枚 _octo 的票,抓包当天是 2026 年 10 月,它的 expires 写的是 Mon, 04 Oct 2027,整一年。这种票落盘存着,浏览器关了重开、电脑重启都还在,到日子才自己销毁。网站登录框旁边那个「记住我」勾选框,勾不勾的区别往往就是发你的票带不带到期日:勾了发持久票,不勾发会话票。
最好玩的是 github 那堆票里有枚名字就叫 logged_in 的,值是 no。也就是说「你觉得你登没登录」这件事,在它家就是一枚 cookie 上一个字的事,登录成功服务器把它改发成 yes,浏览器存一年。下次你访问,浏览器把这枚 yes 递上去,页面右上角就给你显示头像。所谓登录状态,本质就这么朴素。
清缓存、退出登录各动哪层?三层东西别搅在一起
这是被问得最多的一件事,也是最容易答错的一件。先把三层东西摆桌上,它们住在浏览器里不同的抽屉:
| 东西 | 存的什么 | 清了会怎样 |
| cookie | 各网站的登录小票 | 全部网站退出登录,要重登 |
| 浏览器密码库 | 你勾了保存的账号密码 | 自动填充没了,密码本身没丢(你记得的话) |
| 网页缓存 | 图片、脚本这些文件 | 网站变慢一两个回合,我讲缓存那篇细说过 |
所以答案分两半:浏览器里点「清除浏览数据」,弹出的勾选框里 cookie、密码、缓存是三个独立的勾。你只勾缓存,密码和登录态都安好;勾了 cookie,登录态全没但密码库还在,下次重登时账号密码还能自动填上——前提是你当初存过。我写改管理密码那篇提过浏览器旧填充的事,说的就是密码库这个抽屉,它跟 cookie 是两码事。
顺带说一句,Windows 系统自己还有第四个抽屉叫凭据管理器,存的是局域网共享、映射盘这类系统级账号。我表弟连他家 NAS 时报「系统错误 1219」,病根就在那儿,跟浏览器的 cookie 更不挨着,详见NAS 连不上那篇的凭据缓存排查。
分层理清了,「退出登录」也就好懂了。点那个按钮,后台其实干了两件事:一是服务器把自己那边的登记簿上你的票号作废,二是让浏览器把手里的票撕掉。两边一起清,才算干净退出。
但很多人在共用电脑上是直接关网页了事的。这就出问题了:票还在浏览器里躺着呢,尤其持久 cookie,下次打开还是登着的。我在发小电脑上那个网盘就是这么个状况。更麻烦的是,就算你只清浏览器这头的 cookie,服务器那边的登记簿没动——票号还在册,只是你手里没票了。听起来无所谓,反过来想就懂了:万一这枚票在别处被人复制走(比如中间人抄件、或者电脑上有恶意脚本翻过你的小本本),持票人就是合法的你。
所以共用电脑的铁律是走正规的「退出登录」按钮,别只关网页;自己的电脑借给别人用之前,也先把登录态退干净。我写过路由器被黑的排查,里面提醒过中招后改密码,其实还差半句:改完密码顺手把浏览器 cookie 也清一遍,让旧票全数作废,才算把门关严。
HttpOnly 和 SameSite,票背面那两行小字是保命的
回头再看 github 那枚 _gh_sess 票上的三个后缀,每个都有讲究。
HttpOnly 的意思是这张票只许 http 层来回传,网页里的 JavaScript 碰不得。为什么重要?因为有种攻击叫 XSS,原理是往你浏览的网页里塞段坏脚本,脚本一跑就去翻浏览器的小本本,把你的登录票抄走寄给攻击者。票上印了 HttpOnly,脚本翻不到,这招就废了大半。百度那枚 BDORZ 没这个后缀,因为它是统计类的票,丢了无所谓;登录态的票普遍都会印上。
Secure 是「这票只走加密通道」。带这个后缀的票,http 明文通道一律不递,只认 https。想想也对,http 是明文裸奔的,登录票要是从这条道走,等于把家门钥匙举在手里走夜路。
SameSite=Lax 管的是另一档子事:别的网站能不能替你递票。正常流程是「你自己在百度页面上操作,浏览器把百度的票递给百度」;但网页里嵌的图片、链接也可能触发向第三方网站发请求,攻击者做个钓鱼页诱导你的浏览器带着你在某站的票去干坏事,这叫 CSRF。SameSite 就是限制「只有从本站页面发起的请求才许夹带票」,钓鱼页想借你的票,门没有。这三个词平时不用你动手,是网站开发时配好的,但看懂了再遇到安全新闻,起码知道它在说什么。
收尾:一张表说清谁来管什么
| 你想干嘛 | 该动哪层 | 怎么动 |
| 网站还登着但我不想要了 | cookie | 站内点退出登录,最干净 |
| 网页显示旧内容 | 缓存 | Ctrl+F5 强刷,不行再清缓存 |
| 换电脑/换浏览器要重登 | 正常现象 | 小本本不跨设备,重新登就是 |
| 密码忘了自动填不上 | 密码库 | 查浏览器保存的密码或走找回 |
| 怀疑账号被人动过 | 全套 | 改密码+清cookie,双管齐下 |
到头来 cookie 就是个工具,网站靠它认人,你靠它少输几回密码。它背的那些骂名——广告追踪、隐私泄露——多是拿它干的事出了格,票本身没原罪。你在浏览器设置里能看到每枚票的名字和到期日,有空翻一眼自己常用的那几个站,看看谁家票一签就是一年、谁家关浏览器就作废,挺有意思。至于我发小电脑上那个网盘,我点完退出登录才走的,顺便把他浏览器的保存密码也关了——那又是密码库抽屉的另一笔账了。

发表评论