session传递参数_JWT与Session的比较
如今,越來越多的項目開始采用JWT作為認證授權機制,那么它和之前的Session究竟有什么區別呢?今天就讓我們來了解一下。
JWT是什么
定義
JSON Web Token(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊和自包含的方式,用于在各方之間作為JSON對象安全地傳輸信息。作為標準,它沒有提供技術實現,但是大部分的語言平臺都有按照它規定的內容提供了自己的技術實現,所以實際在用的時候,只要根據自己當前項目的技術平臺,到官網上選用合適的實現庫即可。
特點
使用JWT來傳輸數據,實際上傳輸的是一個字符串,這個字符串就是所謂的json web token字符串。所以廣義上,JWT是一個標準的名稱;狹義上,JWT指的就是用來傳遞的那個token字符串。這個串有兩個特點:
結構
它由三部分組成:header(頭部)、payload(載荷)、signature(簽名),以.進行分割。(這個字符串本來是只有一行的,此處分成3行,只是為了區分其結構)
和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用在這個場景中呢?
總結
以上是生活随笔為你收集整理的session传递参数_JWT与Session的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot profile_S
- 下一篇: ueditor如何设置上传图片的高度宽度