更多內容,歡迎關注微信公衆號:全菜工程師小輝。公衆號回覆關鍵詞,領取免費學習資料。前端
存儲位置
三者都是應用在web中對http無狀態協議的補充,達到狀態保持的目的git
cookie:cookie中的信息是以鍵值對的形式儲存在瀏覽器中,並且在瀏覽器中能夠直接看到數據。下圖爲safari的cookie截圖:github
session:session存儲在服務器中,而後發送一個cookie存儲在瀏覽器中,cookie中存儲的是session_id,以後每次請求服務器經過session_id能夠獲取對應的session信息web
JWT:JWT存儲在瀏覽器的storage或者cookie中。由服務器產生加密的json數據包括:header,payload和signature三部分組成。header中一般來講由token的生成算法和類型組成;payload中則用來保存相關的狀態信息;signature部分由header,payload,secret_key三部分加密生成。 注意,不要在JWT的payload或header中放置敏感信息,除非它們是加密的。下圖爲官網的截圖:redis
優缺點
cookie:算法
- 結構簡單。cookie是一種基於文本的輕量結構,包含簡單的鍵值對。
- 數據持久。雖然客戶端計算機上cookie的持續時間取決於客戶端上的cookie過時處理和用戶干預,cookie一般是客戶端上持續時間最長的數據保留形式。
- 大小受到限制。大多數瀏覽器對 cookie 的大小有 4096 字節的限制,儘管在當今新的瀏覽器和客戶端設備版本中,支持 8192 字節的 cookie 大小已愈發常見。
- 很是不安全。cookie將數據裸露在瀏覽器中,這樣大大增大了數據被盜取的風險,全部咱們不該該將中要的數據放在cookie中,或者將數據加密處理。
- 容易被csrf攻擊。能夠設置csrf_token來避免攻擊。
session:json
- session的信息存儲在服務端,相比於cookie就在必定程度上加大了數據的安全性;相比於jwt方便進行管理,也就是說當用戶登陸和主動註銷,只須要添加刪除對應的session就能夠,這樣管理起來很方便。
- session存儲在服務端,這就增大了服務器的開銷,當用戶多的狀況下,服務器性能會大大下降。
- 由於是基於cookie來進行用戶識別的, cookie若是被截獲,用戶就會很容易受到跨站請求僞造的攻擊。
- 用戶認證以後,服務端作認證記錄,若是認證的記錄被保存在內存中的話,這意味着用戶下次請求還必需要請求在這臺服務器上,這樣才能拿到受權的資源,這樣在分佈式的應用上,會限制負載均衡和集羣水平拓展的能力。
JWT:後端
- 由於json的通用性,jwt能夠支持跨語言請求,像JAVA,JavaScript,PHP等不少語言均可以使用。
- 由於有了payload部分,因此JWT能夠在自身存儲一些其餘業務邏輯所必要的非敏感信息。
- 便於傳輸,JWT的構成很是簡單,字節佔用很小,因此它是很是便於傳輸的。
- 不須要在服務端保存會話信息, 利於服務器橫向拓展。
- 登陸狀態信息續簽問題。好比設置token的有效期爲一個小時,那麼一個小時後,若是用戶仍然在這個web應用上,這個時候固然不能期望用戶再登陸一次。目前可用的解決辦法是在每次用戶發出請求都返回一個新的token,前端再用這個新的token來替代舊的,這樣每一次請求都會刷新token的有效期。可是這樣,須要頻繁的生成token。另一種方案是判斷還有多久這個token會過時,在token快要過時時,返回一個新的token。
- 用戶主動註銷。JWT並不支持用戶主動退出登陸,客戶端在別處使用token仍然能夠正常訪問。爲了支持註銷,個人解決方案是在註銷時將該token加入到服務器的redis黑名單中。
JWT與OAuth的區別
> 這兩個概念總有人用混淆,因此一塊兒介紹了。瀏覽器
OAuth2是一種受權框架,用在使用第三方帳號登陸的狀況(好比使用weibo, qq, github登陸某個app)
JWT是一種認證協議,用在先後端分離,須要簡單的對後臺API進行保護時使用。 > 不管使用哪一種方式切記用HTTPS來保證數據的安全性;安全
更多內容,歡迎關注微信公衆號:全菜工程師小輝。公衆號回覆關鍵詞,領取免費學習資料。