Token與Cookie,Session的區(qū)別

什么是會話?

會話: 數(shù)據(jù)交互的過程,在web中指 瀏覽器從發(fā)出一個請求到瀏覽器關(guān)閉,這個過程就是一個會話。在這個過程中,需要有很多的狀態(tài)和數(shù)據(jù)需要我們關(guān)注,記錄,這個就是我們要研究的會話

什么是會話機制

http協(xié)議是短連接無狀態(tài)的,所以需要cookie和session進(jìn)行保存用戶身份驗證
從根本上解決了用戶持續(xù)訪問的問題
cookie服務(wù)器下發(fā)保存在本地的,因此cookie不安全,容易被篡改
cookie是臨時的,關(guān)閉瀏覽器自動刪除
因此需要session,session是生成在服務(wù)器,django保存在數(shù)據(jù)庫,flask保存在服務(wù)器的,把session id給用戶下發(fā)

什么是cookie

cookie 是一個非常具體的東西,指的就是瀏覽器里面能永久存儲的一種數(shù)據(jù),僅僅是瀏覽器實現(xiàn)的一種數(shù)據(jù)存儲功能。
cookie由服務(wù)器生成,發(fā)送給瀏覽器,瀏覽器把cookie以key,value形式保存到某個目錄下的文本文件內(nèi),下一次請求同一網(wǎng)站時會把該cookie發(fā)送給服務(wù)器。由于cookie是存在客戶端上的,所以瀏覽器加入了一些限制確保cookie不會被惡意使用,同時不會占據(jù)太多磁盤空間,所以每個域的cookie數(shù)量是有限的。
總結(jié):cookie是一段小型文本數(shù)據(jù)
Cookie是一段不超過4KB的小型文本數(shù)據(jù),由一個名稱(Name)、一個值(Value)和其它幾個用于控制Cookie有效期、安全性、使用范圍的可選屬性組成。

什么是session

session 從字面上講,就是會話。這個就類似于你和一個人交談,你怎么知道當(dāng)前和你交談的是張三而不是李四呢?對方肯定有某種特征(長相等)表明他就是張三。

session 也是類似的道理,服務(wù)器要知道當(dāng)前發(fā)請求給自己的是誰。為了做這種區(qū)分,服務(wù)器就要給每個客戶端分配不同的“身份標(biāo)識”,然后客戶端每次向服務(wù)器發(fā)請求的時候,都帶上這個“身份標(biāo)識”,服務(wù)器就知道這個請求來自于誰了。至于客戶端怎么保存這個“身份標(biāo)識”,可以有很多種方式,對于瀏覽器客戶端,大家都默認(rèn)采用 cookie 的方式。

服務(wù)器使用session把用戶的信息臨時保存在了服務(wù)器上,用戶離開網(wǎng)站后session會被銷毀。這種用戶信息存儲方式相對cookie來說更安全,可是session有一個缺陷:如果web服務(wù)器做了負(fù)載均衡,那么下一個操作請求到了另一臺服務(wù)器的時候session會丟失。

什么是token?

1、Token的引入:Token是在客戶端頻繁向服務(wù)端請求數(shù)據(jù),服務(wù)端頻繁的去數(shù)據(jù)庫查詢用戶名和密碼并進(jìn)行對比,判斷用戶名和密碼正確與否,并作出相應(yīng)提示,在這樣的背景下,Token便應(yīng)運而生。

2、Token的定義:Token是服務(wù)端生成的一串字符串,以作客戶端進(jìn)行請求的一個令牌,當(dāng)?shù)谝淮蔚卿浐螅?wù)器生成一個Token便將此Token返回給客戶端,以后客戶端只需帶上這個Token前來請求數(shù)據(jù)即可,無需再次帶上用戶名和密碼。

3、使用Token的目的:Token的目的是為了減輕服務(wù)器的壓力,減少頻繁的查詢數(shù)據(jù)庫,使服務(wù)器更加健壯。

如何使用token?

1、用設(shè)備號/設(shè)備mac地址作為Token(推薦)

客戶端:客戶端在登錄的時候獲取設(shè)備的設(shè)備號/mac地址,并將其作為參數(shù)傳遞到服務(wù)端。

服務(wù)端:服務(wù)端接收到該參數(shù)后,便用一個變量來接收同時將其作為Token保存在數(shù)據(jù)庫,并將該Token設(shè)置到session中,客戶端每次請求的時候都要統(tǒng)一攔截,并將客戶端傳遞的token和服務(wù)器端session中的token進(jìn)行對比,如果相同則放行,不同則拒絕。

