《52講輕鬆搞定網路爬蟲》讀書筆記 - Session和Cookie

小菠蘿測試筆記發表於2020-09-03

為什麼要用Session和Cookie?

簡單一句話,因為Session和Cookie可以記錄使用者狀態資訊

嘶..這到底啥意思呢?

 

背景一:動態網頁的出現

什麼是靜態網頁

  • 含義:一個網頁的內容是HTML程式碼編寫的,文字、圖片等內容均可通過HTML程式碼指定了
  • 優勢:載入速度快,編寫簡單
  • 劣勢:可維護性差,擴充套件性差,不能根據URL顯示不同的內容;例如:在URL傳入一個name引數想在網頁上顯示,靜態網頁是無法做到的
  • 總結:弊大於利

 

動態網頁的誕生

動態網頁可以動態解析URL中引數的變化,關聯資料庫並動態呈現不同的頁面內容,非常靈活多變

現在遇到的大多數網站都是動態網站,不再是一個簡單的HTML頁面,可能由JSP、PHP、Python等語言編寫的,功能比靜態網頁強大和豐富太多

場景:一個需要登入的動態網站,在登入後需要保持登入狀態,以便後續訪問網站其他網頁;那麼我們要通過什麼來儲存這個登入態呢?

 

背景二:HTTP是無狀態協議

HTTP無狀態是指?

HTTP協議對事務處理是沒有記憶能力,也就是說伺服器不知道客戶端是什麼狀態

這是什麼意思呢?

當我們向伺服器傳送請求後,伺服器解析處理請求,然後返回響應,伺服器負責完成這個過程(也是一個事務),而這個過程是獨立的,伺服器不會記錄前後狀態的變化,也就是缺少狀態記錄

無狀態導致的後果?

意味著後續發出的請求需要處理前面請求的響應,則必須重傳,這也導致需要額外傳遞一些前面的重複請求,才能獲取後續響應。但為了保持前後狀態,我們也不能將前面的請求全部重傳一次,這太浪費資源了;就好像如果一個網站每次發出一個請求前都要先發出一次登入請求,這無疑大大增加了資源浪費程度

 

Seesion和Cookie的誕生

上圖可以看出,Session和Cookie在一個網站中各自發揮的作用

 

實際場景

  1. 當我們登入之後,服務端就會建立一個屬於當前使用者的Session,裡面儲存的就是當前使用者的資訊;
  2. 然後瀏覽器會根據伺服器的響應頭中Set-Cookie欄位生成相關Cookie,相當於一個使用者憑證
  3. 只需要在下次請求時攜帶這些Cookie,伺服器就能通過Cookie來判斷使用者是否是登入狀態,然後返回對應的響應

 

生動形象理解Cookie和Session的關係

  1. Session是儲存在伺服器端,Cookie是儲存在客戶端
  2. 每次使用者訪問網站的時候,相當於去串門
  3. 使用者帶著cookie去伺服器家,噹噹噹敲門
  4. 伺服器問是誰啊
  5. 使用者:是我(cookie)啊
  6. 伺服器:讓我來確認一下(session確認)
  7. 伺服器確認完畢後,放使用者進門

 

實際網站登入請求的響應頭

  1. 這是一個網站登入之後返回的響應頭,可以看到伺服器要求瀏覽器設定的Cookies有好幾個;這就是Cookies的來源,而token一般會作為使用者的唯一憑證【登入成功,響應頭set-cookies,瀏覽器設定Cookies】
  2. 當瀏覽器下一次再請求該網站時,瀏覽器會把這些Cookies放到請求頭一起提交到伺服器;而Cookies攜帶了SessionID資訊(token)【再次請求,帶上cookies,包含SessionID】
  3. 伺服器通過SessionID即可找到對應的使用者Session資訊,然後判斷該使用者的登入狀態【伺服器根據SessionID獲取使用者登入態】
  4. 如果Session中某些設定登入狀態的變數是有效期內的,證明使用者處於登入狀態【Session有效,使用者已登入】
  5. 此時伺服器就會返回需要登入之後才可以檢視的網頁內容,瀏覽器再進行解析便可以看到了【返回請求響應內容】
  6. 當Cookie無效或者Session已過期後,我們再訪問網站就需要重新登入了【Cookie無效,Session過期,要再次登入】

 

