前后端分離架構帶來的好處一搜一大堆,這里主要討論一下后端接口的安全問題。因為在分離的情況下,后端 api 是暴露在外網中的,常規的web項目無論如何前端都是要通過公網訪問到后台api的,帶來的隱患也有很多。比如:
(1)接口公開,誰都可以訪問;
(2)數據請求的參數在傳輸過程被篡改;
(3)接口被重復調用。
一、為什么采用 Token
二、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秒),允許請求,否則判定為重復攻擊