JWT(Json Web Token)實(shí)現(xiàn)token認(rèn)證 ~ 簡(jiǎn)介

作者: 修羅debug
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 by-sa 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。



一 、有狀態(tài)服務(wù)

在原來(lái)的單體系統(tǒng)中,有狀態(tài)服務(wù),即服務(wù)端需要記錄每次會(huì)話的客戶(hù)端信息,從而識(shí)別客戶(hù)端身份,根據(jù)用戶(hù)身份進(jìn)行請(qǐng)求的處理,session+cookie。在如今的大多數(shù)分布式系統(tǒng)中,暴露出很多缺點(diǎn)

  • 服務(wù)端保存大量數(shù)據(jù),增加服務(wù)端壓力
  • 服務(wù)端保存用戶(hù)狀態(tài),無(wú)法進(jìn)行水平擴(kuò)展
  • 客戶(hù)端請(qǐng)求依賴(lài)服務(wù)端,多次請(qǐng)求必須訪問(wèn)同一臺(tái)服務(wù)器

二 、無(wú)狀態(tài)服務(wù)

在分布式/微服務(wù)中,服務(wù)的無(wú)狀態(tài)性更加的重要,即:

  • 服務(wù)端不保存任何客戶(hù)端請(qǐng)求者信息
  • 客戶(hù)端的每次請(qǐng)求必須具備自描述信息,通過(guò)這些信息識(shí)別客戶(hù)端身份

帶來(lái)的好處是什么呢?

  • 客戶(hù)端請(qǐng)求不依賴(lài)服務(wù)端的信息,任何多次請(qǐng)求不需要必須訪問(wèn)到同一臺(tái)服務(wù)
  • 服務(wù)端的集群和狀態(tài)對(duì)客戶(hù)端透明
  • 服務(wù)端可以任意的遷移和伸縮
  • 減小服務(wù)端存儲(chǔ)壓力

在無(wú)狀態(tài)服務(wù)的整個(gè)登錄過(guò)程中,最關(guān)鍵的點(diǎn)是什么?

三、Token的安全性

token是識(shí)別客戶(hù)端身份的唯一標(biāo)示,如果加密不夠嚴(yán)密,被人偽造那就操蛋了,因此采用何種方式加密才是安全可靠的呢?我們將采用 JWT+某種加密算法

四、JWT(Json Web Token)

1、JWT,全稱(chēng)是Json Web Token, 是JSON風(fēng)格輕量級(jí)的授權(quán)和身份認(rèn)證規(guī)范,可實(shí)現(xiàn)無(wú)狀態(tài)、分布式的Web應(yīng)用授權(quán); JWT包含三部分?jǐn)?shù)據(jù):

  • Header:頭部,通常頭部有兩部分信息:

    • 聲明類(lèi)型,這里是JWT
    • 加密算法,自定義

    我們會(huì)對(duì)頭部進(jìn)行base64加密(可解密),得到第一部分?jǐn)?shù)據(jù)

  • Payload:載荷,就是有效數(shù)據(jù),一般包含下面信息:

    • 用戶(hù)身份信息(注意,這里因?yàn)椴捎胋ase64加密,可解密,因此不要存放敏感信息)
    • 注冊(cè)聲明:如token的簽發(fā)時(shí)間,過(guò)期時(shí)間,簽發(fā)人等

    這部分也會(huì)采用base64加密,得到第二部分?jǐn)?shù)據(jù)

  • Signature:簽名,是整個(gè)數(shù)據(jù)的認(rèn)證信息。一般根據(jù)前兩步的數(shù)據(jù),再加上服務(wù)的的密鑰(secret)(不要泄漏,最好周期性更換),通過(guò)加密算法生成。用于驗(yàn)證整個(gè)數(shù)據(jù)完整和可靠性

生成的數(shù)據(jù):a.b.c

2、JWT的交互流程:

(1)用戶(hù)登錄

(2)服務(wù)的認(rèn)證,通過(guò)后根據(jù)secret生成token

(3)將生成的token返回給瀏覽器

(4)用戶(hù)每次請(qǐng)求攜帶token

(5)服務(wù)端利用公鑰解讀jwt簽名,判斷簽名有效后,從Payload中獲取用戶(hù)信息

(6)處理請(qǐng)求,返回響應(yīng)結(jié)果