JWT與Session的比較

現在,愈來愈多的項目開始採用JWT做爲認證受權機制,那麼它和以前的Session究竟有什麼區別呢?今天就讓咱們來了解一下。
JWT是什麼web

定義算法

JSON Web Token(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊和自包含的方式,用於在各方之間做爲JSON對象安全地傳輸信息。做爲標準,它沒有提供技術實現,可是大部分的語言平臺都有按照它規定的內容提供了本身的技術實現,因此實際在用的時候,只要根據本身當前項目的技術平臺,到官網上選用合適的實現庫便可。

特色數據庫

使用JWT來傳輸數據,實際上傳輸的是一個字符串,這個字符串就是所謂的json web token字符串。因此廣義上,JWT是一個標準的名稱;狹義上,JWT指的就是用來傳遞的那個token字符串。這個串有兩個特色:

緊湊:指的是這個串很小,能經過url 參數,http 請求提交的數據以及http header的方式來傳遞;
自包含:這個串能夠包含不少信息,好比用戶的id、角色等,別人拿到這個串,就能拿到這些關鍵的業務信息,從而避免再經過數據庫查詢等方式才能獲得它們。json

結構安全

它由三部分組成:header(頭部)、payload(載荷)、signature(簽名),以.進行分割。(這個字符串原本是隻有一行的,此處分紅3行,只是爲了區分其結構)

header用來聲明類型(typ)和算法(alg)。
payload通常存放一些不敏感的信息,好比用戶名、權限、角色等。
signature則是將header和payload對應的json結構進行base64url編碼以後獲得的兩個串用英文句點號拼接起來,而後根據header裏面alg指定的簽名算法生成出來的。服務器

和Session的區別session

爲何咱們要把JWT和Session作對比呢?由於咱們主要在每一次請求的認證時會用JWT,在此以前咱們都是用Session的。那這二者的區別在哪兒呢?

自己的含義post

看了前面的介紹,咱們發現JWT這個字符串其實自己就包含了關於用戶的信息,好比用戶名、權限、角色等。

Session傳遞的sessionId雖然是一個更簡單的字符串,但它自己並無任何含義。編碼

因此通常說來JWT的字符串要比sessionId長,若是你在JWT中存儲的信息越長,那麼JWT自己也會越長。
 而Cookie的存儲容量是有限制的(一般爲4KB),因此你們在使用的時候須要注意。

解析方法
JWT的header和payload實際上是有json轉變過來的,而signature其實就是一個加密後的字符串,所以解析起來較爲簡單,不須要其餘輔助的內容。加密

sessionId是服務器存儲的用戶對象的標識,理論上須要一個額外的map才能找出當前用戶的信息。

管理方法
JWT理論上用於無狀態的請求,所以其用戶管理也只是依賴自己而已。咱們通常是在它的payload中加入過時時間,在不增長額外管理的狀況下,它只有自動過時的方式。
Session由於它本就是存儲在服務器端的,所以管理方案就有不少,並且大多都很成熟。

跨平臺
JWT自己就是基於json的,所以它是比較容易跨平臺的,能夠從官網下載不一樣平臺的包,解析便可。

session的跨平臺可能就不那麼好作了,須要考慮的地方在於用戶信息存儲的格式,ProtoBuf、json、xml等,管理的話可能就須要專門的統一登陸平臺,這個就不展開了。

時效性

無狀態JWT一旦被生成,就不會再和服務端有任何瓜葛。一旦服務端中的相關數據更新,無狀態JWT中存儲的數據因爲得不到更新,就變成了過時的數據。
 session就不同了,sessionId自己就沒有太多含義,只需修改服務端中存儲的數據便可。

適用場景
JWTJWT的最佳用途是一次性受權Token,這種場景下的Token的特性以下:
有效期短
只但願被使用一次
真實場景的例子——文件託管服務,由兩部分組成:
Web 應用:這是一個能夠被用戶登陸並維持狀態的應用,用戶在應用中挑選想要下載的文件。
文件下載服務:無狀態下載服務,只容許經過密鑰下載。
如何把JWT用在這個場景中呢?
用戶登陸到 Web 應用中,挑選好想要下載的文件,點擊下載。
認證服務頒發包含下載信息的、具備較短過時時間的JWT。JWT中包含的信息能夠是這樣的:
[Java] 純文本查看 複製代碼
?

{

"file": "/books/我這一生.pdf",
"exp": 1500719759621

}

使用 JWT 從文件下載服務下載文件。

SessionSession比較適用於Web應用的會話管理,其特色通常是:
權限多,若是用JWT則其長度會很長,頗有可能突破Cookie的存儲限制。
基本信息容易變更。若是是通常的後臺管理系統,確定會涉及到人員的變化,那麼其權限也會相應變化,若是使用JWT,那就須要服務器端進行主動失效,這樣就將本來無狀態的JWT變成有狀態,改變了其本意。

總結

咱們使用JWT,並非說看到它新就用,而應該考慮其適用場景,若是須要進行管理,能夠考慮使用Session,畢竟其方案更加成熟。

文章摘自:https://juejin.im/post/5d8054...

相關文章
相關標籤/搜索