cookie session token jwt

應(yīng)用場景

HTTP協(xié)議是一個無狀態(tài)的協(xié)議,無狀態(tài)協(xié)議就是就是說這一次請求和上一次請求是沒有任何關(guān)系的,互不認識的,沒有關(guān)聯(lián)的,如果我們要再次發(fā)送請求時服務(wù)器就無法知道這次請求和上次請求是否是一個客戶

Cookie

cookie是有服務(wù)器保存在用戶瀏覽器(客戶端)上的小文本文件(內(nèi)容通常會解密),他可以包含有關(guān)用戶的信息,無論何時用戶連接到服務(wù)器。web站點都可以訪問,cookie可以說是瀏覽器的緩存,cookie一般存在客戶端
cookie優(yōu)點:
1.簡單性 Cookie 是一種基于文本的輕量結(jié)構(gòu),包含簡單的鍵值對。
2.數(shù)據(jù)持久性 雖然客戶端計算機上 Cookie 的持續(xù)時間取決于客戶端上的 Cookie 過期處理和用戶干預(yù),Cookie 通常是客戶端上持續(xù)時間最長的數(shù)據(jù)保留形式。
cookie缺點:
1.大小受到限制 ,大多數(shù)瀏覽器對 Cookie 的大小有 4096 字節(jié)的限制,盡管在當(dāng)今新的瀏覽器和客戶端設(shè)備版本中,支持 8192 字節(jié)的 Cookie 大小已愈發(fā)常見。
2.非常不安全,cookie將數(shù)據(jù)裸露在瀏覽器中,這樣大大增大了數(shù)據(jù)被盜取的風(fēng)險,所有我們不應(yīng)該將中要的數(shù)據(jù)放在cookie中,或者將數(shù)據(jù)加密處理。
3.容易被csrf攻擊,可以設(shè)置csrf_tokenj來避免攻擊。

Session

用戶在客戶端登錄后,服務(wù)器會跟據(jù)用戶信息生成一個sessionID,然后會把session存儲在redis,數(shù)據(jù)庫等存儲媒介中,然后通過設(shè)置cookie的方式返回給客戶端,既存放在瀏覽器的cookie中,客戶端在下一個請求時,會帶上cookie中的sessionid,然后服務(wù)端根據(jù)sessionid去查redis或者數(shù)據(jù)庫,進行驗證,來到達用戶校驗的目的(cookie用來儲存用戶,session就是用來儲存用戶詳情信息)
session優(yōu)點:
1.session中的信息存儲在服務(wù)端,相比于cookie就在一定程度上加大了數(shù)據(jù)的安全性。
2.session數(shù)據(jù)存儲在服務(wù)端,相比于jwt方便進行管理,也就是說當(dāng)用戶登錄和主動注銷,只需要添加刪除對應(yīng)的session就可以,這樣管理起來很方便。
session缺點:
1.session存儲在服務(wù)端,這就增大了服務(wù)器的開銷,當(dāng)用戶多的情況下,服務(wù)器性能會大大降低。
3、因為是基于cookie來進行用戶識別的, cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。
4、用戶認證之后,服務(wù)端做認證記錄,如果認證的記錄被保存在內(nèi)存中的話,這意味著用戶下次請求還必須要請求在這臺服務(wù)器上,這樣才能拿到授權(quán)的資源,這樣在分布式的應(yīng)用上,相應(yīng)的限制了負載均衡器的能力。這也意味著限制了應(yīng)用的擴展能力。

Token認證

客戶端使用用戶名跟密碼請求登錄,服務(wù)端收到請求,去驗證用戶名與密碼,驗證成功后,服務(wù)端會簽發(fā)一個 Token,再把這個 Token 發(fā)送給客戶端,客戶端收到 Token 以后可以把它存儲起來,客戶端每次向服務(wù)端請求資源的時候需要帶著服務(wù)端簽發(fā)的 Token,服務(wù)端收到請求,然后去驗證客戶端請求里面帶著的 Token,如果驗證成功,就向客戶端返回請求的數(shù)據(jù)
優(yōu)點:支持跨域,自身包含用戶所有信息不需要在服務(wù)端儲存session信息
缺點:占帶寬(儲存信息多消耗更多流量),無法在服務(wù)端注銷,需要經(jīng)常操作數(shù)據(jù)庫(每次請求都會加載用戶信息)

JSON Web Token(JWT)

跟token類似,只不過是json格式傳輸token
由服務(wù)器產(chǎn)生加密的json數(shù)據(jù)包括,header(頭部),payload(載荷),signature(簽證)三部分組成,header中通常來說由token的生成算法和類型組成。payload中則用來保存相關(guān)的狀態(tài)信息。signature部分由header,payload,secret_key三部分加密生成。
jwt優(yōu)點:
1、因為json的通用性,jwt可以支持跨語言請求,像JAVA,JavaScript,NodeJS,PHP等很多語言都可以使用。
2、因為有了payload部分,所以JWT可以在自身存儲一些其他業(yè)務(wù)邏輯所必要的非敏感信息。
3、便于傳輸,jwt的構(gòu)成非常簡單,字節(jié)占用很小,所以它是非常便于傳輸?shù)摹?br> 4、它不需要在服務(wù)端保存會話信息, 所以它易于應(yīng)用的擴展,即信息不保存在服務(wù)端,不會存在session擴展不方便的情況。

jwt缺點:
1、 登錄狀態(tài)信息續(xù)簽問題。比如設(shè)置token的有效期為一個小時,那么一個小時后,如果用戶仍然在這個web應(yīng)用上,這個時候當(dāng)然不能指望用戶再登錄一次。目前可用的解決辦法是在每次用戶發(fā)出請求都返回一個新的token,前端再用這個新的token來替代舊的,這樣每一次請求都會刷新token的有效期。但是這樣,需要頻繁的生成token。另外一種方案是判斷還有多久這個token會過期,在token快要過期時,返回一個新的token。
2、用戶主動注銷。JWT并不支持用戶主動退出登錄,當(dāng)然,可以在客戶端刪除這個token,但在別處使用的token仍然可以正常訪問。為了支持注銷,我的解決方案是在注銷時將該token加入黑名單。
使用jwt注意點:
1、在payload中不應(yīng)該存放敏感信息,以為該部分客戶端是可以解密的。
2、secret_key不能泄露。
理解:
session和cookie都容易被csrf攻擊,而且session類型的狀態(tài)保持只能用于瀏覽器中的,對于用戶的登錄和登出,使用session會更靈活一些。
jwt是json數(shù)據(jù)適用于各種語言,跨語言請求非常方便,jwt可以存在于各種客戶端,不僅僅是瀏覽器,擴展性更強,對數(shù)據(jù)進行加密,數(shù)據(jù)非常安全。

最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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