Cookie、Session和token的區別
發展史
一、在互聯網剛開始的時候,Web 基本上就是檔案的瀏覽而已,既然是瀏覽,作為服務器, 不需要記錄誰在某一段時間里都瀏覽了什么檔案,每次請求都是一個新的HTTP協議, 就是請求加回應, 尤其是我不用記住是誰剛剛發了HTTP請求, 每個請求對我來說都是全新的,所以說這時候開發特別簡單,單純的獲取服務器資源
二、后來隨著需求業務的增加,需要記住登陸用戶的身份,服務器必須將每個用戶的身份給識別出來,但是在這個時候問題就出來了,因為HTTP請求時無狀態的,
在這里講解一下什么是HTTP請求的無狀態?
1、服務器不保留與客戶互動時的任何資訊以及狀態,大致就是說用戶的每次請求與你的其它請求沒有半毛錢的關系,
這就出現了一個問題,那我們如何記錄用戶的狀態及如何區分用戶呢?
2、既然HTTP不能記錄,那我們應該如何用其他方法解決這個問題呢,
那就出現了Cookie和Session,請你們記住,這兩個玩意就是為了讓HTTP客觀上有狀態的,
Cookie和Session
Cookie是儲存在客戶端的,Session是儲存在服務端的,
注意:
- cookie是沒有過期時間的,
1、只是它的保存時間是一個會話周期(session), 臨時性Cookie,不會被持久化,也就是當你關閉你的瀏覽器后,
這個cookie就會消失,
2、但是cookie有expires屬性,可以設定失效時間,如果Cookie沒有設定expires屬性,cookie 的生命周期只是在當前的會話中,如果expires設定一個過去的時間點,那么這個cookie 會被立即刪掉(失效)
3、 關閉瀏覽器意味著這次會話的結束,此時 cookie 隨之失效,
Cookie的實作程序:
1、客戶端請求服務器后,如果服務器需要記錄用戶狀態,服務器會在回應資訊中包含一個Set-Cookie的回應頭
2、客戶端會根據這個回應頭存盤Cookie資訊,再次請求服務器時,客戶端會在請求資訊中包含一個Cookie請求頭,
3、服務器會根據這個請求頭進行用戶身份、狀態等較驗.
Session的實作程序:
反正就是服務端生成,存盤在服務器的記憶體中以及保存在檔案或資料庫中,回傳給前端儲存到cookie中,
1、session是有過期時間的,可以設定過期時間或者服務器關閉就會消失
2、session多了服務端會有記憶體壓力,這就需要負載均衡了以及不同服務器的session共享問題,
這對服務器說是一個巨大的開銷 , 嚴重的限制了服務器擴展能力, 比如說用戶用兩個機器組成了一個集群, 用戶通過機器A登錄了系統, 那session id會保存在機器A上, 假設用戶的下一次請求被轉發到機器B怎么辦?機器B可沒有我的 session id啊,
有時候會采用一點小伎倆: session sticky(會話粘黏) , 就是用戶的請求一直粘連在機器A上, 但是這也不管用, 要是機器A掛掉了, 還得轉到機器B去,
那只好做session 的復制了, 把session id 在兩個機器之間搬來搬去,這樣特別麻煩,
為了解決服務器壓力,之后出現了token和JWT,為什么會出現這個呢,最好的方法是不是服務端最好不用存盤類似于sessionId的資料,
Token 和JWT
首先都叫令牌,你就想想著古代皇上御賜的腰牌吧,
Token
Token,我個人理解的話和session區別不大,但是session會消耗服務器記憶體,但是我自己做的專案就是后端自己生成的Token,然后存入資料庫或者緩沖層,回傳給前端,就這個樣子,
具體流程:
1、前端發起登錄請求,后端接受請求后生成token,儲存在緩沖層,設定失效時間,
2、回傳給前端,然后前端儲存在localstorage,,等等
3、前端每次請求,就在請求頭里面攜帶這個token,后端設定攔截器,每次請求前置時查看這個token與緩沖
層里面的token是否一直,一直就放行,不一直就回傳false
JWT
全稱:JSON WEB TOKEN 可以使用在RESTFUL介面定義, 也可以使用在普通的web
組成
第一部分為頭部(header),第二部分我們稱其為載荷(payload),第三部分是簽證(signature),
具體流程
1、 在頭部資訊中宣告加密演算法和常量, 然后把header使用json轉化為字串
2、在載荷中宣告用戶資訊,同時還有一些其他的內容;再次使用json 把載荷部分進行轉化,轉化為字串
(但是你覺得載荷中應不應該放置敏感的資訊,當然不行,因為有效載荷中的內容是base64進行編碼的,并不是進行加密的,而且JWT存盤在localstorage等等,能夠被獲取到)
3、 使用在header中宣告的加密演算法和每個專案隨機生成的secret來進行加密, 把第一步分字串和第二部分的字串進行加密, 生成新的字串,此字串是獨一無二的,
4、解密的時候,只要客戶端帶著JWT來發起請求,服務端就直接使用secret進行解密,
JWT的話推薦這大佬的,非常詳細,有Java相關代碼,
此外,JWT還可以使用雙token模式,即token在后端存盤,
關于前端如何存盤的token的話可以采取這位大佬的講解
參考相關文章:
- https://blog.csdn.net/AkiraNicky/article/details/99307713
- https://blog.csdn.net/m19123456789
- https://blog.csdn.net/weixin_30548917/article/details/96607045
- https://blog.csdn.net/qq_36894974/article/details/105322171
(如若有遺漏請聯系我)
允許轉載,若有侵權,將進行追究
若侵權他人,請聯系我,進行洗掉,謝謝
來自一個寫代碼的小哥哥
若有錯誤,請聯系我,進行修改
寫代碼,掙錢,努力,掙錢,run,run,run
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/296607.html
標籤:其他
