token的組成
token串的生成流程。
token在客戶端與服務器端的交互流程
Token的優勢和思考
參考代碼:核心代碼使用參考,不是所有代碼算法
頭部(Header),格式以下:
{
「typ」: 「JWT」,
「alg」: 「HS256」
}
由上可知,該token使用HS256加密算法,將頭部使用Base64編碼可獲得以下個格式的字符串:跨域
eyJhbGciOiJIUzI1NiJ9
有效載荷(Playload):
{
「iss」: 「Online JWT Builder」,
「iat」: 1416797419,
「exp」: 1448333419,
…….
「userid」:10001
}
有效載荷中存放了token的簽發者(iss)、簽發時間(iat)、過時時間(exp)等以及一些咱們須要寫進token中的信息。有效載荷也使用Base64編碼獲得以下格式的字符串:服務器
eyJ1c2VyaWQiOjB9
簽名(Signature):
將Header和Playload拼接生成一個字符串str=「eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOjB9」,使用HS256算法和咱們提供的密鑰(secret,服務器本身提供的一個字符串)對str進行加密生成最終的JWT,即咱們須要的令牌(token),形如:str.」簽名字符串」。session
1:客戶端經過用戶名和密碼登陸
2:服務器驗證用戶名和密碼,若經過,生成token返回給客戶端。
3:客戶端收到token後之後每次請求的時候都帶上這個token,至關於一個令牌,表示我有權限訪問了
4:服務器接收(一般在攔截器中實現)到該token,而後驗證該token的合法性(爲何能驗證下面說)。若該token合法,則經過請求,若token不合法或者過時,返回請求失敗。ui
服務如何判斷這個token是否合法?
由上面token的生成可知,token中的簽名是由Header和有效載荷經過Base64編碼生成再經過加密算法HS256和密鑰最終生成簽名,這個簽名位於JWT的尾部,在服務器端一樣對返回過來的JWT的前部分再進行一次簽名生成,而後比較此次生成的簽名與請求的JWT中的簽名是否一致,若一致說明token合法。因爲生成簽名的密鑰是服務器才知道的,因此別人難以僞造。編碼
token中能放敏感信息嗎?
不能,由於有效載荷是通過Base64編碼生成的,並非加密。因此不能存放敏感信息。加密
(1)相比於session,它無需保存在服務器,不佔用服務器內存開銷。
(2)無狀態、可拓展性強:好比有3臺機器(A、B、C)組成服務器集羣,若session存在機器A上,session只能保存在其中一臺服務器,此時你便不能訪問機器B、C,由於B、C上沒有存放該Session,而使用token就可以驗證用戶請求合法性,而且我再加幾臺機器也沒事,因此可拓展性好就是這個意思。
(3)由(2)知,這樣作可就支持了跨域訪問。code