我们边吃曲奇边聊——Cookie与Session那些事
Cookie與Session分別是什么?
HTTP Cookie(也叫 Web Cookie 或?yàn)g覽器 Cookie)是服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù),它會(huì)在瀏覽器下次向同一服務(wù)器再發(fā)起請(qǐng)求時(shí)被攜帶并發(fā)送到服務(wù)器上。
通常,它用于告知服務(wù)端兩個(gè)請(qǐng)求是否來(lái)自同一瀏覽器,如保持用戶的登錄狀態(tài)。
Cookie 使基于無(wú)狀態(tài)的HTTP協(xié)議記錄穩(wěn)定的狀態(tài)信息成為了可能。
Cookie 主要用于以下三個(gè)方面:
能夠方便一下用戶,這也是Cookie名稱的由來(lái),給用戶的一點(diǎn)甜頭。
Session 代表著服務(wù)器和客戶端一次會(huì)話的過(guò)程。
Session 對(duì)象存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息。
這樣,當(dāng)用戶在應(yīng)用程序的 Web 頁(yè)之間跳轉(zhuǎn)時(shí),存儲(chǔ)在 Session 對(duì)象中的變量將不會(huì)丟失,而是在整個(gè)用戶會(huì)話中一直存在下去。
當(dāng)客戶端關(guān)閉會(huì)話,或者 Session 超時(shí)失效時(shí)會(huì)話結(jié)束。
Cookie與Session的區(qū)別
| 作用范圍 | 保存在客戶端(瀏覽器) | 保存在服務(wù)器端 |
| 存取方式 | 只能保存 ASCII | 可以存任意數(shù)據(jù)類型,一般情況下我們可以在 Session 中保持一些常用變量信息,比如說(shuō) UserId 等 |
| 有效期 | 可設(shè)置為長(zhǎng)時(shí)間保持,比如我們經(jīng)常使用的默認(rèn)登錄功能 | 一般失效時(shí)間較短,客戶端關(guān)閉或者 Session 超時(shí)都會(huì)失效 |
| 隱私策略 | 存儲(chǔ)在客戶端,比較容易遭到不法獲取,早期有人將用戶的登錄名和密碼存儲(chǔ)在 Cookie 中導(dǎo)致信息被竊取 | 存儲(chǔ)在服務(wù)端,安全性相對(duì) Cookie 要好一些 |
| 存儲(chǔ)大小 | 單個(gè) Cookie 保存的數(shù)據(jù)不能超過(guò) 4KB | Session 可存儲(chǔ)數(shù)據(jù)遠(yuǎn)高于 Cookie |
Cookie和Session的關(guān)聯(lián)
為什么需要 Cookie 和 Session,他們有什么關(guān)聯(lián)?
說(shuō)起來(lái)為什么需要 Cookie ,這就需要從瀏覽器開始說(shuō)起,我們都知道瀏覽器是沒有狀態(tài)的(HTTP 協(xié)議無(wú)狀態(tài)),這意味著瀏覽器并不知道是張三還是李四在和服務(wù)端打交道。這個(gè)時(shí)候就需要有一個(gè)機(jī)制來(lái)告訴服務(wù)端,本次操作用戶是否登錄,是哪個(gè)用戶在執(zhí)行的操作,那這套機(jī)制的實(shí)現(xiàn)就需要 Cookie 和 Session 的配合。
那么 Cookie 和 Session 是如何配合的呢?
用戶第一次請(qǐng)求服務(wù)器的時(shí)候,服務(wù)器根據(jù)用戶提交的相關(guān)信息,創(chuàng)建創(chuàng)建對(duì)應(yīng)的 Session ,請(qǐng)求返回時(shí)將此 Session 的唯一標(biāo)識(shí)信息 SessionID 返回給瀏覽器,瀏覽器接收到服務(wù)器返回的 SessionID 信息后,會(huì)將此信息存入到 Cookie 中,同時(shí) Cookie 記錄此 SessionID 屬于哪個(gè)域名。
當(dāng)用戶第二次訪問(wèn)服務(wù)器的時(shí)候,請(qǐng)求會(huì)自動(dòng)判斷此域名下是否存在 Cookie 信息,如果存在自動(dòng)將 Cookie 信息也發(fā)送給服務(wù)端,服務(wù)端會(huì)從 Cookie 中獲取 SessionID,再根據(jù) SessionID 查找對(duì)應(yīng)的 Session 信息,如果沒有找到說(shuō)明用戶沒有登錄或者登錄失效,如果找到 Session 證明用戶已經(jīng)登錄可執(zhí)行后面操作。
根據(jù)以上流程可知,SessionID 是連接 Cookie 和 Session 的一道橋梁,大部分系統(tǒng)也是根據(jù)此原理來(lái)驗(yàn)證用戶登錄狀態(tài)。
Cookie被禁止的解決方案
既然服務(wù)端是根據(jù) Cookie 中的信息判斷用戶是否登錄,那么如果瀏覽器中禁止了 Cookie,如何保障整個(gè)機(jī)制的正常運(yùn)轉(zhuǎn)?有兩種解決方案:
Token 的意思是“令牌”,是服務(wù)端生成的一串字符串,作為客戶端進(jìn)行請(qǐng)求的一個(gè)標(biāo)識(shí)。Token 機(jī)制和 Cookie 和 Session 的使用機(jī)制比較類似。
當(dāng)用戶第一次登錄后,服務(wù)器根據(jù)提交的用戶信息生成一個(gè) Token,響應(yīng)時(shí)將 Token 返回給客戶端,以后客戶端只需帶上這個(gè) Token 前來(lái)請(qǐng)求數(shù)據(jù)即可,無(wú)需再次登錄驗(yàn)證。
分布式Session
在互聯(lián)網(wǎng)公司為了可以支撐更大的流量,后端往往需要多臺(tái)服務(wù)器共同來(lái)支撐前端用戶請(qǐng)求,那如果用戶在 A 服務(wù)器登錄了,第二次請(qǐng)求跑到服務(wù) B 就會(huì)出現(xiàn)登錄失效問(wèn)題。
分布式 Session 一般會(huì)有以下幾種解決方案:
建議采用第三種方案。
參考資料
COOKIE和SESSION有什么區(qū)別?
90%的程序員都沒有完全回答對(duì) Cookie 和 Session 的區(qū)別?
總結(jié)
以上是生活随笔為你收集整理的我们边吃曲奇边聊——Cookie与Session那些事的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Qt开源项目
- 下一篇: PaperNotes(10)-Maxim