在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  HTML/ 微服務(wù)中服務(wù)端是否需要對token進(jìn)行存儲

微服務(wù)中服務(wù)端是否需要對token進(jìn)行存儲

服務(wù)端生成 Token 后為什么要存儲?

從JWT官方文檔中我們了解到,JSON WEB TOKEN 由三部分組成:

  • Header
  • Payload
  • Signature

這里我們只說 Payload 中的保存內(nèi)容,引自JWT官方:

The second part of the token is the payload, which contains the claims. Claims are statements about an entity (typically, the user) and additional metadata. There are three types of claims: registered, public, and private claims.

從這里我們可以看出,tokenPayload 部分是具備存儲用戶ID,角色的能力的。也就是充分體現(xiàn)了 TOKEN 自解釋的特點。

既然這樣,我們?yōu)槭裁匆陬愃?Redis 這種緩存數(shù)據(jù)庫中對 Token 進(jìn)行持久化呢?完全可以由客戶端對 Token 持久化呀?

咨詢過朋友,大多數(shù)給我的回答是,訪問速度快,方便過期

那么我們假設(shè)如果不在后端存儲 Token,Payload 中的信息為:

{
  "id": "1234567890",
  "name": "John Doe",
  "admin": true
  "expire": 1527833009000
}

那么當(dāng)客戶端攜帶這個 token 訪問服務(wù)端的時候,服務(wù)端進(jìn)行兩步處理:

  1. Signature 部分進(jìn)行解密驗證,保證 token 沒有被篡改過。
  2. 解析 Payload 數(shù)據(jù),根據(jù)屬性 expire 來判斷是否過期

那么我們是否可以避免每次客戶端訪問的時候去 redis 中檢索 token 了呢?

現(xiàn)在大家在客戶端攜帶 token 訪問服務(wù)端的時候,是否每次都需要去 redis 中進(jìn)行驗證呢?

同樣在微服務(wù)的架構(gòu)設(shè)計中,對外提供服務(wù)的可能是一個API網(wǎng)關(guān),或者多個API網(wǎng)關(guān),那么我們的 Redis 必然安裝在一個獨立的物理機(jī)或者VM上,那么我們每次對token 進(jìn)行有效性檢查時,是否都是要連接遠(yuǎn)程的 Redis 服務(wù)器檢索數(shù)據(jù),然后驗證呢?

感謝大家!

回答
編輯回答
墨小白

JWT 是不需要存服務(wù)端的,我也很奇怪為什么有人會把token存服務(wù)端。而且即使存服務(wù)端,也應(yīng)該當(dāng)成密碼一樣加密存儲。不然數(shù)據(jù)庫被 hack 里,token 就都拿到了,不用密碼就可以冒充用戶發(fā)請求了。

2017年12月7日 16:55
編輯回答
涼心人

JWT的一大優(yōu)點就是不需要服務(wù)器端存儲,token是直接存儲在客戶端的,每次請求都帶上token,三段中的最后一段用于校驗token是否有變動,以防止客戶端惡意篡改。

當(dāng)然,最大的缺點來自于其優(yōu)點,token大小與攜帶數(shù)據(jù)成正比,所以推薦只在其中保存用戶唯一標(biāo)示,其余現(xiàn)查。

還有,樓上說的安全問題,中間人攻擊或者客戶端遭到攻擊,無論哪種認(rèn)證方式都無軟用。

2017年4月22日 14:14