Spring Security 之 Remember-Me (記住我)

貓毛·波拿巴發表於2018-07-08
效果在使用者的session(會話)過期或者瀏覽器關閉後,應用程式仍能記住它。使用者可選擇是否被記住。(在登入介面選擇)
 
“記住”是什麼意思?
    就是下次你再訪問的時候,直接進入系統,而不需要輸入使用者名稱密碼。
 
實現原理:使用一個remember-me cookie儲存在瀏覽器內,使用者通過該瀏覽器再次訪問網站的時候,網站識別出remember-me cookie,此使用者自動登入。
 
兩種方式:
①基於Token  => 依賴於“加密簽名”,即服務端根據引數生成一個Token進行對比
②基於持久化 => 依賴於資料儲存,即服務端將保留Token
 
一、基於Token的Remember-Me
Remember-me cookie : Base64編碼過的字串,儲存在瀏覽器內
包含以下資訊:
  • 使用者名稱
  • 過期時間
  • MD5Hash碼(token/signature) =>由過期時間、使用者名稱、密碼、<remember-me>元素祕鑰等欄位生成
注意:cookie中並不包含密碼,有包含就危險了,雖然MD5碼是由密碼欄位參與生成的,不過MD5是單向的,幾乎不可能被破解,況且又不是隻有密碼,還有其他欄位存在
 
Cookie都是不可靠的,如何應用於安全服務?
答:可以將cookie中的token和後臺生成的token進行對比,實行“校驗”操作
 
操作流程:
    ①使用者將Remeber-me cookie發到後臺,即包括使用者名稱,過期時間,token
    ②後臺通過使用者名稱獲取到對應密碼
    ③後臺利用使用者名稱、密碼、過期時間、<remember-me>元素的key這幾個欄位生成Token
    ④將生成的Token與Cookie中的Token進行對比
    ⑤如果Token相同,則使用者自動登入系統

 

 
為何安全?
答:因為如果不知道key和密碼基本不可能生成Token,其一,key只有此應用知道,寫死在配置檔案裡的,其二,密碼只有使用者本人知道。
 
絕對安全嗎?
答:不是的,按照上面的邏輯,只要token是對的,就能登入。這就有問題了,如果token不是本人在用呢?實際上token可能會被竊取。
想象這樣一種情況,有個惡意使用者通過網路嗅探,獲取到了某個使用者發請求時候帶上的token,然後他也在某天發請求的時候也帶上這個token,是不是就直接登入了呢?

 

 
那怎麼防止Token被人嗅探到呢?
答:利用SSL安全協議,即https,使用者和服務端的連線是安全的,收發的資訊不會被嗅探到。
 
二、基於Persistent(持久化)的Remember-Me
   
Remember-me cookie:
  • Series identifiers(序列化識別符號)=> 標識使用者初始化登入,不會改變
  • Token => 每次使用Remember-Me特性後,都會改變(每次自動登入都會改變Token)
 
與基於Token的Remember-Me有何不同?
    ①基於Token的Token是通過MD5生成。而基於Persistent的Token是直接根據從資料庫中取
    ②基於Token的Token(或者叫簽名)除非到達過期時間,或者使用者更改了密碼,否則不會過期。而基於Persistent的Token,是每次用完就過期了,後臺會生成新的Token儲存在資料庫供下次自動登入使用。
 

相關文章