徹底搞懂JWT,看這篇就夠了!
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質文章,第一時間送達
? 作者?|??聖潔?
來源 |? urlify.cn/FNN7Ff
什么是JWT
Json web token (JWT), 是為了在網(wǎng)絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準(RFC 7519).該token被設計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。
JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也可以增加一些額外的其它業(yè)務邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。
JWT的構成
第一部分我們稱它為頭部(header)
第二部分我們稱其為載荷(payload)
第三部分是簽證(signature).
header:
jwt的頭部承載兩部分信息:
聲明類型,這里是jwt
聲明加密的算法 通常直接使用 HMAC SHA256
完整的頭部就像下面這樣的JSON:

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

playload:
載荷就是存放有效信息的地方。這個名字像是特指飛機上承載的貨品,這些有效信息包含三個部分
標準中注冊的聲明
公共的聲明
私有的聲明
標準中注冊的聲明?(建議但不強制使用) :
iss: jwt簽發(fā)者
sub: jwt所面向的用戶
aud: 接收jwt的一方
exp: jwt的過期時間,這個過期時間必須要大于簽發(fā)時間
nbf: 定義在什么時間之前,該jwt都是不可用的.
iat: jwt的簽發(fā)時間
jti: jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊。
公共的聲明?:
公共的聲明可以添加任何的信息,一般添加用戶的相關信息或其他業(yè)務需要的必要信息.但不建議添加敏感信息,因為該部分在客戶端可解密.
私有的聲明?:
私有聲明是提供者和消費者所共同定義的聲明,一般不建議存放敏感信息,因為base64是對稱解密的,意味著該部分信息可以歸類為明文信息。
定義一個payload:

然后將其進行base64加密,得到Jwt的第二部分。
![]()
?signature:
jwt的第三部分是一個簽證信息,這個簽證信息由三部分組成:
header (base64后的)
payload (base64后的)
secret
這個部分需要base64加密后的header和base64加密后的payload使用.連接組成的字符串,然后通過header中聲明的加密方式進行加密?secret組合加密,然后就構成了jwt的第三部分。
![]()
將這三部分用.連接成一個完整的字符串,構成了最終的jwt:

注意:secret是保存在服務器端的,jwt的簽發(fā)生成也是在服務器端的,secret就是用來進行jwt的簽發(fā)和jwt的驗證,
所以,它就是你服務端的私鑰,在任何場景都不應該流露出去。一旦客戶端得知這個secret, 那就意味著客戶端是可以自我簽發(fā)jwt了。
?
如何應用
在請求頭里加入Authorization,并加上Token標注:
headers:?{?'Authorization':?'Token'?+?token??服務端會驗證token,如果驗證通過就會返回相應的資源。整個流程就是這樣的:
?
總結
優(yōu)點
因為json的通用性,所以JWT是可以進行跨語言支持的,像JAVA,JavaScript,NodeJS,PHP等很多語言都可以使用。
因為有了payload部分,所以JWT可以在自身存儲一些其他業(yè)務邏輯所必要的非敏感信息。
便于傳輸,jwt的構成非常簡單,字節(jié)占用很小,所以它是非常便于傳輸?shù)摹?/span>
它不需要在服務端保存會話信息, 所以它易于應用的擴展
安全相關
不應該在jwt的payload部分存放敏感信息,因為該部分是客戶端可解密的部分。
保護好secret私鑰,該私鑰非常重要。
如果可以,請使用https協(xié)議
粉絲福利:108本java從入門到大神精選電子書領取
???
?長按上方鋒哥微信二維碼?2 秒 備注「1234」即可獲取資料以及 可以進入java1234官方微信群
感謝點贊支持下哈?
