淺析前后端分離架構下的API安全問題:JWT保證token不被盜用的方案(即如何防范Replay Attacks)


  前后端分離架構帶來的好處一搜一大堆,這里主要討論一下后端接口的安全問題。因為在分離的情況下,后端 api 是暴露在外網中的,常規的web項目無論如何前端都是要通過公網訪問到后台api的,帶來的隱患也有很多。比如:

  (1)接口公開,誰都可以訪問;

  (2)數據請求的參數在傳輸過程被篡改;

  (3)接口被重復調用。

一、為什么采用 Token

  token就像一把鑰匙,只要有了這把鑰匙就可以把家里的東西往外搬,但萬一token在客戶端或者在傳輸過程中被截取了怎么辦?做到如下可以降低 token 被盜風險。

1、在存儲的時候把 token 進行對稱加密存儲,用時解開。

  加密后的 token 被其他人得到以后,需要使用密鑰進行解密后才能使用,其他人無法得到密鑰就不能得到正確的 token。

2、將請求 URL、時間戳、token 三者進行合並加鹽簽名,服務端校驗有效性。

  最好結合1,2兩種方式一起使用,token進行加密處理,將請求 URL、時間戳、加密后的token,三者進行合並加鹽簽名,因為鹽值是保密的,所以其他人只是得到token的話,無法進行正確的簽名,后端驗證請求的簽名值來判斷請求是否有效。

3、驗證 token 對應的 IP 地址或者移動端的設備id

  每次請求可以將token和請求的對應的ip地址或設備id保存起來,放到數據庫或者redis緩存中,如果后面請求token對應的ip地址或設備id不一樣,則視為非法請求

4、如何防范Replay Attacks

  token 解決了篡改數據的問題,還有第3個問題,那就是攻擊者不修改數據,只是重復攻擊。

  所謂重復攻擊就是攻擊者發送一個后端服務器已接收過的包,來達到攻擊系統的目的。比如在瀏覽器端通過用戶名/密碼驗證獲得簽名的Token被木馬竊取。即使用戶登出了系統,黑客還是可以利用竊取的Token模擬正常請求,而服務器端對此完全不知道,因為JWT機制是無狀態的。

  那么如何解決呢?可以在Payload里增加時間戳,並且前后端都參與來解決:

(1)前端生成token時,在payload里增加當前時間戳;

(2)后端接收后,對解析出來的時間戳和當前時間進行判斷,

(3)如果相差特定時間內(比如5秒),允許請求,否則判定為重復攻擊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM