Cookie和Session在Node.JS中的實踐(二) cookie篇在作者的上一篇文章 "Cookie和Session在Node.JS中的實踐(一)" 已經是寫得算是比較詳細了,有興趣可以翻看,這篇是session篇,重點在討論seesion的特性、概念,以及session和cookie的區別 ...
Cookie和Session在Node.JS中的實踐(二)
cookie篇在作者的上一篇文章Cookie和Session在Node.JS中的實踐(一)已經是寫得算是比較詳細了,有興趣可以翻看,這篇是session篇,重點在討論session的特性、概念,以及session和cookie的區別和聯繫。
之前有人問我,這個問題有必要長篇大論的探討嗎?其實只要我覺得這個技術點重要而且具有迷惑性,就值得去寫、去探討,否則你很難完全明白。寫這種文章有兩個好處:
- 首先,於作者而言,寫出來文章讓大家一起理解某個技術這本身就是一種考驗,如果作者的觀點、看法是正確的那麼這樣能加深作者自己對技術點的理解;如果錯了,明眼人會指出錯誤,一起討論、理解。
- 再者,於讀者而言,作者覺得只要讀者能從文章中獲得新的知識,那這篇文章的價值也就發揮出來了。作者也經常去看別人寫的文章,通過別人的見解,可以快速理解某個技術。
如果想聰明,請犯錯。
如果不成功,那就再試一試。——《一萬小時天才理論》
session
COOKIE存在於客戶端,而SESSION存在於服務端,並且SESSION需要COOKIE的支持。
session是存在於服務端的信息管理機制,它把客戶端信息以某種信息形式記錄在伺服器中,客戶端再次訪問只需要從session中查找用戶的狀態就可以了。
session運行機制
session的運行機制是這樣的,當程式需要為某個客戶端的請求創建一個seesion時,伺服器會首先檢查這個客戶端的請求中的cookie是否含有session標識符(很多人把他叫session_id)。
考慮兩種檢查結果:
1.包含session標識符並且沒有過期,則表示伺服器已經對這個客戶端創建了session,而伺服器只需按照session_id把session檢索出來使用。
2.不包含seesion標識符或已過期,則需要新創建一個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間的區別和聯繫:
- 最大的區別,session在服務端,cookie在客戶端。
- 最大的聯繫,session需要cookie,完成一個會話需要兩者結合。
- session比cookie要更安全。
- 單cookie數據不能超過4K,另外瀏覽器可能會限制單個站點的cookie數量。而session在服務端沒有此類限制。
考慮到後面會使用NODE.JS作為寫session和cookie的實踐,所以把文章分成3部分最好——cookie篇、session篇、NODE.JS實踐篇。這樣,讀者可以按需去看,寫NODE.JS可以看我下一篇的文章,不會NODE的可以跳過了。
下次,NODE.JS見。
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!
Reference
- https://blog.csdn.net/fangaoxin/article/details/6952954
- http://blog.51yip.com/php/938.html
- https://www.cnblogs.com/shiyangxt/articles/1305506.html