JWT的含義 Json web token(JWT),是為了在網路應用環境間傳遞聲明而執行的一種基於JSON的開放標準(RFC 7519),該token被設計為緊湊且安全的,特別適用於分散式站點的單點登錄(sso)場景,JWT的聲明一般被用來在身份提供者和服務者間傳遞被認證的用戶身份信息,以便於從資 ...
基於redis的認證方式分析
redis解決簡訊驗證碼時效性,以及使用token的方式判斷是否登錄的問題。(沒用jwt)
這裡面使用兩個攔截器的方式解決:1. 給token有效期刷新 2.判斷用戶是否已登錄
目前驗證用戶是否已登錄,仍然是用到redis和服務端程式去判斷,這個和使用session的判斷方式有點相似,因為也會用到服務端資源。
但是token與session還是有非常大的不同,認證通過後,(認證信息)session都是保存在記憶體中(服務端伺服器中)占記憶體,如果是分散式的架構,那麼也會影響性能。
而對於token的方式,認證通過後,(認證信息)token都是保存在redis中的,即使是分散式系統,對於該token都能拿到。也就實現了單點登錄 就是在多個系統中,用戶只需一次登錄,各個系統即可感知該用戶已經登錄。
且能控制用戶登錄狀態的。
jwt分析
頭部,載體,簽名
服務端根據秘鑰信息,生成jwt(token),將token作為數據返回,然後用戶每次請求過來都在請求頭攜帶該token。
如果用戶攜帶token過來,服務端會用秘鑰去解析該token,看是否通過。如果通過則代表該用戶已登錄。
key-value : token-userInfo 存入redis中
可以控制該token的有效期(也就是用戶登錄的有效期),且能夠將用戶的一些信息保存到redis中
用戶請求到達服務端,服務端根據秘鑰再簽發一個jwt(token),與用戶攜帶的token作比較,如果一致,則再去操作redis
security認證授權分析
認證流程:
調用框架方法,重寫登錄認證邏輯,JWT的載體可以存東西
將token返回給用戶,讓他每次訪問都攜帶過來。
而解析token能得到它裡面的載體,包含key的信息,能根據這個條件去redis中查找用戶是否已經登錄已經他的許可權信息。
要讓用戶註銷,那麼就刪除redis中的對應k-v,那麼如果它再想請求需要登錄才能訪問的介面,會被jwt攔截器給攔截住。
每次用戶訪問需要登錄才能訪問的介面時,都會走jwt攔截器這麼一個流程。
網上看到的解決方案,就是將許可權信息也放在jwt的載體中,而不是redis的v中。這樣符合邏輯嗎?
答:不行。1.此時的放redis中起到一個單點登錄,且能做登錄超時下線的功能,能夠控制用戶的狀態。只使用jwt的話,是無法控制用戶登錄狀態的。
如果需要給這個方案加一個token刷新機制呢?
加一個過濾器,攔截所有請求,且在jwt過濾器之前執行。實質上就是刷新該用戶對應於redis中的key。
如果請求頭中沒有攜帶token => 直接放行
如果攜帶了 => 那麼jwt解析token => 去redis中操作 => 判斷該key是否過期
=> 是,放行
=>否,更新token有效期
再次回顧了security的知識,三更的那個jwt過濾器是必要的,這種方式和session的方式還是具有區別。
- 對於session的方式,(認證信息)session都是保存在記憶體中(服務端伺服器中)占記憶體
- 對於token的方式,認證通過後,(認證信息)token都是保存在redis中的
- 且重新整合加入了token刷新機制