JWT token心得

token的組成 
token串的生成流程。 
token在客戶端與服務器端的交互流程 
Token的優勢和思考 
參考代碼:核心代碼使用參考,不是所有代碼算法

JWT token的組成

頭部(Header),格式以下: 

「typ」: 「JWT」, 
「alg」: 「HS256」 

由上可知,該token使用HS256加密算法,將頭部使用Base64編碼可獲得以下個格式的字符串:跨域

eyJhbGciOiJIUzI1NiJ9
  • 1

有效載荷(Playload): 

「iss」: 「Online JWT Builder」, 
「iat」: 1416797419, 
「exp」: 1448333419, 
……. 
「userid」:10001 

有效載荷中存放了token的簽發者(iss)、簽發時間(iat)、過時時間(exp)等以及一些咱們須要寫進token中的信息。有效載荷也使用Base64編碼獲得以下格式的字符串:服務器

eyJ1c2VyaWQiOjB9
  • 1

簽名(Signature): 
將Header和Playload拼接生成一個字符串str=「eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOjB9」,使用HS256算法和咱們提供的密鑰(secret,服務器本身提供的一個字符串)對str進行加密生成最終的JWT,即咱們須要的令牌(token),形如:str.」簽名字符串」。session

token在服務與客戶端的交互流程

1:客戶端經過用戶名和密碼登陸 
2:服務器驗證用戶名和密碼,若經過,生成token返回給客戶端。 
3:客戶端收到token後之後每次請求的時候都帶上這個token,至關於一個令牌,表示我有權限訪問了 
4:服務器接收(一般在攔截器中實現)到該token,而後驗證該token的合法性(爲何能驗證下面說)。若該token合法,則經過請求,若token不合法或者過時,返回請求失敗。ui

關於Token的思考

服務如何判斷這個token是否合法? 
由上面token的生成可知,token中的簽名是由Header和有效載荷經過Base64編碼生成再經過加密算法HS256和密鑰最終生成簽名,這個簽名位於JWT的尾部,在服務器端一樣對返回過來的JWT的前部分再進行一次簽名生成,而後比較此次生成的簽名與請求的JWT中的簽名是否一致,若一致說明token合法。因爲生成簽名的密鑰是服務器才知道的,因此別人難以僞造。編碼

token中能放敏感信息嗎? 
不能,由於有效載荷是通過Base64編碼生成的,並非加密。因此不能存放敏感信息。加密

Token的優勢

(1)相比於session,它無需保存在服務器,不佔用服務器內存開銷。 
(2)無狀態、可拓展性強:好比有3臺機器(A、B、C)組成服務器集羣,若session存在機器A上,session只能保存在其中一臺服務器,此時你便不能訪問機器B、C,由於B、C上沒有存放該Session,而使用token就可以驗證用戶請求合法性,而且我再加幾臺機器也沒事,因此可拓展性好就是這個意思。 
(3)由(2)知,這樣作可就支持了跨域訪問。code

相關文章
相關標籤/搜索