2017-03-08 46 views
2

這是關於網絡會話管理的一般問題。 管理會話超時的最佳實踐方法是什麼?何時無效會話

假設系統用戶登錄,在服務器上創建會話,並將令牌標識符發送回客戶端(通過httpOnly cookie)。

如果用戶嘗試一些基於訪問的檢查,其中會話驗證,想必是有意義的更新在DB會話的到期時間。這是否也意味着當發生這種情況時,我們應該更新會話令牌cookie上的到期時間以匹配?

這似乎是對我來說最明顯的解決方案,但不斷重寫cookie似乎有很多開銷。

對於最佳實踐方法的任何深入瞭解都非常感謝。謝謝!

回答

1

如何管理會話超時,以防止意外註銷保持用戶登錄,阻止他/她?

爲了讓用戶登錄,沒有必要不斷地重寫的cookie。您只需要將會話令牌cookie過期爲Session,然後只要瀏覽器處於打開狀態(客戶端繼續使用您的站點),會話令牌cookie就有效。服務器不需要知道會話過期時間(因爲沒有預定義的會話過期時間),沒有提到將其存儲在數據庫中。用戶關閉瀏覽器後,會話令牌cookie被清除,會話被終止(無效)。

通常,服務器會有一個「會話超時」設置,例如Struts2中的session-timeout,如果客戶端在一段時間後沒有提出任何請求,則會終止會話。

如何使會話「驗證」,即使用戶關閉瀏覽器?那就是如何實現「記住我一週」的功能?

爲了實現該特徵,新的令牌cookie被使用(例如RememberMeToken)。當用戶登錄成功時(可能啓用用戶界面上的「記住我」複選框),服務器將生成一個唯一的隨機令牌並將其存儲在數據庫中(由於安全原因連同其過期時間),使其屬於用戶帳戶。這個Cookie的到期時間很長(例如1周),並且會與登錄響應一起發送回瀏覽器。

當用戶關閉瀏覽器並在稍後重新訪問該網站(或用戶處於非活動狀態時間長,會在服務器端被殺),服務器將檢查會話令牌cookie,並發現它缺少/無效。此時,將檢查RememberMeToken並與存儲在DB中的令牌進行比較,如果匹配,則服務器將爲相應用戶進行自動登錄操作,並將生成的會話令牌cookie返回給瀏覽器。這一切都發生在後端,客戶端用戶不會感覺到任何東西。

用戶啓用用戶界面和登錄的「記住我」複選框後,1周後,RememberMeToken cookie已過期,如果用戶打開瀏覽器並訪問該站點,則需要重新登錄。

+0

如果你沒有在服務器上存儲會話令牌id(你的第一個例子),你如何檢查它是否有效,而不僅僅是某人已經組成? – Askanison4

+0

會話令牌標識本身存儲在服務器上(在內存或數據庫中),但不存儲會話令牌標識的到期時間。 – shaochuancs

+0

這不是一個永遠有效的會話標識符嗎?如果 - 不知何故 - 令牌id被某個第三方檢索到,他們是否可以在他們想要的時候使用該ID?即使令牌cookie會失效? – Askanison4