JWT(Json Web Token)實現token認證 ~ 簡介
作者:
修羅debug
版權聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處鏈接和本聲明。
一 、有狀態(tài)服務
在原來的單體系統(tǒng)中,有狀態(tài)服務,即服務端需要記錄每次會話的客戶端信息,從而識別客戶端身份,根據用戶身份進行請求的處理,session+cookie。在如今的大多數分布式系統(tǒng)中,暴露出很多缺點
- 服務端保存大量數據,增加服務端壓力
- 服務端保存用戶狀態(tài),無法進行水平擴展
- 客戶端請求依賴服務端,多次請求必須訪問同一臺服務器
二 、無狀態(tài)服務
在分布式/微服務中,服務的無狀態(tài)性更加的重要,即:
- 服務端不保存任何客戶端請求者信息
- 客戶端的每次請求必須具備自描述信息,通過這些信息識別客戶端身份
帶來的好處是什么呢?
- 客戶端請求不依賴服務端的信息,任何多次請求不需要必須訪問到同一臺服務
- 服務端的集群和狀態(tài)對客戶端透明
- 服務端可以任意的遷移和伸縮
- 減小服務端存儲壓力
在無狀態(tài)服務的整個登錄過程中,最關鍵的點是什么?
三、Token的安全性
token是識別客戶端身份的唯一標示,如果加密不夠嚴密,被人偽造那就操蛋了,因此采用何種方式加密才是安全可靠的呢?我們將采用 JWT+某種加密算法
四、JWT(Json Web Token)
1、JWT,全稱是Json Web Token, 是JSON風格輕量級的授權和身份認證規(guī)范,可實現無狀態(tài)、分布式的Web應用授權; JWT包含三部分數據:
Header:頭部,通常頭部有兩部分信息:
- 聲明類型,這里是JWT
- 加密算法,自定義
我們會對頭部進行base64加密(可解密),得到第一部分數據
Payload:載荷,就是有效數據,一般包含下面信息:
- 用戶身份信息(注意,這里因為采用base64加密,可解密,因此不要存放敏感信息)
- 注冊聲明:如token的簽發(fā)時間,過期時間,簽發(fā)人等
這部分也會采用base64加密,得到第二部分數據
Signature:簽名,是整個數據的認證信息。一般根據前兩步的數據,再加上服務的的密鑰(secret)(不要泄漏,最好周期性更換),通過加密算法生成。用于驗證整個數據完整和可靠性
生成的數據:a.b.c
(1)用戶登錄
(2)服務的認證,通過后根據secret生成token
(3)將生成的token返回給瀏覽器
(4)用戶每次請求攜帶token
(5)服務端利用公鑰解讀jwt簽名,判斷簽名有效后,從Payload中獲取用戶信息
(6)處理請求,返回響應結果