一、JWT簡介
JSON Web Token(JWT)是一個開放的標准(RFC 7519),它定義了一個緊湊且自包含的方式,用於在各方之間作為JSON對象安全地傳輸信息。由於此信息是經過數字簽名的,因此可以被驗證和信任。
更多信息可以查看官網:https://jwt.io/introduction/
二、JWT認證和session認證的區別
- session認證
http協議是一種無狀態的協議,而這就意味着如果用戶向我們的應用提供了用戶名和密碼來進行用戶認證,那么下一次請求時,用戶還要再一次進行用戶認證才行,因為根據http協議,我們並不能知道是哪個用戶發送的請求,所以為了讓我們的應用能識別是哪個用戶發出的,我們只能在服務器存儲一份用戶登陸的信息,這份登陸信息會在響應時傳遞給瀏覽器,告訴其保存為cookie,以便下次請求時發送給我們的應用,這樣我們的應用個就能識別請求來自哪個用戶了,這就是傳統的基於sessino認證。
- JWT認證
基於token的鑒權機制類似於http協議也是無狀態的,它不需要在服務端去保留用戶的認證信息或會話信息。這也就意味着JWT認證機制的應用不需要去考慮用戶在哪一台服務器登錄了,這就為應用的擴展提供了便利。
三、JWT認證流程
認證流程如下:
- 用戶使用賬號和密碼發出post請求;
- 服務器使用私鑰創建一個jwt;
- 服務器返回這個jwt給瀏覽器;
- 瀏覽器將該jwt串在請求頭中像服務器發送請求;
- 服務器驗證該jwt;
- 返回響應的資源給瀏覽器。
四、JWT組成
先來看一張JWT的信息的截圖:
從上圖可以看到,JWT含有三部分:頭部(header)、載荷(payload)、簽名(signature)。
- 頭部(header)
JWT的頭部有兩部分信息:
- 聲明類型,這里是JWT
- 聲明加密的算法,通常直接使用HMAC SHA256
頭部示例如下:
{
"alg": "HS256",
"typ": "JWT"
}
頭部一般使用base64加密,加密后密文:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
- 載荷(payload)
該部分一般存放一些有效的信息。JWT的標准定義包含五個字段:
- iss:該JWT的簽發者
- sub: 該JWT所面向的用戶
- aud: 接收該JWT的一方
- exp(expires): 什么時候過期,這里是一個Unix時間戳
- iat(issued at): 在什么時候簽發的
載荷示例如下:
{
"sub": "1234567890",
"name": "Java碎碎念",
"iat": 1516239022
}
- 簽名(signature)
前面兩部分都是使用Base64進行編碼的,即前端可以解開知道里面的信息。signature 需要使用編碼后的header和payload以及我們提供的一個密鑰,然后使用header中指定的簽名算法(HS256)進行簽名。簽名的作用是保證 JWT 沒有被篡改過。
三個部分通過.連接在一起就是我們的 JWT 了,所以我們生成的JWT如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphdmHnoo7noo7lv7UiLCJpYXQiOjE1MTYyMzkwMjJ9.LLJIkhJs6SVYlzn3n8fThQmhGutjTDI3RURTLtHV4ls
注意:密鑰就是用來進行JWT的簽發和JWT的驗證,所以,它就是你服務端的私鑰,在任何場景都不應該泄露出去。
五、JWT使用場景
JWT主要使用場景如下:
- 授權
這是JWT使用最多的場景,一旦用戶登錄,每個后續的請求將包括JWT,從而允許用戶訪問該令牌允許的路由、服務和資源。
- 信息交換:JSON
JWT可以用在各方之間安全地傳輸信息,因為JWT可以進行簽名,所以您可以確定發件人是他們所說的人。另外,由於簽名是使用標頭和有效負載計算的,因此您還可以驗證內容是否未被篡改。
到此JWT的基礎和認證原理已經講完了,下一篇文章將介紹下SpringBoot中整合JWT,敬請期待哦。
推薦閱讀
1.利用SpringBoot+Logback手寫一個簡單的鏈路追蹤
2.SpringBoot中如何優雅的讀取yml配置文件?
3.SpringBoot中如何靈活的實現接口數據的加解密功能?
4.SpringBoot中神奇的@Enable*注解?
5.Java中Integer.parseInt和Integer.valueOf,你還傻傻分不清嗎?
限時領取免費Java相關資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高並發分布式、大數據、機器學習等技術。
關注下方公眾號即可免費領取: