絡(luò)加餐】《HTTP 會(huì)話保持:Cookie 與 Session 原理及實(shí)驗(yàn)驗(yàn)證》---詳解)
一.HTTP 會(huì)話保持1.CookieHTTP 的特征如下簡(jiǎn)單快捷無(wú)連接無(wú)狀態(tài)HTTP 本身是無(wú)狀態(tài)協(xié)議協(xié)議層面不會(huì)保存客戶端的歷史訪問(wèn)信息每一次 HTTP 請(qǐng)求都是獨(dú)立的服務(wù)器收到單次請(qǐng)求時(shí)默認(rèn)不知道這個(gè)請(qǐng)求來(lái)自哪個(gè)用戶、之前有沒(méi)有登錄、瀏覽過(guò)哪些頁(yè)面請(qǐng)求和請(qǐng)求之間互相隔離、沒(méi)有上下文關(guān)聯(lián)。但我們?nèi)粘I暇W(wǎng)卻有 “記住登錄” 的體驗(yàn)典型場(chǎng)景就是登錄 CSDN 之后關(guān)掉網(wǎng)頁(yè)、甚至重啟電腦下次重新打開(kāi) CSDN 依舊保持登錄狀態(tài)不用重復(fù)輸入賬號(hào)密碼。這個(gè)能力并不是 HTTP 原生自帶的而是依靠Cookie來(lái)彌補(bǔ)無(wú)狀態(tài)的缺陷。Cookie 是服務(wù)器下發(fā)給瀏覽器、保存在本地的一小段文本數(shù)據(jù)。流程簡(jiǎn)單來(lái)說(shuō)你第一次登錄 CSDN校驗(yàn)賬號(hào)密碼成功后服務(wù)器通過(guò)響應(yīng)頭Set-Cookie把攜帶身份標(biāo)識(shí)的 Cookie 發(fā)給瀏覽器瀏覽器收到后按域名保存這份 Cookie可以設(shè)置過(guò)期時(shí)間有的是會(huì)話 Cookie關(guān)閉瀏覽器就失效有的是持久 Cookie會(huì)存到硬盤(pán)重啟電腦還在之后你每次訪問(wèn) CSDN 對(duì)應(yīng)的域名瀏覽器都會(huì)自動(dòng)在請(qǐng)求頭里帶上屬于這個(gè)網(wǎng)站的 Cookie一起發(fā)給服務(wù)器服務(wù)器讀取 Cookie 里面的身份憑證識(shí)別出你就是之前登錄過(guò)的用戶直接放行不用再次登錄。我們看到的這些 cookie 數(shù)據(jù)實(shí)際都是對(duì)應(yīng)的服務(wù)器方寫(xiě)的如果你將對(duì)應(yīng)的某些cookie 刪除那么此時(shí)可能就需要你重新進(jìn)行登錄認(rèn)證了因?yàn)槟銊h除的可能正好就是你登錄時(shí)所設(shè)置的 cookie 信息。得出結(jié)論會(huì)話保持不是 HTTP 協(xié)議天然具備的特點(diǎn)而是瀏覽器為了滿足用戶的使用需求做了相應(yīng)的工作。那它到底是怎么實(shí)現(xiàn)的呢用戶首次提交賬號(hào)密碼完成登錄校驗(yàn)后并不是瀏覽器直接保存用戶名和密碼。服務(wù)器驗(yàn)證信息無(wú)誤后會(huì)下發(fā) Cookie 給瀏覽器保存。之后用戶再次訪問(wèn)該網(wǎng)站、發(fā)起 HTTP 請(qǐng)求時(shí)瀏覽器會(huì)自動(dòng)把屬于這個(gè)站點(diǎn)的 Cookie 放到請(qǐng)求頭里一同發(fā)送給服務(wù)器。服務(wù)器通過(guò) Cookie 里的身份標(biāo)識(shí)識(shí)別用戶所以在有效期內(nèi)不需要重復(fù)輸入賬號(hào)密碼登錄。用來(lái)維持這種狀態(tài)的技術(shù)就是 Cookie。Cookie 分為兩類(lèi)會(huì)話 Cookie內(nèi)存 Cookie和持久 Cookie文件 Cookie。(1)引入 HTTP Cookiea.定義HTTP Cookie也叫 Web Cookie、瀏覽器 Cookie常直接簡(jiǎn)稱(chēng) Cookie是服務(wù)器下發(fā)到用戶瀏覽器、并保存在瀏覽器本地的一小段數(shù)據(jù)。后續(xù)瀏覽器向同一個(gè)服務(wù)器發(fā)起請(qǐng)求時(shí)會(huì)自動(dòng)攜帶這份 Cookie 發(fā)送給服務(wù)端。 它的核心作用讓服務(wù)端識(shí)別多次請(qǐng)求是否來(lái)自同一個(gè)瀏覽器典型場(chǎng)景就是維持用戶登錄狀態(tài)、保存用戶個(gè)性化偏好等。b.工作原理用戶首次訪問(wèn)網(wǎng)站服務(wù)器在 HTTP 響應(yīng)頭中添加Set-Cookie字段把 Cookie 下發(fā)給瀏覽器瀏覽器收到 Cookie按照域名分類(lèi)保存在本地后續(xù)訪問(wèn)同源網(wǎng)站發(fā)起請(qǐng)求時(shí)瀏覽器自動(dòng)在 HTTP 請(qǐng)求頭帶上對(duì)應(yīng)的 Cookie發(fā)給服務(wù)器。c.用途用戶認(rèn)證與會(huì)話管理最重要用途用戶行為跟蹤統(tǒng)計(jì)緩存用戶頁(yè)面偏好、主題設(shè)置等Chrome 瀏覽器快速查看 Cookie 地址chrome://settings/cookiese.HTTP 頭部Set-CookieSet-Cookie是響應(yīng)頭由服務(wù)器返回給瀏覽器瀏覽器識(shí)別后保存 Cookie。 基礎(chǔ)語(yǔ)法Set-Cookie: namevaluenameCookie 名稱(chēng)valueCookie 存儲(chǔ)的值完整示例Set-Cookie: usernamepeter; expiresThu, 18 Dec 2024 12:00:00 UTC; path/; domain.example.com; secure; HttpOnlyf.時(shí)間格式規(guī)范時(shí)間格式必須遵守RFC 1123標(biāo)準(zhǔn)具體格式樣例 Tue, 01 Jan 2030 12:34:56 GMT或者UTC(推薦) 。關(guān)于時(shí)間解釋Tue: 星期?星期?的縮寫(xiě),: 逗號(hào)分隔符01: ?期兩位數(shù)表?Jan: ???份的縮寫(xiě)2030: 年份四位數(shù)12:34:56: 時(shí)間?時(shí)、分鐘、秒GMT: 格林威治標(biāo)準(zhǔn)時(shí)間時(shí)區(qū)縮寫(xiě)GMT 和 UTC 小科普了解GMT格林威治標(biāo)準(zhǔn)時(shí)間基于地球自轉(zhuǎn)現(xiàn)在已經(jīng)不再作為官方標(biāo)準(zhǔn)時(shí)間UTC協(xié)調(diào)世界時(shí)基于原子鐘計(jì)時(shí)精度極高是網(wǎng)絡(luò)、計(jì)算機(jī)系統(tǒng)通用的標(biāo)準(zhǔn)時(shí)間。 絕大多數(shù)場(chǎng)景下二者數(shù)值幾乎一致可以互換高精度場(chǎng)景優(yōu)先使用 UTC。g.Set-Cookie 可選屬性說(shuō)明表格屬性說(shuō)明expiresdate設(shè)置 Cookie 過(guò)期時(shí)刻不配置則默認(rèn)是會(huì)話 Cookie關(guān)瀏覽器失效path路徑限制 Cookie 發(fā)送的路徑范圍默認(rèn)是當(dāng)前設(shè)置 Cookie 的路徑path/代表全站生效domain域名指定可以接收該 Cookie 的域名帶前綴.代表包含所有子域名secure只有 HTTPS 請(qǐng)求才會(huì)攜帶這個(gè) Cookie防止在 HTTP 明文傳輸時(shí)被劫持HttpOnly禁止前端 JS 腳本讀取該 Cookie用來(lái)防御 XSS 跨站腳本攻擊h.書(shū)寫(xiě)注意事項(xiàng)多個(gè)屬性之間用;分號(hào) 空格隔開(kāi)Cookie 的名稱(chēng)和值使用連接如果 name /value 包含空格、分號(hào)、逗號(hào)這類(lèi)特殊字符必須做 URL 編碼。i.Cookie 生命周期配置expires到達(dá)指定時(shí)間后 Cookie 自動(dòng)過(guò)期失效未配置expires屬于會(huì)話 Cookie瀏覽器進(jìn)程關(guān)閉就銷(xiāo)毀。2內(nèi)存級(jí) Cookie 和文件級(jí) CookieCookie 是瀏覽器用來(lái)存儲(chǔ)站點(diǎn)相關(guān)數(shù)據(jù)的載體分為內(nèi)存級(jí) Cookie會(huì)話 Cookie和文件級(jí) Cookie持久 Cookie。內(nèi)存級(jí) Cookie保存在瀏覽器內(nèi)存里不會(huì)寫(xiě)入磁盤(pán)。一旦關(guān)閉瀏覽器進(jìn)程這份 Cookie 就會(huì)直接銷(xiāo)毀。下次再打開(kāi)網(wǎng)站訪問(wèn)就需要重新登錄。文件級(jí) Cookie以文件形式保存在本地磁盤(pán)中帶有指定過(guò)期時(shí)間。就算關(guān)閉瀏覽器、重啟電腦只要 Cookie 還沒(méi)到期訪問(wèn)網(wǎng)站時(shí)依舊有效可以保持登錄狀態(tài)。3Cookie 安全問(wèn)題如果本地存儲(chǔ)的 Cookie 被攻擊者竊取不法分子就可以攜帶這份 Cookie冒充我們的身份訪問(wèn)對(duì)應(yīng)網(wǎng)站這就是Cookie 劫持Cookie 被盜取。為降低風(fēng)險(xiǎn)我們可以把用戶的核心登錄信息存放在服務(wù)端也就是Session。服務(wù)端會(huì)為每一個(gè)登錄用戶生成獨(dú)立的 Session 數(shù)據(jù)并分配唯一標(biāo)識(shí)Session ID。服務(wù)器只把這個(gè) Session ID 返回給瀏覽器瀏覽器再把 Session ID 存進(jìn) Cookie 中。后續(xù)每次請(qǐng)求瀏覽器自動(dòng)帶上 Cookie 里的 Session ID服務(wù)器拿到 Session ID去服務(wù)端查找對(duì)應(yīng)的 Session 數(shù)據(jù)完成身份鑒權(quán)。這種方式下用戶真實(shí)信息不會(huì)放在 Cookie 里避免敏感信息隨 Cookie 泄露。安全防護(hù)還可以依靠服務(wù)端策略比如檢測(cè)到異地登錄時(shí)服務(wù)端主動(dòng)讓這個(gè) Session ID 失效。失效之后就算攻擊者拿到 Session ID 也無(wú)法使用網(wǎng)站會(huì)要求重新驗(yàn)證賬號(hào)密碼、短信或者人臉以此確認(rèn)操作者是本人提升安全性。(4) 實(shí)驗(yàn)測(cè)試cookieCookie 負(fù)責(zé)在客戶端存儲(chǔ)、傳遞 Session IDSession 負(fù)責(zé)在服務(wù)端存放真實(shí)的用戶會(huì)話數(shù)據(jù)二者配合就實(shí)現(xiàn)了 HTTP 無(wú)狀態(tài)環(huán)境下的登錄保持能力。2.Session(1)引入 HTTP Session承接上文 Cookie為后續(xù)登錄驗(yàn)證流程做鋪墊定義HTTP Session 是服務(wù)端用于跟蹤用戶、保存用戶交互狀態(tài)的機(jī)制。HTTP 本身是無(wú)狀態(tài)協(xié)議每一次請(qǐng)求相互獨(dú)立服務(wù)端無(wú)法自動(dòng)識(shí)別請(qǐng)求歸屬哪個(gè)用戶所以依靠 Session 在服務(wù)端側(cè)記錄用戶會(huì)話信息。工作原理用戶首次登錄訪問(wèn)站點(diǎn)服務(wù)端為該用戶生成全局唯一的Session ID服務(wù)端把 Session ID 通過(guò)Set-Cookie響應(yīng)頭下發(fā)給瀏覽器由瀏覽器保存在本地 Cookie 中用戶后續(xù)發(fā)起請(qǐng)求時(shí)瀏覽器自動(dòng)攜帶 Cookie 里的 Session ID服務(wù)端拿到 Session ID查詢(xún)對(duì)應(yīng)的會(huì)話數(shù)據(jù)完成用戶身份識(shí)別Session 的實(shí)際數(shù)據(jù)一般存放在服務(wù)端內(nèi)存、Redis 緩存或者數(shù)據(jù)庫(kù)中。安全性Session ID 會(huì)在客戶端和服務(wù)端之間傳輸因此同樣存在被竊取劫持的風(fēng)險(xiǎn)。 和直接把用戶信息放進(jìn) Cookie 相比有明顯優(yōu)勢(shì)就算 Cookie 被盜攻擊者拿到的僅僅是 Session ID用戶的敏感信息本身保存在服務(wù)端不會(huì)直接泄露。 同時(shí)服務(wù)端擁有更強(qiáng)的管控能力例如檢測(cè)到異地登錄時(shí)可以主動(dòng)銷(xiāo)毀對(duì)應(yīng) Session ID使舊會(huì)話直接失效。 配套防護(hù)手段使用 HTTPS 加密傳輸同時(shí)給存放 SessionID 的 Cookie 設(shè)置HttpOnly、Secure屬性降低被竊取的概率。超時(shí)與失效可以配置 Session 超時(shí)時(shí)間長(zhǎng)時(shí)間無(wú)操作Session 自動(dòng)過(guò)期失效支持服務(wù)端主動(dòng)銷(xiāo)毀 Session典型場(chǎng)景就是用戶點(diǎn)擊登出操作。用途用戶身份認(rèn)證與會(huì)話管理核心用途臨時(shí)業(yè)務(wù)數(shù)據(jù)存儲(chǔ)例如購(gòu)物車(chē)、臨時(shí)表單數(shù)據(jù)分布式場(chǎng)景會(huì)話共享把 Session 數(shù)據(jù)放到公共緩存 / 數(shù)據(jù)庫(kù)多臺(tái)服務(wù)器可以共用同一份會(huì)話信息(2實(shí)驗(yàn)測(cè)試cookie1.訪問(wèn)/login, 模擬登錄2.兩個(gè)瀏覽器訪問(wèn)任意的站點(diǎn)資源3.總結(jié)HTTP Cookie和Session都是?于在Web應(yīng)?中跟蹤??狀態(tài)的機(jī)制。Cookie是存儲(chǔ)在客戶端的而Session是存儲(chǔ)在服務(wù)器端的。它們各有優(yōu)缺點(diǎn)通常在實(shí)際應(yīng)?中會(huì)結(jié)合使?以達(dá)到最佳的用戶體驗(yàn)和安全性。