Session和Cookie在登入功能上的協同關係

 

Session

會話,指有始有終的一系列動作/訊息;比如:打電話時,從拿起電話,撥號,通話,結束通話電話這一系列過程可以稱為一個Session

 

實際場景

  • 在Web中,Session物件用來儲存特定使用者Session所需的屬性和配置資訊,這樣使用者在應用程式的Web頁之間跳轉時,儲存在Session物件中的變數將不會丟失,而是在整個使用者Session中存在下去
  • 當使用者請求網頁時,該使用者還沒有Session,則Web伺服器將自動建立一個Session物件
  • 當Session過期或被放棄後,伺服器將終止該Session

 

Cookie

 某些網站為了辨別使用者身份,進行Session跟蹤而儲存在使用者本地終端上的資料

 

會話Cookie和持久Cookie

會話Cookie

可以將開啟瀏覽器-關閉瀏覽器理解成一個會話,會話Cookie的有效期僅在瀏覽器開啟期間;而會話Cookie是存在瀏覽器記憶體裡的

實際場景:涉及錢,涉及利益、機密內容的網站一般都是會話Cookie,如企業郵箱等

 

持久Cookie

持久Cookie是存在客戶端本地硬碟中,不受瀏覽器關閉影響,下次再次訪問該網站時還能繼續使用,用於長久保持使用者登入狀態

實際場景:可以勾選【自動登入】、【30天內自動登入】的網站用的就是持久Cookie

 

持久Cookie發出請求時,客戶端與伺服器之間的時序圖

 

瀏覽器中看Cookie

  • Name:Cookie 的名稱。Cookie 一旦建立,名稱便不可更改
  • Value:Cookie 的值。如果值為 Unicode 字元,需要為字元編碼。如果值為二進位制資料,則需要使用 BASE64 編碼。
  • Domain:Cookie注入的域名,如.baidu.com下的Cookie,只要Host以.baidu.com結尾的域名都能訪問該Cookie
  • Path:允許使用該Cookie的路徑,一般都為 / 
  • Expires/Max-Age:Cookie失效時間,若沒有指定失效時間則預設當瀏覽器關閉時Cookie失效
  • Size:Cookie大小
  • HttpOnly:若True,則不允許指令碼來訪問該Cookie(如:JS)
  • Secure:Cookie是否僅被使用安全協議傳輸,預設為False

 

敲重點的知識點

“只要關閉瀏覽器,Session 就消失了” —— 錯!

實際場景:去健身房辦理的會員卡,除非你自己要求銷卡,不然店家不會隨意銷掉你的卡

所以,對於Session也是一樣的,登入的時候伺服器幫你生成了一個Session,是不會輕易刪除你的Session,除非你自己提出要刪除orSession有效期過了;而一般我們會通過【退出】來刪除觸發伺服器刪除Session

 

當我們關閉瀏覽器時,瀏覽器是不會通知伺服器說它要關閉,所以伺服器根本不知道瀏覽器已關閉,造成這樣的誤解全都是因為:

  1. 一般情況下,網站都會用Cookie來儲存SessionID資訊的
  2. 當你的Cookie是會話Cookie時,關閉瀏覽器Cookie就會消失
  3. 再次開啟網站也找不回之前的那個Cookie對應的SessionID
  4. 所以無法通過原來的SessionID在伺服器查詢對應使用者的登入狀態,只能重新登入生成新的Cookie來記錄新的SessionID

 

如何解決?

就是將Cookie設定為持久Cookie,當你關閉瀏覽器再開啟網站時,還是能從本地讀取到Cookie,從而獲取到原來的SessionID,以此來保持登入狀態

 

另外

而恰恰因為關閉瀏覽器並不會讓伺服器主動刪除Session,為了避免伺服器的資源浪費,一般伺服器都會為每個Session設定一個失效時間,當Session的時間超過失效時間時,伺服器會自動刪除Session

 

相關文章