隨着先後端分離愈來愈普及,傳統的基於cookie-session的鑑權方式已經不適用於先後端分離項目了。在鑑權方面,有許多的實現方式,這篇文章不是來對比和介紹各個鑑權方式的優缺點,而是來普及其中之一-JWT。html
更多文章,歡迎關注微信公衆號:深夜程猿。 算法
JWT是JSON Web Token的縮寫。 JSON Web Token(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊且獨立的方式,能夠在各方之間做爲JSON對象安全地傳輸信息。此信息能夠經過數字簽名進行驗證和信任。 JWT可使用加密算法(例如HMAC算法)或使用RSA或ECDSA的公鑰/私鑰對進行簽名。 雖然JWT能夠加密以在各方之間提供保密,但咱們將專一於簽名令牌。簽名令牌能夠驗證其中包含的聲明的完整性,而加密令牌則隱藏其餘方的聲明。當使用公鑰/私鑰對簽署令牌時,簽名還證實只有持有私鑰的一方是簽署私鑰的一方。數據庫
JWT由三部分組成,使用'.'號鏈接:後端
{ "alg": "HS256", "typ": "JWT" }
表示使用了HS256來生成簽名。Header部分會使用Base64Url編碼設置到JWT的第一部分。{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
複製代碼
Payload也會和Header同樣Base64Url編碼,放在JWT第二部分。
複製代碼
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
複製代碼
最後用'.'號把三個部分鏈接起來就完成了一個完整的JWT。跨域
這是使用JWT的最多見場景。一旦用戶登陸,每一個後續請求將包括JWT,容許用戶訪問該令牌容許的路由,服務和資源。 單點登陸是一種如今普遍使用JWT的功能,由於它的開銷很小,而且可以在不一樣的域中輕鬆使用安全
JSON Web Token是在各方之間安全傳輸信息的好方法。由於JWT能夠簽名 - 例如,使用公鑰/私鑰對 - 您能夠肯定發件人是他們所說的人。此外,因爲使用標頭和有效負載計算簽名,您還能夠驗證內容是否未被篡改。bash
在身份驗證中,當用戶使用其憑據成功登陸時,將返回JSON Web令牌。因爲令牌是憑證,所以必須很是當心以防止出現安全問題。通常狀況下,您不該該將令牌保留的時間超過要求。 每當用戶想要訪問受保護的路由或資源時,用戶代理應該使用承載模式發送JWT,一般在Authorization標頭中。標題的內容應以下所示:服務器
Authorization: Bearer <token>
複製代碼
在某些狀況下,這能夠是無狀態受權機制。服務器的受保護路由將在Authorization標頭中檢查有效的JWT,若是存在,則容許用戶訪問受保護的資源。若是JWT包含必要的數據,則能夠減小查詢數據庫以進行某些操做的須要,儘管可能並不是老是如此。 若是在Authorization標頭中發送令牌,則跨域資源共享(CORS)將不會成爲問題,由於它不使用cookie。 下圖顯示瞭如何獲取JWT並用於訪問API或資源: 微信
參考連接:Introduction to JSON Web Tokenscookie