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