什么是 JWT -- JSON WEB TOKEN

什么是JWT

Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基于JSON的開放標準((RFC 7519).該token被設計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。

起源

說起JWT,我們應該來談一談基于token的認證和傳統的session認證的區別。

傳統的session認證

我們知道,http協議本身是一種無狀態的協議,而這就意味著如果用戶向我們的應用提供了用戶名和密碼來進行用戶認證,那么下一次請求時,用戶還要再一次進行用戶認證才行,因為根據http協議,我們并不能知道是哪個用戶發出的請求,所以為了讓我們的應用能識別是哪個用戶發出的請求,我們只能在服務器存儲一份用戶登錄的信息,這份登錄信息會在響應時傳遞給瀏覽器,告訴其保存為cookie,以便下次請求時發送給我們的應用,這樣我們的應用就能識別請求來自哪個用戶了,這就是傳統的基于session認證。

但是這種基于session的認證使應用本身很難得到擴展,隨著不同客戶端用戶的增加,獨立的服務器已無法承載更多的用戶,而這時候基于session認證應用的問題就會暴露出來.

基于session認證所顯露的問題

Session: 每個用戶經過我們的應用認證之后,我們的應用都要在服務端做一次記錄,以方便用戶下次請求的鑒別,通常而言session都是保存在內存中,而隨著認證用戶的增多,服務端的開銷會明顯增大。

擴展性: 用戶認證之后,服務端做認證記錄,如果認證的記錄被保存在內存中的話,這意味著用戶下次請求還必須要請求在這臺服務器上,這樣才能拿到授權的資源,這樣在分布式的應用上,相應的限制了負載均衡器的能力。這也意味著限制了應用的擴展能力。

CSRF: 因為是基于cookie來進行用戶識別的, cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。

基于token的鑒權機制

基于token的鑒權機制類似于http協議也是無狀態的,它不需要在服務端去保留用戶的認證信息或者會話信息。這就意味著基于token認證機制的應用不需要去考慮用戶在哪一臺服務器登錄了,這就為應用的擴展提供了便利。

流程上是這樣的:

  • 用戶使用用戶名密碼來請求服務器
  • 服務器進行驗證用戶的信息
  • 服務器通過驗證發送給用戶一個token
  • 客戶端存儲token,并在每次請求時附送上這個token值
  • 服務端驗證token值,并返回數據

這個token必須要在每次請求時傳遞給服務端,它應該保存在請求頭里, 另外,服務端要支持CORS(跨來源資源共享)策略,一般我們在服務端這么做就可以了Access-Control-Allow-Origin: *

那么我們現在回到JWT的主題上。

JWT長什么樣?

JWT是由三段信息構成的,將這三段信息文本用.鏈接一起就構成了Jwt字符串。就像這樣:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

JWT的構成

第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload, 類似于飛機上承載的物品),第三部分是簽證(signature).

header

jwt的頭部承載兩部分信息:

  • 聲明類型,這里是jwt
  • 聲明加密的算法 通常直接使用 HMAC SHA256

完整的頭部就像下面這樣的JSON:

{'typ': 'JWT','alg': 'HS256'
}

然后將頭部進行base64加密(該加密是可以對稱解密的),構成了第一部分.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

playload

載荷就是存放有效信息的地方。這個名字像是特指飛機上承載的貨品,這些有效信息包含三個部分

  • 標準中注冊的聲明
  • 公共的聲明
  • 私有的聲明

標準中注冊的聲明 (建議但不強制使用) :

  • iss: jwt簽發者
  • sub: jwt所面向的用戶
  • aud: 接收jwt的一方
  • exp: jwt的過期時間,這個過期時間必須要大于簽發時間
  • nbf: 定義在什么時間之前,該jwt都是不可用的.
  • iat: jwt的簽發時間
  • jti: jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊。

公共的聲明
公共的聲明可以添加任何的信息,一般添加用戶的相關信息或其他業務需要的必要信息.但不建議添加敏感信息,因為該部分在客戶端可解密.

私有的聲明
私有聲明是提供者和消費者所共同定義的聲明,一般不建議存放敏感信息,因為base64是對稱解密的,意味著該部分信息可以歸類為明文信息。

定義一個payload:

{"sub": "1234567890","name": "John Doe","admin": true
}

然后將其進行base64加密,得到Jwt的第二部分。

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

signature

jwt的第三部分是一個簽證信息,這個簽證信息由三部分組成:

  • header (base64后的)
  • payload (base64后的)
  • secret

這個部分需要base64加密后的header和base64加密后的payload使用.連接組成的字符串,然后通過header中聲明的加密方式進行加鹽secret組合加密,然后就構成了jwt的第三部分。

