快速了解會話管理三劍客cookie、session和JWT
- 2019 年 10 月 3 日
- 筆記
更多內容,歡迎關注微信公眾號:全菜工程師小輝。公眾號回復關鍵詞,領取免費學習資料。
存儲位置
三者都是應用在web中對http無狀態協議的補充,達到狀態保持的目的
cookie:cookie中的資訊是以鍵值對的形式儲存在瀏覽器中,而且在瀏覽器中可以直接看到數據。下圖為safari的cookie截圖:

session:session存儲在伺服器中,然後發送一個cookie存儲在瀏覽器中,cookie中存儲的是session_id,之後每次請求伺服器通過session_id可以獲取對應的session資訊
JWT:JWT存儲在瀏覽器的storage或者cookie中。由伺服器產生加密的json數據包括:header,payload和signature三部分組成。header中通常來說由token的生成演算法和類型組成;payload中則用來保存相關的狀態資訊;signature部分由header,payload,secret_key三部分加密生成。
注意,不要在JWT的payload或header中放置敏感資訊,除非它們是加密的。下圖為官網的截圖:

優缺點
cookie:
- 優點:
- 結構簡單。cookie是一種基於文本的輕量結構,包含簡單的鍵值對。
- 數據持久。雖然客戶端電腦上cookie的持續時間取決於客戶端上的cookie過期處理和用戶干預,cookie通常是客戶端上持續時間最長的數據保留形式。
- 缺點:
- 大小受到限制。大多數瀏覽器對 cookie 的大小有 4096 位元組的限制,儘管在當今新的瀏覽器和客戶端設備版本中,支援 8192 位元組的 cookie 大小已愈發常見。
- 非常不安全。cookie將數據裸露在瀏覽器中,這樣大大增大了數據被盜取的風險,所有我們不應該將中要的數據放在cookie中,或者將數據加密處理。
- 容易被csrf攻擊。可以設置csrf_token來避免攻擊。
session:
- 優點:
- 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來保證數據的安全性;
更多內容,歡迎關注微信公眾號:全菜工程師小輝。公眾號回復關鍵詞,領取免費學習資料。
