使用場(chǎng)景有什么區(qū)別?
萬(wàn)維網(wǎng)(www:World Wide Web)的誕生起源自1990年12月15日蒂姆·伯納斯·李利用網(wǎng)際網(wǎng)絡(luò)實(shí)現(xiàn)了超文本傳輸協(xié)議(http:Hyper Text Transfer Protocol)客戶端和服務(wù)器的第一次通訊。
http是運(yùn)行在TCP之上的一種簡(jiǎn)單的請(qǐng)求、響應(yīng)協(xié)議,所謂的協(xié)議就是形成了固有的套路,客戶端指定向服務(wù)器發(fā)送什么信息,然后服務(wù)器就會(huì)做出與之對(duì)應(yīng)的回應(yīng)。舉個(gè)例子:GET、POST、HEAD等方法中,post一般用于客戶端提交表單數(shù)據(jù)給服務(wù)器,或者上次文件給服務(wù)器,而head、get則是獲取URL中指定的資源。在使用get時(shí)請(qǐng)求的參數(shù)、值需要附加在URI(URI時(shí)URL的一種擴(kuò)張,在HTTP協(xié)議中URI一般都是指URL)后面,利用"?"將資源的URI和請(qǐng)求參數(shù)、值隔離開(kāi)來(lái),參數(shù)、值之間使用“&”隔開(kāi)。萬(wàn)維網(wǎng)的發(fā)展歷史要徹底理解session、cookie、token之間的區(qū)別,就不得不去翻開(kāi)過(guò)去塵封的歷史。僅30年web發(fā)生了翻天覆地的變化。早期的web其實(shí)是非常簡(jiǎn)陋的,僅僅實(shí)現(xiàn)的是基本的文本瀏覽而已。用寒酸的表格來(lái)做框架定位還僅僅是后話。僅僅只是文本和文本包含的超鏈接而已,服務(wù)器僅僅只是機(jī)械式的請(qǐng)求,然后響應(yīng),并不需要記錄誰(shuí)在某一個(gè)時(shí)間段里瀏覽了什么內(nèi)容,也不需要記住是誰(shuí)發(fā)的HTTP請(qǐng)求。慢慢的網(wǎng)站就需要登錄、留言、發(fā)表內(nèi)容、內(nèi)容管理、在線購(gòu)物等等交互,這時(shí)web就需要引入會(huì)話管理機(jī)制,記錄誰(shuí)登錄了系統(tǒng),誰(shuí)又將商品放入了購(gòu)物車(chē)中等等。由于早期的web本身就是無(wú)狀態(tài)請(qǐng)求,于是有人就想出了一個(gè)辦法,給每個(gè)訪問(wèn)的人發(fā)一個(gè)不會(huì)重復(fù)的號(hào)碼牌,也就是session id(會(huì)話標(biāo)識(shí))。由于session id是服務(wù)器發(fā)給每個(gè)接收端的一串隨機(jī)字符串,這樣就能夠區(qū)分誰(shuí)是誰(shuí)了。session id看似解決web無(wú)狀態(tài)請(qǐng)求的問(wèn)題,但也造成了不小的困擾。比如在負(fù)載均衡組成的集群中,當(dāng)我們通過(guò)機(jī)器A登錄,session id就會(huì)保持在機(jī)器A上。但如果下次請(qǐng)求轉(zhuǎn)發(fā)到了機(jī)器B,就需要將機(jī)器A的session id復(fù)制到機(jī)器B上,所以總是在session復(fù)制、粘貼的過(guò)程,如果保存了session的機(jī)器掛了新的問(wèn)題接著又產(chǎn)生了。除此之外每個(gè)人的設(shè)備確實(shí)是保存了屬于自己的session id,但服務(wù)器卻要保存所有的session id,這可不一定是幾個(gè)幾十個(gè)了,二十成千上萬(wàn),甚至幾十、上百萬(wàn)個(gè)。session其實(shí)也特別不安全,如果有人偽造了你的session id,也就意味著他可以為所欲為了??梢酝ㄟ^(guò)cookie的方式來(lái)保存session id,但cookie的區(qū)別在于其主要內(nèi)容包括了名字、值、過(guò)期時(shí)間、路徑、域等信息,cookie可以實(shí)現(xiàn)類似于訪問(wèn)者離開(kāi)店鋪或者關(guān)閉瀏覽器,再打開(kāi)店鋪就能馬上回復(fù)購(gòu)物車(chē)的功能。但cookie一旦過(guò)期就會(huì)被清理,當(dāng)訪問(wèn)者再次打開(kāi)網(wǎng)站時(shí)又會(huì)重新分配cookie。這么看來(lái)session id和cookie在本質(zhì)上并沒(méi)有完全的區(qū)別,別人想偽造很容易偽造。于是token就出現(xiàn)了,比如用HMAC-SHA256算法加上一個(gè)密鑰來(lái)對(duì)數(shù)據(jù)進(jìn)行簽名,那么別人不知道密鑰,那么就沒(méi)有辦法偽造了,簽名和數(shù)據(jù)組合在一起就是token了。token并不需要保存,只需要將發(fā)過(guò)來(lái)的token用同樣的HMAC-SHA256算法和密鑰再算一次比對(duì)相同就表示這個(gè)用戶已經(jīng)登錄了,并且可以直接取到用戶的userID,相反不相同,則會(huì)提示認(rèn)證失敗。token的優(yōu)勢(shì)是非常明顯的,服務(wù)器只生產(chǎn)token和驗(yàn)證token,所以服務(wù)器就變得非常輕松,沒(méi)有了各種附帶的狀態(tài)。但由于token中的數(shù)據(jù)也是明文保存,所以一旦某個(gè)人的token被人偷走了,和本人是一樣的。總之cookie依舊在,使用web api的互聯(lián)網(wǎng)大廠更加熱衷于token,token相對(duì)于session id、cookie會(huì)更加安全,并且無(wú)狀態(tài)、可擴(kuò)展,支持移動(dòng)設(shè)備,可以跨程序調(diào)用。以上個(gè)人淺見(jiàn),歡迎批評(píng)指正。認(rèn)同我的看法,請(qǐng)點(diǎn)個(gè)贊再走,感謝!喜歡我的,請(qǐng)關(guān)注我,再次感謝!