什么是token token和session的區別

萬維網(www:World Wide Web)的誕生起源自1990年12月15日蒂姆·伯納斯·李利用網際網絡實現了超文本傳輸協議(http:Hyper Text Transfer Protocol)客戶端和服務器的第一次通訊 。

什么是token token和session的區別

文章插圖
http是運行在TCP之上的一種簡單的請求、響應協議,所謂的協議就是形成了固有的套路 , 客戶端指定向服務器發送什么信息,然后服務器就會做出與之對應的回應 。
什么是token token和session的區別

文章插圖
舉個例子:GET、POST、HEAD等方法中,post一般用于客戶端提交表單數據給服務器,或者上次文件給服務器,而head、get則是獲取URL中指定的資源 。在使用get時請求的參數、值需要附加在URI(URI時URL的一種擴張,在HTTP協議中URI一般都是指URL)后面,利用"?"將資源的URI和請求參數、值隔離開來,參數、值之間使用“&”隔開 。
什么是token token和session的區別

文章插圖
萬維網的發展歷史要徹底理解session、cookie、token之間的區別,就不得不去翻開過去塵封的歷史 。僅30年web發生了翻天覆地的變化 。
什么是token token和session的區別

文章插圖
早期的web其實是非常簡陋的,僅僅實現的是基本的文本瀏覽而已 。用寒酸的表格來做框架定位還僅僅是后話 。僅僅只是文本和文本包含的超鏈接而已,服務器僅僅只是機械式的請求 , 然后響應,并不需要記錄誰在某一個時間段里瀏覽了什么內容,也不需要記住是誰發的HTTP請求 。
什么是token token和session的區別

文章插圖
慢慢的網站就需要登錄、留言、發表內容、內容管理、在線購物等等交互,這時web就需要引入會話管理機制,記錄誰登錄了系統,誰又將商品放入了購物車中等等 。由于早期的web本身就是無狀態請求,于是有人就想出了一個辦法,給每個訪問的人發一個不會重復的號碼牌,也就是session id(會話標識) 。由于session id是服務器發給每個接收端的一串隨機字符串 , 這樣就能夠區分誰是誰了 。
什么是token token和session的區別

文章插圖
session id看似解決web無狀態請求的問題,但也造成了不小的困擾 。比如在負載均衡組成的集群中,當我們通過機器A登錄 , session id就會保持在機器A上 。但如果下次請求轉發到了機器B,就需要將機器A的session id復制到機器B上 , 所以總是在session復制、粘貼的過程,如果保存了session的機器掛了新的問題接著又產生了 。
什么是token token和session的區別

文章插圖
除此之外每個人的設備確實是保存了屬于自己的session id,但服務器卻要保存所有的session id , 這可不一定是幾個幾十個了,二十成千上萬 , 甚至幾十、上百萬個 。
什么是token token和session的區別

文章插圖
session其實也特別不安全,如果有人偽造了你的session id , 也就意味著他可以為所欲為了 。可以通過cookie的方式來保存session id,但cookie的區別在于其主要內容包括了名字、值、過期時間、路徑、域等信息 , cookie可以實現類似于訪問者離開店鋪或者關閉瀏覽器,再打開店鋪就能馬上回復購物車的功能 。但cookie一旦過期就會被清理,當訪問者再次打開網站時又會重新分配cookie 。
什么是token token和session的區別

文章插圖
這么看來session id和cookie在本質上并沒有完全的區別,別人想偽造很容易偽造 。于是token就出現了 , 比如用HMAC-SHA256算法加上一個密鑰來對數據進行簽名 , 那么別人不知道密鑰,那么就沒有辦法偽造了,簽名和數據組合在一起就是token了 。