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