相比於 session 認證的方式來說,使用 token 進行身份認證主要有下面三個優勢:
token 自身包含了身份驗證所需要的所有資訊,使得我們的伺服器不需要儲存 session 資訊,這顯然增加了系統的可用性和伸縮性,大大減輕了服務端的壓力。但是,也正是由於 token 的無狀態,也導致了它最大的缺點:當後端在token 有效期內廢棄乙個 token 或者更改它的許可權的話,不會立即生效,一般需要等到有效期過後才可以。另外,當使用者 logout 的話,token 也還有效。除非,我們在後端增加額外的處理邏輯。
**csrf(cross site request forgery)**一般被翻譯為 跨站請求偽造,屬於網路攻擊領域範圍。相比於 sql 指令碼注入、xss等等安全攻擊方式,csrf 的知名度並沒有它們高。但是,它的確是每個系統都要考慮的安全隱患,就連技術帝國 google 的 gmail 在早些年也被曝出過存在 csrf 漏洞,這給 gmail 的使用者造成了很大的損失。
那麼究竟什麼是 跨站請求偽造 呢?說簡單用你的身份去傳送一些對你不友好的請求。舉個簡單的例子:
小壯登入了某網上銀行,他來到了網上銀行的帖子區,看到乙個帖子下面有乙個鏈結寫著「科學理財,年盈利率過萬」,小壯好奇的點開了這個鏈結,結果發現自己的賬戶少了10000元。這是這麼回事呢?原來黑客在鏈結中藏了乙個請求,這個請求直接利用小壯的身份給銀行傳送了乙個轉賬請求,也就是通過你的 cookie 向銀行發出請求。
科學理財,年盈利率過萬
那為什麼 token 不會存在這種問題呢?
我是這樣理解的:一般情況下我們使用 jwt 的話,在我們登入成功獲得 token 之後,一般會選擇存放在 local storage 中。然後我們在前端通過某些方式會給每個發到後端的請求加上這個 token,這樣就不會出現 csrf 漏洞的問題。因為,即使有個你點選了非法鏈結傳送了請求到服務端,這個非法請求是不會攜帶 token 的,所以這個請求將是非法的。
但是這樣會存在 xss 攻擊中被盜的風險,為了避免 xss 攻擊,你可以選擇將 token 儲存在標記為httponly
的cookie 中。但是,這樣又導致了你必須自己提供csrf保護。
具體採用上面哪兩種方式儲存 token 呢,大部分情況下存放在 local storage 下都是最好的選擇,某些情況下可能需要存放在標記為httponly
的cookie 中會更好。
使用 session 進行身份認證的話,需要儲存乙份資訊在伺服器端,而且這種方式會依賴到 cookie(需要 cookie 儲存 sessionid),所以不適合移動端。
但是,使用 token 進行身份認證就不會存在這種問題,因為只要 token 可以被客戶端儲存就能夠使用,而且 token 還可以跨語言使用。
使用 session 進行身份認證的話,實現單點登入,需要我們把使用者的 session 資訊儲存在一台電腦上,並且還會遇到常見的 cookie 跨域的問題。但是,使用 token 進行認證的話, token 被儲存在客戶端,不會存在這些問題。
退出登入;
修改密碼;
服務端修改了某個使用者具有的許可權或者角色;
使用者的帳戶被刪除/暫停。
使用者由管理員登出;
這個問題不存在於 session 認證方式中,因為在 session 認證方式中,遇到這種情況的話服務端刪除對應的 session 記錄即可。但是,使用 token 認證的方式就不好解決了。我們也說過了,token 一旦派發出去,如果後端不增加其他邏輯的話,它在失效之前都是有效的。那麼,我們如何解決這個問題呢?查閱了很多資料,總結了下面幾種方案:
對於修改密碼後 token 還有效問題的解決還是比較容易的,說一種我覺得比較好的方式:使用使用者的密碼的雜湊值對 token 進行簽名。因此,如果密碼更改,則任何先前的令牌將自動無法驗證。
token 有效期一般都建議設定的不太長,那麼 token 過期後如何認證,如何實現動態重新整理 token,避免使用者經常需要重新登入?
我們先來看看在 session 認證中一般的做法:假如 session 的有效期30分鐘,如果 30 分鐘內使用者有訪問,就把 session 有效期被延長30分鐘。
類似於 session 認證中的做法:這種方案滿足於大部分場景。假設服務端給的 token 有效期設定為30分鐘,服務端每次進行校驗時,如果發現 token 的有效期馬上快過期了,服務端就重新生成 token 給客戶端。客戶端每次請求都檢查新舊token,如果不一致,則更新本地的token。這種做法的問題是僅僅在快過期的時候請求才會更新 token ,對客戶端不是很友好。
每次請求都返回新 token :這種方案的的思路很簡單,但是,很明顯,開銷會比較大。
token 有效期設定到半夜 :這種方案是一種折衷的方案,保證了大部分使用者白天可以正常登入,適用於對安全性要求不高的系統。
使用者登入返回兩個 token :第乙個是 acesstoken ,它的過期時間 token 本身的過期時間比如半個小時,另外乙個是 refreshtoken 它的過期時間更長一點比如為1天。客戶端登入後,將 accesstoken和refreshtoken 儲存在本地,每次訪問將 accesstoken 傳給服務端。服務端校驗 accesstoken 的有效性,如果過期的話,就將 refreshtoken 傳給服務端。如果有效,服務端就生成新的 accesstoken 給客戶端。否則,客戶端就重新登入即可。該方案的不足是:1⃣️需要客戶端來配合;2⃣️使用者登出的時候需要同時保證兩個 token 都無效;3⃣️重新請求獲取 token 的過程中會有短暫 token 不可用的情況(可以通過在客戶端設定定時器,當accesstoken 快過期的時候,提前去通過 refreshtoken 獲取新的accesstoken)。
jwt 最適合的場景是不需要服務端儲存使用者狀態的場景,比如如果考慮到 token 登出和 token 續簽的場景話,沒有特別好的解決方案,大部分解決方案都給 token 加上了狀態,這就有點類似 session 認證了。
索引優缺點分析
優點 1 建立唯一性索引,保證資料庫表中每一行資料的唯一性 2 大大加快表的檢索速度,是建立索引的主要原因 3 加速表與表之間的鏈結,特別是在實現資料的參照完整性方面特別有意義 4 在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間 5 使用索引,可以在查詢的過程中使用優化隱...
SSH框架優缺點分析
典型的j2ee三層結構,分為表現層 中間層 業務邏輯層 和資料服務層。三層體系將業務規則 資料訪問及合法性校驗等工作放在中間層處理。客戶端不直接與資料庫互動,而是通過元件與中間層建立連線,再由中間層與資料庫互動。表現層是傳統的jsp技術,自1999年問世以來,經過多年的發展,其廣泛的應用和穩定的表現...
儲存過程優缺點分析
儲存過程的優缺點 儲存過程優點 1.由於應用程式隨著時間推移會不斷更www.cppcns.com改,增刪功能,t sql過程 會變得更複雜,storedprocedure為封裝此 提供了乙個替換位置。2.執行計畫 儲存過程在首次執行時將被編譯,這將產生乙個執行計畫 實際上是 microsoft sq...