分析:此刻客戶端和服務(wù)器端就統(tǒng)一了一個唯一的標(biāo)識Token,而且保證了每一個設(shè)備擁有了一個唯一的會話。該方法的缺點是客戶端需要帶設(shè)備號/mac地址作為參數(shù)傳遞,而且服務(wù)器端還需要保存;優(yōu)點是客戶端不需重新登錄,只要登錄一次以后一直可以使用,至于超時的問題是有服務(wù)器這邊來處理,如何處理?若服務(wù)器的Token超時后,服務(wù)器只需將客戶端傳遞的Token向數(shù)據(jù)庫中查詢,同時并賦值給變量Token,如此,Token的超時又重新計時。

2、用session值作為Token

客戶端:客戶端只需攜帶用戶名和密碼登陸即可。

客戶端:客戶端接收到用戶名和密碼后并判斷,如果正確了就將本地獲取sessionID作為Token返回給客戶端,客戶端以后只需帶上請求數(shù)據(jù)即可。

分析:這種方式使用的好處是方便,不用存儲數(shù)據(jù),但是缺點就是當(dāng)session過期后,客戶端必須重新登錄才能進(jìn)行訪問數(shù)據(jù)。

token的優(yōu)勢

無狀態(tài)、可擴展

在客戶端存儲的Tokens是無狀態(tài)的,并且能夠被擴展。基于這種無狀態(tài)和不存儲Session信息,負(fù)載負(fù)載均衡器能夠?qū)⒂脩粜畔囊粋€服務(wù)傳到其他服務(wù)器上。
如果我們將已驗證的用戶的信息保存在Session中,則每次請求都需要用戶向已驗證的服務(wù)器發(fā)送驗證信息(稱為Session親和性)。用戶量大時,可能會造成一些擁堵。
但是不要著急。使用tokens之后這些問題都迎刃而解,因為tokens自己hold住了用戶的驗證信息。

安全性

請求中發(fā)送token而不再是發(fā)送cookie能夠防止CSRF(跨站請求偽造)。即使在客戶端使用cookie存儲token,cookie也僅僅是一個存儲機制而不是用于認(rèn)證。不將信息存儲在Session中,讓我們少了對session操作。
token是有時效的,一段時間之后用戶需要重新驗證。我們也不一定需要等到token自動失效,token有撤回的操作,通過token revocataion可以使一個特定的token或是一組有相同認(rèn)證的token無效。

可擴展性

Tokens能夠創(chuàng)建與其它程序共享權(quán)限的程序。例如,能將一個隨便的社交帳號和自己的大號(Fackbook或是Twitter)聯(lián)系起來。當(dāng)通過服務(wù)登錄Twitter(我們將這個過程Buffer)時,我們可以將這些Buffer附到Twitter的數(shù)據(jù)流上(we are allowing Buffer to post to our Twitter stream)。

使用tokens時,可以提供可選的權(quán)限給第三方應(yīng)用程序。當(dāng)用戶想讓另一個應(yīng)用程序訪問它們的數(shù)據(jù),我們可以通過建立自己的API,得出特殊權(quán)限的tokens。

多平臺跨域

我們提前先來談?wù)撘幌翪ORS(跨域資源共享),對應(yīng)用程序和服務(wù)進(jìn)行擴展的時候,需要介入各種各種的設(shè)備和應(yīng)用程序。
Having our API just serve data, we can also make the design choice to serve assets from a CDN. This eliminates the issues that CORS brings up after we set a quick header configuration for our application.

只要用戶有一個通過了驗證的token,數(shù)據(jù)和資源就能夠在任何域上被請求到。

Access-Control-Allow-Origin: *

有何區(qū)別?

這里就講述一下session與token的區(qū)別,這里以一個flask項目舉例,session是把flask存在服務(wù)器的,服務(wù)器存放一個session值,像前端下發(fā)一個key,然后前端訪問的時候會攜帶這個key進(jìn)行訪問,再去服務(wù)器尋找key對應(yīng)的值,如果找到了就校驗成功,這是一個項目生成與下發(fā)session的具體流程。
這時對于這個session校驗就會產(chǎn)生一個問題,如果我們這個項目做了負(fù)載均衡,后端采用多臺服務(wù)器放置數(shù)據(jù)呢?用戶每次登陸會被引向不同的服務(wù)器,這時候還要校驗用戶身份是不是就需要每臺服務(wù)器都存放一個session對應(yīng)的value呢?為了解決這個問題,就不再使用session校驗,而是使用token,在token技術(shù)里,服務(wù)器端存放一個加密校驗方式,不存放任何用戶的session之類的數(shù)據(jù),用戶訪問服務(wù)器,在服務(wù)器端生成一個加密后的返回一個帶簽名的token下發(fā)給前端,前端頁面保存這個token,以后每次訪問在請求頭heads中攜帶這個token進(jìn)行訪問就可以了。服務(wù)端會驗證token,校驗成功則返回請求數(shù)據(jù),校驗失敗則返回錯誤碼。至此,因為是服務(wù)器不存放value值,所以不用一一對應(yīng)前端的key和后端的value,因此也就解決了跨域訪問的問題,也解決了負(fù)載均衡下多臺服務(wù)器的問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容