帶你瞭解JWT
什麼是JWT
JWT就是Json web token ,JWT是一種基於Json的開放標準(RFC 7519)。
是爲了在網絡應用環境中傳遞而聲明的標準
定義了一種緊湊安全的JSON對象,且存在數字簽名,是安全的
是一種用於通信雙方之間傳遞安全信息的簡潔的、URL安全的表述性聲明規範,經常用在跨域身份驗證。
認證方式
在JWT之前,我們用過Sssion來進行認證,也使用過Token認證。那麼這兩種認證是怎麼來實現的呢?
我們都是知道,在http協議是一種無狀態的協議,所以當用戶提供登錄信息進行登錄認證後,第二次在進行請求時,用戶必須再次進行認證纔行,因爲http是無狀態的,所以不知道用戶的請求。
Session認證
所以爲了知道用戶的請求,我們必須在服務器存儲一份用戶的信息,這個用戶信息在響應時會返回給瀏覽器,讓其存入cookie中,下次請求帶上,服務器就知道是那個用戶的請求了,這就是session認證。
每個用戶在認證後,都會在服務端做一次記錄,通常session都是保存在內存中,所以用戶增加時,服務器的開銷也意味着增大。
而用戶認證後,服務段做了記錄,如果記錄在內存中存儲,就意味用戶下次請求也必須在這臺服務器上纔可以拿到認證信息,如果在分佈式應用中,會限制負載均衡,也就限制了應用的擴展能力。
Token認證
token也是無狀態的,他是再認證之後生成一份token,這份token保留字在用戶手中,當用戶需要認真的時候,將token給予服務器,服務器來驗證這個tokn,來檢查token是否合法。
JWT認證
JWT簡述
客戶端在認證後,服務器會生成帶有簽名的JWT數據,返回給客戶端,客戶端將JWT數據保留起來,在以後的請求中將JWT數據和請求內容一起發給服務器,服務器對JWT數據進行驗證,驗證不通過則不返回數據。JWT在服務端不會保存任何信息。服務容易擴展
JWT構成
JWT由三部分構成,它們之間用圓點(.)連接。分別是:
-
Header(頭部)
-
Payload(載荷)
-
Signature(簽證)
第一部分我們稱它爲頭部(header) 第二部分我們稱其爲載荷(payload,類似貨車上承載的貨物) 第三部分是簽證(signature) 因此標準格式就是: hhhhhh.pppppppp.ssssss
頭部(Header)
頭部是對JWT基本信息的描述。由兩個經典部分組成,一個是類型,一個是簽名算法(HMAC SHA256或者RSA等等)。
例如:
{
‘alg’: “HS256”,
‘typ’: “JWT”
}
然後將頭部的Json進行base64加密(該加密是可以對稱解密的),構成了第一部分.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 (加密後的值)
載荷(playload)
playload是JWT的第二部分,它存放了有效的信息,這些信息也是由三部分構成
- 標準中註冊的聲明
- 公共的聲明
- 私有的聲明
標準中註冊的聲明 (建議但不強制使用)
- iss: jwt簽發者
- sub: jwt所面向的用戶
- aud: 接收jwt的一方
- exp: jwt的過期時間,這個過期時間必須要大於簽發時間
- nbf: 定義在什麼時間之前,該jwt都是不可用的.
- iat: jwt的簽發時間
- jti: jwt的唯一身份標識,主要用來作爲一次性token,從而回避重放攻擊。
公共的聲明
公共的聲明可以添加任何的信息,一般添加用戶的相關信息或其他業務需要的必要信息.但不建議添加敏感信息,因爲該部分在客戶端可解密.
私有的聲明
私有聲明是提供者和消費者所共同定義的聲明,一般不建議存放敏感信息,因爲base64是對稱解密的,意味着該部分信息可以歸類爲明文信息。
playload例如:
{
“sub”: ‘123456789’,
“name”: ‘test’,
“admin”:true
}
然後將其進行base64加密,得到Jwt的第二部分。
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
簽證(signature)
JWT的第三部分是一個簽證信息,信息由三個部分組成,header (base64後的),payload (base64後的),secret(鹽值),爲了得到簽名部分,你必須有編碼後的header、payload、鹽值,header中指定的算法,然對它們簽名即可。