1. 程式人生 > 其它 >JWT和Cookie/Session的區別及優缺點

JWT和Cookie/Session的區別及優缺點

## JWT和Cookie/Session的區別及優缺點

儲存位置

古老都是應用在web中對http無狀態協議的補充,達到狀態保持的目的。

cookie: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:

- 優點:

1. 結構簡單。cookie是一種基於文字的輕量結構,包含簡單的鍵值對。
2. 資料持久。雖然客戶端計算機上cookie的持續時間取決於客戶端上的cookie過期處理和使用者干預,cookie通常是客戶端上持續時間最長的資料保留形式。

- 缺點:

1. 大小受限。大多數瀏覽器對cookie的大小有5096的位元組限制,儘管在當今新的瀏覽器和客戶端裝置版本中,支援8192位元組的cookie大小已愈發常見。
2. 非常不安全。cookie將資料裸露在瀏覽器中,這樣大大增大了資料被盜取的風險,所以我們不應該將重要的資料放在cookie中,或者將資料加密處理。
3. 容易被csrf攻擊。可以設定csrf_token來避免攻擊。

session:

- 優點:

1. session的資訊儲存在伺服器,相比於cookie應在一定程度上加大了資料的完全性,相比於jwt方便進行管理,也就是說當用戶登入和主動登出,只需要新增刪除對應的session就可以,這樣管理起來很方便

- 缺點:

1. session儲存在服務端,這就增大了伺服器的開銷,當用戶多的情況下,伺服器效能應付大大降低。
2. 因為是基於cookie來進行使用者識別的cookie如果被截獲,使用者就會很容易受到跨站請求偽造的攻擊。
3. 使用者認證之後,服務端做認證記錄,如果認證的記錄被儲存的記憶體中的話, 這意味著使用者下次請求還必須要請求在這臺伺服器上的,這樣才能拿到授權的資源,這樣在分散式的應用上,會限制負載均衡和叢集水平拓展的能力。

JWT:

- 優點:

1. 因為json的通用性,jwt可支援跨語言請求,像Java、JavaScript、PHP等很多語言都可以使用。
2. 因為有了payload部分,所以JWT可以在自身儲存一些其他業務邏輯所必要的非敏感資訊。
3. 便於傳輸,JWT的構成非常簡單,位元組佔用很小,所以它是非常便於傳輸的。
4. 不需要在服務端儲存會話資訊,籃球伺服器橫向拓展。

- 缺點:

1. 登入狀態續簽問題。比如設定token的有效期為一個小時,那麼一個小時後,如果使用者仍然在這個web應用上,這個時候當然不能指望使用者再登入一次。目前可用的解決辦法是在每次使用者發現請求都返回一個新的token,前端再用這個token來替代舊的,這樣每一次請求都會重新整理token的有效期。但是這樣需要頻繁的生成token。另外一種方案是判斷還有多久這個token會過期,在token快要過期時,返回一個新的token.
2. 使用者主動登出。JWT並不支援使用者主動退出登入,客戶端在別處使用token仍然可以正常訪問。為了支援登出。有一個解決方案可用,就是在登出時將該token加入到伺服器的redis黑名單中。

## 擴充套件

- JWT與OAuth的區別
OAuth2是一種授權框架,用在使用第三方賬號登入的情況,比如使用weibo,qq,github登入某個app,JWT是一種認證協議,用在前後端分離,需要簡單對後臺API進行保護時使用。無論使用哪種方式一定要用HTTPS來保證資料的安全性。

[https://i.cnblogs.com/posts]:

1.