HTTP協議是無狀態的,無狀態意味着,服務器沒法給不一樣的客戶端響應不一樣的信息。這樣一些交互業務就沒法支撐了。Cookie應運而生。算法
經過F12開發者工具,先瞅瞅Cookie的顏值數據庫
從圖中能夠看到Cookie包括這些內容:Name,Value,Domain,Path,Expires / Max-Age,Size,HttpOnly,Secure,SameSite,Priority。json
Cookie的傳遞會經歷這4步安全
Cookie的英文翻譯是甜品,使用Cookie能夠自動填寫用戶名、記住密碼等,是給用戶的一點甜頭。服務器
Server拿到Cookie後,經過什麼信息才能判斷是哪一個Client呢?服務器的SessionID。cookie
若是把用戶名、密碼等重要隱私都存到客戶端的Cookie中,仍是有泄密風險。爲了更安全,把機密信息保存到服務器上,這就是Session。Session是服務器上維護的客戶檔案,能夠理解爲服務器端數據庫中有一張user表,裏面存放了客戶端的用戶信息。SessionID就是這張表的主鍵ID。session
Cookie中保存SessionID負載均衡
Session信息存到服務器,必然佔用內存。用戶多了之後,開銷必然增大。爲了提升效率,須要作分佈式,作負載均衡。由於認證的信息保存在內存中,用戶訪問哪臺服務器,下次還得訪問相同這臺服務器才能拿到受權信息,這就限制了負載均衡的能力。並且SeesionID存在Cookie,仍是有暴露的風險,好比CSRF(Cross-Site Request Forgery,跨站請求僞造)。分佈式
如何解決這些問題呢?基於Token令牌鑑權。工具
首先,Token不須要再存儲用戶信息,節約了內存。其次,因爲不存儲信息,客戶端訪問不一樣的服務器也能進行鑑權,加強了擴展能力。而後,Token能夠採用不一樣的加密方式進行簽名,提升了安全性。
Token就是一段字符串
Token傳遞的過程跟Cookie相似,只是傳遞對象變成了Token。用戶使用用戶名、密碼請求服務器後,服務器就生成Token,在響應中返給客戶端,客戶端再次請求時附帶上Token,服務器就用這個Token進行認證鑑權。
Token雖然很好的解決了Session的問題,但仍然不夠完美。服務器在認證Token的時候,仍然須要去數據庫查詢認證信息作校驗。爲了避免查庫,直接認證,JWT出現了。
JWT的英文全稱是JSON Web Token。JWT把全部信息都存在本身身上了,包括用戶名密碼、加密信息等,且以JSON對象存儲的。
JWT長相是xxxxx.yyyyy.zzzzz
,極具藝術感。包括三部份內容
Header
包括token類型和加密算法(HMAC SHA256 RSA)。
{ "alg": "HS256", "typ": "JWT" }
Payload
傳輸內容。
{ "sub": "1234567890", "name": "John Doe", "admin": true }
Signature
簽名,把header和payload用base64編碼後"."拼接,加鹽secret(服務器私鑰)。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
再畫個妝,漂亮
能夠到https://jwt.io/#debugger-io這個網址卸妝哦
給Token穿個外套
Authorization: Bearer <token>
這就是咱們在請求Header裏面看到的內容格式了。
JWT的技術細節我會寫在《Go測試開發(三) JWT認證》,歡迎關注。
本文簡單介紹了Cookie、Session、Token、JWT的概念,以及爲何須要這些技術。至於更深刻的原理和代碼使用,就請讀者自行研究了哦。至少這篇文章能讓你搞懂,看到不會以爲陌生了。哈哈哈。
參考資料
jwt-handbook-v0_14_1