回覆列表
-
1 # 網路圈
-
2 # 瘋狂架構師
不使用第三方儲存,且還要限制只能夠使用一次,這個使用場景有點苛刻,那通常就只能夠放在本地記憶體或本地硬碟了,這個對應用的可擴充套件性就有了較大的限制,除非特別有必要,這種方案不推薦。
不使用第三方儲存,且還要限制只能夠使用一次,這個使用場景有點苛刻,那通常就只能夠放在本地記憶體或本地硬碟了,這個對應用的可擴充套件性就有了較大的限制,除非特別有必要,這種方案不推薦。
對於一些安全性要求高的系統或者請求一些受保護的資源時,我們要進行鑑權,以判斷此次請求是否是被允許的,這裡我們就會用到Token機制。Token是由伺服器端簽發給客戶端的,出於效能開銷的考慮,一般情況下的Token在一段時間範圍內是可以反覆使用的,如果你想實現同個Token只能使用一次,也是有方案的。
Token工作流程大概是這樣:
呼叫方使用使用者名稱及密碼向伺服器端進行請求認證;
若伺服器端認證成功,則生成唯一的Token並返回給客戶端;
客戶端下次請求任何資源時都會把Token帶上,交給伺服器端進行許可權鑑證,以此來證明此次請求的合法性。
這種機制是不是和Session/Cookie很像?那為什麼要用Token呢?原因很簡單:
Token具有無狀態性,適用於分散式系統,可在多個服務間共享;
Token可避免CSRF攻擊;
Token能避開同源策略的限制等。
同個Token只能使用一次的實現方案1、藉助Redis來控制Key失效時間(實施成本低,推薦此方法)
2、Token重新簽發(存在效能問題)
一個Token原始資料(加密之前的資料)中應包含一個時間戳,當伺服器端拿到客戶端傳遞過來的Token時先判斷是否合法,若合法則解析Token,拿出裡面的資料,將時間戳改為當前,然後重新計算生成新的Token並返回給客戶端。
這種方法雖很安全,但考慮到RSA等加密也是要消耗CPU效能的,這塊需要綜合考慮。