如今,越來越多的項目開始采用JWT
作為認證授權機制,那么它和之前的Session
究竟有什么區別呢?今天就讓我們來了解一下。
JWT
是什么
定義
JSON Web Token(JWT)是一個開放標准(RFC 7519),它定義了一種緊湊和自包含的方式,用於在各方之間作為JSON對象安全地傳輸信息。作為標准,它沒有提供技術實現,但是大部分的語言平台都有按照它規定的內容提供了自己的技術實現,所以實際在用的時候,只要根據自己當前項目的技術平台,到官網上選用合適的實現庫即可。
特點
使用JWT來傳輸數據,實際上傳輸的是一個字符串,這個字符串就是所謂的json web token字符串。所以廣義上,JWT是一個標准的名稱;狹義上,JWT指的就是用來傳遞的那個token字符串。這個串有兩個特點:
- 緊湊:指的是這個串很小,能通過url 參數,http 請求提交的數據以及http header的方式來傳遞;
- 自包含:這個串可以包含很多信息,比如用戶的id、角色等,別人拿到這個串,就能拿到這些關鍵的業務信息,從而避免再通過數據庫查詢等方式才能得到它們。
結構
它由三部分組成:header(頭部)、payload(載荷)、signature(簽名),以.
進行分割。(這個字符串本來是只有一行的,此處分成3行,只是為了區分其結構)
header
用來聲明類型(typ)和算法(alg)。payload
一般存放一些不敏感的信息,比如用戶名、權限、角色等。signature
則是將header
和payload
對應的json結構進行base64url編碼之后得到的兩個串用英文句點號拼接起來,然后根據header
里面alg指定的簽名算法生成出來的。
和Session
的區別
為什么我們要把JWT
和Session
做對比呢?因為我們主要在每一次請求的認證時會用JWT
,在此之前我們都是用Session
的。那這兩者的區別在哪兒呢?
本身的含義
看了前面的介紹,我們發現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本身就沒有太多含義,只需修改服務端中存儲的數據即可。
適用場景
JWT
JWT
的最佳用途是一次性授權Token
,這種場景下的Token的特性如下:
- 有效期短
- 只希望被使用一次
真實場景的例子——文件托管服務,由兩部分組成:
- Web 應用:這是一個可以被用戶登錄並維持狀態的應用,用戶在應用中挑選想要下載的文件。
- 文件下載服務:無狀態下載服務,只允許通過密鑰下載。
如何把JWT
用在這個場景中呢?
- 用戶登錄到 Web 應用中,挑選好想要下載的文件,點擊下載。
- 認證服務頒發包含下載信息的、具有較短過期時間的JWT。JWT中包含的信息可以是這樣的:
{
"file": "/books/我這一輩子.pdf",
"exp": 1500719759621
}
- 使用 JWT 從文件下載服務下載文件。
Session
Session
比較適用於Web應用的會話管理,其特點一般是:
- 權限多,如果用
JWT
則其長度會很長,很有可能突破Cookie的存儲限制。 - 基本信息容易變動。如果是一般的后台管理系統,肯定會涉及到人員的變化,那么其權限也會相應變化,如果使用
JWT
,那就需要服務器端進行主動失效,這樣就將原本無狀態的JWT
變成有狀態,改變了其本意。
總結
我們使用JWT
,並不是說看到它新就用,而應該考慮其適用場景,如果需要進行管理,可以考慮使用Session
,畢竟其方案更加成熟。如果大家有什么新發現想和作者探討的,歡迎在下方留言。
有興趣的話可以關注我的公眾號,說不定會有意外的驚喜。