鍍金池/ 問答/Java  HTML/ 微服務中服務端是否需要對token進行存儲

微服務中服務端是否需要對token進行存儲

服務端生成 Token 后為什么要存儲?

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

  • Header
  • Payload
  • Signature

這里我們只說 Payload 中的保存內容,引自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 進行持久化呢?完全可以由客戶端對 Token 持久化呀?

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

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

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

那么當客戶端攜帶這個 token 訪問服務端的時候,服務端進行兩步處理:

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

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

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

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

感謝大家!

回答
編輯回答
墨小白

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

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

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

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

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

2017年4月22日 14:14