什麼是JWT
Json web token (JWT), 是爲了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標準(RFC 7519).該token被設計爲緊湊且安全的,特別適用於分佈式站點的單點登陸(SSO)場景。前端
JWT的聲明通常被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也能夠增長一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。java
JWT的構成python
第一部分咱們稱它爲頭部(header)web
第二部分咱們稱其爲載荷(payload)面試
第三部分是簽證(signature).算法
header:
jwt的頭部承載兩部分信息:json
聲明類型,這裏是jwt小程序
聲明加密的算法 一般直接使用 HMAC SHA256緩存
完整的頭部就像下面這樣的JSON:安全
而後將頭部進行base64加密(該加密是能夠對稱解密的),構成了第一部分.
playload:
載荷就是存放有效信息的地方。這個名字像是特指飛機上承載的貨品,這些有效信息包含三個部分
標準中註冊的聲明
公共的聲明
私有的聲明
標準中註冊的聲明 (建議但不強制使用) :
iss: jwt簽發者
sub: jwt所面向的用戶
aud: 接收jwt的一方
exp: jwt的過時時間,這個過時時間必需要大於簽發時間
nbf: 定義在什麼時間以前,該jwt都是不可用的.
iat: jwt的簽發時間
jti: jwt的惟一身份標識,主要用來做爲一次性token,從而回避重放攻擊。
公共的聲明 :
公共的聲明能夠添加任何的信息,通常添加用戶的相關信息或其餘業務須要的必要信息.但不建議添加敏感信息,由於該部分在客戶端可解密.
私有的聲明 :
私有聲明是提供者和消費者所共同定義的聲明,通常不建議存放敏感信息,由於base64是對稱解密的,意味着該部分信息能夠歸類爲明文信息。
定義一個payload:
而後將其進行base64加密,獲得Jwt的第二部分。
signature:
jwt的第三部分是一個簽證信息,這個簽證信息由三部分組成:
header (base64後的)
payload (base64後的)
secret
這個部分須要base64加密後的header和base64加密後的payload使用.
鏈接組成的字符串,而後經過header中聲明的加密方式進行加密 secret
組合加密,而後就構成了jwt的第三部分。
將這三部分用.
鏈接成一個完整的字符串,構成了最終的jwt:
注意:secret是保存在服務器端的,jwt的簽發生成也是在服務器端的,secret就是用來進行jwt的簽發和jwt的驗證,
因此,它就是你服務端的私鑰,在任何場景都不該該流露出去。一旦客戶端得知這個secret, 那就意味着客戶端是能夠自我簽發jwt了。
如何應用
在請求頭裏加入Authorization
,並加上Token
標註:
headers: { 'Authorization': 'Token' + token
服務端會驗證token,若是驗證經過就會返回相應的資源。整個流程就是這樣的:
總結
優勢
由於json的通用性,因此JWT是能夠進行跨語言支持的,像JAVA,JavaScript,NodeJS,PHP等不少語言均可以使用。
由於有了payload部分,因此JWT能夠在自身存儲一些其餘業務邏輯所必要的非敏感信息。
便於傳輸,jwt的構成很是簡單,字節佔用很小,因此它是很是便於傳輸的。
它不須要在服務端保存會話信息, 因此它易於應用的擴展
安全相關
不該該在jwt的payload部分存放敏感信息,由於該部分是客戶端可解密的部分。
保護好secret私鑰,該私鑰很是重要。
若是能夠,請使用https協議
在公衆號菜單中可自行獲取專屬架構視頻資料,包括不限於 java架構、python系列、人工智能系列、架構系列,以及最新面試、小程序、大前端均無私奉獻,你會感謝個人哈
往期熱門文章:
1,架構的本質:如何打造一個有序的系統?
2,
分佈式高可靠之負載均衡,今天看了你確定會
3,
分佈式數據之緩存技術,一塊兒來揭開其神祕面紗
4,分佈式數據複製技術,今天就教你真正分身術
5,
數據分佈方式之哈希與一致性哈希,我就是個神算子
6
,分佈式存儲系統三要素,掌握這些就離成功不遠了
7
,想要設計一個好的分佈式系統,必須搞定這個理論
8
,
分佈式通訊技術之發佈訂閱,乾貨滿滿
9,
分佈式通訊技術之遠程調用:RPC
10
,秒殺系統每秒上萬次下單請求,咱們該怎麼去設計
本文分享自微信公衆號 - 架構師修煉(jiagouxiulian)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。