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

為什麼要用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