那会儿总认定浏览器开两个窗口是为了撇脱,后来才发现那是个庞大的技术坑。
实际上啊,这玩意儿就是浏览器为了省内存,跟服务器之间搞的“双重圣杯”游戏。它想让你认定网页跑得飞快,实际上服务器那边儿正愁着空间不够呢。 咱们先说说那个圆圆的、像马卡龙一样软乎乎的 MathJax,它叫 Cookie。
这东西玩意儿,最早就是想帮浏览器省内存的。
你想想,要是每次用户刷新网页,服务器都得重新发一堆数据:用户是哪位?上次买啥了?密码记住了没?这些务必得存啊。但真存得密不透风,那用户登录了就得登几十遍,这多折磨人啊。便,Cookie 火冒三丈,它直接自己干这事儿了。它把用户的一些身份信息,像个小信子一样,通过域名的“邮戳”传回给服务器。
这就好比你在餐厅点单,服务员记住你爱喝哪种汤,下次你再来就能直接给你倒,不用重新点一遍了。 Cookie 有个名字里带英文的名字,叫 HttpOnly,那个只读,权限极小,它绝对不能拿来做密码。密码这东西,务必得加密,还得用超级了得的加密算法,并且不能随意让别人碰。HTTP 协议本身是不准传输密码的,故此密码得用 JS 里的加密库来处理,放到 Cookie 里就像把金条藏进保险箱,哪位也别想偷出来。 至于 Session,那名字就带 Session 了,全称自然是 Session ID。
这东西是个跟服务器强绑定的“数字身份证”。你登录了,服务器给你发一个 ID,你存到浏览器里。下次你打开页面,服务器一看,嘿,这 ID 在,你进去了。但这里有个致命的弱点:它忒依赖本地了。
要是把你的浏览器关了又开,要么换了个设备,服务器就得重新给你发 ID,不然你就进不去。并且,要是服务器挂了,要么网络断了,服务器还得等你这 ID 再回来,这就耽误事儿。 那为啥目前大家都不直接存密码了,非要用登录框那套流程呢?这就得提一下 JWT,Token。JWT 是个有点偏门的家伙,它像是一个盖章的文件,用公钥验签名,用私钥签名。你登录的时候,服务器给你一张签了字的纸条。你拿到这张纸条赶明儿,赶明儿该如何用?你得自己拿身份证(私钥)把它拆开来,看看这玩意儿是不是确实被签出来了。并且,JWT 有个挺牛的地方:它不赞成跨帧要么跨域名。你就得用这个 ID 去刷新页面。
这就好比你在排队买票,你拿着二维码进去,系统直接给你开门,不用像那会儿那样给个物理身份证。 不过 JWT 也有自己的难处,那就是它忒好办被伪造了。黑客能够随意找个公钥,伪造一个看起来合法的签名,然后让你当作要登录,结局实际上是骗子。
故此,JWT 务必结合其他手段,比如 HTTPS 加密传输,要么结合一些保险协议,才能让那串字符变成真正的通行证。 说到 Session ID 的命门,那就是它的唯一性。
这玩意儿要是跟错设备了,后果就严重了。
比如你在 A 电脑登录了,登录页面显示的 ID 是 123456。你拿着这 ID 去 B 电脑登录,系统显示 ID 在,但给你登不上去,只能让你重新填账号密码。用户肯定挺来气吧?这 ID 要是跟服务器绑死,一旦绑错了,服务器就废了。
故此,Session ID 务必随用户设备变动而变动。 Cookie 和 Session 的区别实际上挺明显的。Cookie 是“轻量级”的,它有自己的生命周期,比如这玩意儿在浏览器里塌方了,可能几个月后还能用。它不会随你开合浏览器而消亡,要不就你手动把它删掉。并且它的读写速度相对慢点,出于要经过一个复杂的解析过程。 Session 是“重型武器”,它的特征是速度快,读写直接,但生命周期挺短。它务必紧紧跟随着你的浏览器,一旦你关闭浏览器,它就再也不能用了。
故此,Session 一般是用来做临时状态管理的,比如刚登录完,要么用户在做一些操作的时候。而 Cookie 更适合存那些不需求频繁更新、相对稳定性的数据,比如头像、浏览历史,要么像刚刚说的、存密码这种绝对不能被篡改的信息。 从实际场景来看,目前的网站都在尝试平衡这两者。有些用户认定登录忒费事,干脆把密码直接放进 Cookie 里,这样打开网页就能直接登录。但这样一来,HTTPS 的加密功能就大打折扣了,黑客能够轻易偷看里面的内容,这简直是自找费事。
故此,还是得老老实实登录,别看步骤多,但起码保险。 再举个例子,假设有个电商网站。当用户第一次登录,服务器生成一个 Session ID,发给用户。用户在浏览器里存了它。
后来用户去购物,系统需求记录订单信息。
这时候,系统会先用这个 Session ID,通过 API 请求把状态存下来。等用户下次刷新,系统直接读取内存里的状态,不用再次发起请求。
这就是 Session 发挥功能的瞬间,它让服务器侧的状态管理变得瞬间流畅,用户也就感觉不到多费了一步操作。 反过来,要是用户在浏览器里打开了一个新的标签页,比如看个视频。
这时候,Cookie 里的浏览历史、缓存数据就能保证这些不丢;但 Session ID 就得重新生成要么传进去,出于那个标签页可能和主页面不是同一个设备。 总的来说,Cookie 和 Session 就像是一对双胞胎,一个负责记“小秘密”,一个负责记“临时状态”。Cookie 稳当,能存得更久,但有点笨重;Session 反应快,能处理大量请求,但寿命短暂且依赖本地。现代网页开发里,它们时常混用,有时 Cookie 存身份,Session 存操作记录;有时 Session 存登录状态,Cookie 存其他信息。 最终说句大实话,这两玩意儿别看好用,但也不是万能的。Cookie 忒好办被篡改,Session 又忒依赖本地。未来的趋势是,它们正在变得越来越智能。未来的浏览器可能会在保存密码时,既用 Cookie 存,又用加密的本地存,就连结合生物识别来验证。
这就像是给这两样东西穿上了更先进的防弹衣。
总而言之,不管技术如何变,核心逻辑就一句话:你得让服务器知道你是哪位,与此同时尽量别让服务器认定你在“偷懒”,对吧? 有时候,我们会嘟囔登录忒繁琐,认定想上网就得多走几遍流程。但换个角度想,要是服务器那边能记住你的偏好和状态,那多出来的那一层操作,说不定就值得。
毕竟,技术有时候就是为了让人类生活更便捷,而不是让人类在登录框里打转。希望赶明儿能设计出更人性化、更少摩擦的登录体验,让每一次上网都能像进食一样自然流畅。