1. 程式人生 > 其它 >淺析前後端分離架構下的API安全問題:JWT保證token不被盜用的方案(即如何防範Replay Attacks)

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

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

  (1)介面公開,誰都可以訪問;

  (2)資料請求的引數在傳輸過程被篡改;

  (3)介面被重複呼叫。

一、為什麼採用 Token

  詳細見之前這篇部落格吧:Nodejs-JWT token認證:為什麼要使用token、token組成(頭部、載荷、簽名)、jwt使用過程以及token對比session的好處(單點登入、減輕伺服器壓力、儲存資訊等

二、JWT如何保證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秒),允許請求,否則判定為重複攻擊