// javascript
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);var signature = HMACSHA256(encodedString, 'secret'); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

將這三部分用.連接成一個完整的字符串,構成了最終的jwt:

  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

注意:secret是保存在服務器端的,jwt的簽發生成也是在服務器端的,secret就是用來進行jwt的簽發和jwt的驗證,所以,它就是你服務端的私鑰,在任何場景都不應該流露出去。一旦客戶端得知這個secret, 那就意味著客戶端是可以自我簽發jwt了。

如何應用

一般是在請求頭里加入Authorization,并加上Bearer標注:

fetch('api/user/1', {headers: {'Authorization': 'Bearer ' + token}
})

服務端會驗證token,如果驗證通過就會返回相應的資源。整個流程就是這樣的:

jwt-diagram

總結

優點

  • 因為json的通用性,所以JWT是可以進行跨語言支持的,像JAVA,JavaScript,NodeJS,PHP等很多語言都可以使用。
  • 因為有了payload部分,所以JWT可以在自身存儲一些其他業務邏輯所必要的非敏感信息。
  • 便于傳輸,jwt的構成非常簡單,字節占用很小,所以它是非常便于傳輸的。
  • 它不需要在服務端保存會話信息, 所以它易于應用的擴展

安全相關

  • 不應該在jwt的payload部分存放敏感信息,因為該部分是客戶端可解密的部分。
  • 保護好secret私鑰,該私鑰非常重要。
  • 如果可以,請使用https協議



作者:Dearmadman
鏈接:https://www.jianshu.com/p/576dbf44b2ae
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284641.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284641.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284641.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Re-installation failed due to different application signatures.

問題: 在虛擬設備上運行程序時提示安裝失敗。 [2010-08-08 00:38:30 - myApp] Re-installation failed due to different application signatures. [2010-08-08 00:38:30 - myApp] You must perform a full uninstall of the application. WARNING: This will remo…

【ArcGIS微課1000例】0024:ArcGIS如何連接文件夾、設認工作目錄、默認地理數據庫、相對路徑與絕對路徑?

ArcGIS軟件在初次安裝完成或者為了工作的方便,通常需要連接到指定的文件夾、設置默認工作路徑,默認地理數據庫、相對路徑與絕對路徑等。 文章目錄 1. 文件夾連接2. 默認工作目錄3. 默認地理數據庫4. 相對路徑與絕對路徑1. 文件夾連接 在初次安裝完ArcGIS時,默認沒有文件夾連…

shell 用環境變量的值修改properties文件

假設有如下屬性文件 demo.properties user.nametest user.password123456 ............................... 需求:先需要通過shell 腳本將 user.name 和 user.password 的value值替換為實際需要的用戶名和密碼, 將可以通過如下方式實現: sed …

【Spring Cloud】Redis緩存接入監控、運維平臺CacheCloud

CacheCloud CacheCloud提供一個Redis云管理平臺:實現多種類型(Redis Standalone、Redis Sentinel、Redis Cluster)自動部署、解決Redis實例碎片化現象、提供完善統計、監控、運維功能、減少運維成本和誤操作,提高機器的利用率,提供靈活的伸縮…

[Win10應用開發] 使用 Windows 推送服務 (WNS)

前言 Windows 推送服務(WNS)也是 Win10 通知機制中的一種,今天與大家一起學習一下有關WNS的相關知識。使用 Windows 推送服務的前提是你需要有一個微軟開發者賬號,這樣才能得到一些合法的密鑰信息用于與WNS服務器完成通訊操作。 …

Windows 11 新版 25158 推送!全新搜索框和圖標、小組件動態內容和通知標記

面向 Dev 頻道的 Windows 預覽體驗成員,微軟現已推送 Windows 11 預覽版 Build 25158。主要變化1.微軟宣布為 Windows 11 搜索引入全新視覺體驗,由搜索框或重新設計的搜索圖標呈現。目前該功能僅向部分 Windows 預覽體驗成員推出,將在未來向所…

Python之路【第一篇】:環境搭建

虛擬機安裝 下載VMwareWorkstation以及centos,安裝完VMwareWorkstation,創建一個虛擬機,然后在新創建的虛擬機上運行centos linux環境搭建 公司開發使用linux的原因:穩定、安全、開源 在虛擬機中使用centos這個版本,作為服務器端的…

【BIM入門實戰】Revit創建地形的幾種方法及優缺點

Revit在體量和場地選項卡的【地形表面】工具可以創建三維地形,有三種方法:放置點、指定點文件和導入實例文件、傾斜攝影點云技術和InfraWorks地形生成。 文章目錄 1. 放置點2. 指定點文件3. 導入實例文件4. 傾斜攝影點云技術5. InfraWorks地形生成1. 放置點 放置點功能位于體…

2024年起重機司機(限門式起重機)證考試題庫及起重機司機(限門式起重機)試題解析

題庫來源:安全生產模擬考試一點通公眾號小程序 2024年起重機司機(限門式起重機)證考試題庫及起重機司機(限門式起重機)試題解析是安全生產模擬考試一點通結合(安監局)特種作業人員操作證考試大綱和(質檢局)特種設備作…

微服務架構下的統一身份認證和授權

一、預備知識 本文討論基于微服務架構下的身份認證和用戶授權的技術方案,在閱讀之前,最好先熟悉并理解以下幾個知識點: 微服務架構相關概念:服務注冊、服務發現、API 網關身份認證和用戶授權:SSO、CAS、OAuth2.0、JW…

使用vh來制作高度自適應頁面和元素垂直居中

為什么80%的碼農都做不了架構師?>>> vh單位 vh是CSS3中的一個長度單位,其值為:100vh 視窗高度。即如果窗口高度為500px,那么 1vh 5px。具體的值會隨著瀏覽器視窗高度的改變而實時改變,因此可以利用這個單…

傳智168期JavaEE struts2杜宏 day32~day33(2017年2月15日23:27:09)

struts2學習完畢,寒假學習效率還不錯。 筆記鏈接 鏈接:http://pan.baidu.com/s/1boBJLVp 密碼:wwl4轉載于:https://www.cnblogs.com/huangtao1996/p/6403886.html

GitLab的安裝、配置、使用

前言上周去參與“中國數字經濟創新發展大會”了,然后又忙新項目的事情,博客又有一段時間沒有更新,今天周一事情比較少,立刻開始寫文,最近有挺多值得記錄的東西~進入正文,最近我們搭了個Gitlab,并…

【BIM入門實戰】Navisworks2018簡體中文安裝教程(附安裝包下載)

Navisworks是Autodesk公司開發的一款三維模型可視化軟件,它以輕量化的運行方式進行BIM成果的后期處理及整合,是一款非常實用的軟件。基于Navisworks,項目的參建方可以在施工前進行模擬施工,以達到減少返工、縮短工期、提供經濟效益的目的。 Navisworks同時支持4D和5D模擬,…

微軟 Windows11 Build 22000.71 更新(KB5004252)發布

微軟推出了一個全新的娛樂小工具。這一部件允許用戶查看 Microsoft Store 中可用的新電影和精選電影。選擇一部電影會引導用戶到 Microsoft Store 查看有關該影片的更多信息。 7 月 16 日消息 今日凌晨,微軟宣布向預覽體驗計劃用戶發布 Windows 11 Build22000.71 更…

Python入門教程之Python保留字符大全

Python中的保留字不能用作常數或變數,或任何其他標識符名稱。所有 Python 的關鍵字只包含小寫字母。 andexecnotassertfinallyorbreakforpassclassfromprintcontinueglobalraisedefifreturndelimporttryelifinwhileelseiswithexceptlambdayield轉載于:https://blog.…

Linux操作系統基礎解析之(五)——grep命令家族及正則表達式初識

grep號稱文本處理三劍客之一,雖然說是三劍客中功能最少也是最簡單的,但仍然不能小覷。 grep的全稱為:Global search REgular expression and Print out the line,即:全面查找正則表達式并將匹配的行顯示出來。 那么這…

Ubuntu16.04換源

Ubuntu16.04換源 轉載于:https://www.cnblogs.com/xielisen/p/6404607.html

【BIM入門實戰】Revit模型導入到第三方軟件方法匯總

本文以案例的方式,匯總展示了Revit模型導入到ArcGIS Pro、3ds max、Navisworks、Lumion、InfraWorks等的方法。 文章目錄 1. Revit導入ArcGIS Pro2. Revit導入3ds Max3. Revit導入Navisworks4. Revit導入Lumion5. Revit導入InfraWorks1. Revit導入ArcGIS Pro ArcGIS Pro2.8可…

Blazor University (37)JavaScript 互操作 —— JavaScript 啟動過程

原文鏈接:https://blazor-university.com/javascript-interop/javascript-boot-process/JavaScript 啟動過程在 Blazor 啟動過程中,瀏覽器將在 Blazor 初始化之前創建 HTML 文檔,這意味著從引導 HTML 引用的任何 JavaScript 都將立即加載&…