1. 程式人生 > >Cookie和Session在Node.JS中的實踐(二)

Cookie和Session在Node.JS中的實踐(二)

快速理解 開發工具 ren 發揮 超過 see 技術點 用戶 img

Cookie和Session在Node.JS中的實踐(二)

cookie篇在作者的上一篇文章Cookie和Session在Node.JS中的實踐(一)已經是寫得算是比較詳細了,有興趣可以翻看,這篇是session篇,重點在討論seesion的特性、概念,以及session和cookie的區別和聯系。

之前有人問我,這個問題有必要長篇大論的探討嗎?其實只要我覺得這個技術點重要而且具有迷惑性,就值得去寫、去探討,否則你很難完全明白。寫這種文章有兩個好處:

  1. 首先,於作者而言,寫出來文章讓大家一起理解某個技術這本身就是一種考驗,如果作者的觀點、看法是正確的那麽這樣能加深作者自己對技術點的理解;如果錯了,明眼人會指出錯誤,一起討論、理解。
  2. 再者,於讀者而言,作者覺得只要讀者能從文章中獲得新的知識,那這篇文章的價值也就發揮出來了。作者也經常去看別人寫的文章,通過別人的見解,可以快速理解某個技術。

如果想聰明,請犯錯。
如果不成功,那就再試一試。——《一萬小時天才理論》

session

COOKIE存在於客戶端,而SESSION存在於服務端,並且SESSION需要COOKIE的支持。
技術分享圖片

session是存在於服務端的信息管理機制,它把客戶端信息以某種信息形式記錄在服務器中,客戶端再次訪問只需要從session中查找用戶的狀態就可以了

session運行機制

session的運行機制是這樣的,當程序需要為某個客戶端的請求創建一個seesion時,服務器會首先檢查這個客戶端的請求中的cookie是否含有session標識符(很多人把他叫session_id)。

考慮兩種檢查結果:
1.包含並且沒有過期,則表示服務器已經對這個客戶端創建了session,而服務器只需按照session_id把session檢索出來使用。

技術分享圖片

2.不包含或已過期,則需要新創建一個session並且生成與這個session相關聯的session_id返回給客戶端保存。

技術分享圖片

session存在的必要性

session存在的必要性,很少文章談到這個,作者一開始一直都在想這個問題:

使用純客戶端中的cookie就能完成會話保持,為什麽需要服務端的session?

先來看這個例子:在一個瀏覽器中登錄博客園,通過開發工具獲得了cookie並復制,在另一個瀏覽器中打開博客園(退出登錄狀態下),然後把復制好的cookie都填入該瀏覽器中,刷新,你會發現這個瀏覽器居然是已經是登錄狀態了。(作者親測例子,讀者自行測試具體截圖不放了,若操作有問題評論區解決)

只要盜取了cookie,就能劫持session。同樣的道理,如果單使用cookie,那麽也是一樣只要盜取了cookie就能做到冒充登錄。既然盜取了cookie,無論是session還是cookie都一樣會被冒充,那為什麽需要session呢?

作者為了明白這個問題,花了很多時間才弄明白,沒文化真闊怕。其實session存在的必要性可以從以下幾點說明:
1.用session只需要在客戶端保存一個id,實際上大量數據都是保存在服務端。如果全部用cookie,數據量大的時候客戶端是沒有那麽多空間的。
2.cookie只是實現session的其中一種方案。雖然是最常用的,但並不是唯一的方法。還有URL等其他方式
3.全部在客戶端保存,服務端無法驗證,這樣偽造和仿冒會更加容易。(偽造一個隨機的id很難,但偽造另一個用戶名是很容易的)
4.全部保存在客戶端,那麽一旦被劫持,全部信息都會泄露
5.客戶端數據量變大,網絡傳輸的數據量也會變大

其實,在當下的開發中,都是結合二者使用的。

總結

COOKIE存在於客戶端,而SESSION存在於服務端,並且SESSION需要COOKIE的支持。session是存在於服務端的信息管理機制,它把客戶端信息以某種信息形式記錄在服務器中,客戶端再次訪問只需要從session中查找用戶的狀態就可以了

session和cookie間的區別和聯系:

  1. 最大的區別,session在服務端,cookie在客戶端。
  2. 最大的聯系,session需要cookie,完成一個會話需要兩者結合。
  3. session比cookie要更安全。
  4. 單cookie數據不能超過4K,另外瀏覽器可能會限制單個站點的cookie數量。而session在服務端沒有此類限制。

考慮到後面會使用NODE.JS作為寫session和cookie的實踐,所以把文章分成3部分最好——cookie篇、session篇、NODE.JS實踐篇。這樣,讀者可以按需去看,寫NODE.JS可以看我下一篇的文章,不會NODE的可以跳過了。
下次,NODE.JS見。


如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!

Reference

  1. https://blog.csdn.net/fangaoxin/article/details/6952954
  2. http://blog.51yip.com/php/938.html
  3. https://www.cnblogs.com/shiyangxt/articles/1305506.html

Cookie和Session在Node.JS中的實踐(二)