一切免登錄的核心都是在客戶端保存登錄憑據。
一
由於 TCP 協議面向連接而非會話,想保持會話必須使用額外的功能,在服務器端與客戶端儲存憑據。
最簡單的思想是用 cookies 保存用戶名和密碼,服務器每次連接進行用數據庫中的原始內容比對驗證。
然而由於 cookies 中的內容明文傳遞,且可能從瀏覽器、文件系統泄漏。所以有人想到了將用戶名密碼加密的方案。
a. 保存密鑰加密的用戶名密碼,傳到服務器端解密驗證。
b. 保存哈希算法得到散列值,傳到服務器與原始數據的哈希結果比對。
以上兩種方案實質上都只是將登錄憑據從用戶名密碼變爲從用戶名密碼導出的數據,而對登錄憑據的保護並沒有增加,cookies 中的內容泄漏依舊可被用於任意登錄。
僅僅加密憑據只會使得憑據變爲加密後的結果。
必須在此基礎上增加難以僞造或複製的憑據。
UserAgent、IP Address 等都是常見的輔助登錄憑據。
將輔助登錄憑據與用戶名密碼一起加密/哈希可彌補上述方案的缺點,且服務器端不用爲特定會話保存額外數據。
然即便如此,假若此憑據被盜用依舊如密碼被盜般永久,如設備被盜,所以服務器端必須具備銷毀登錄憑據的能力。
方案:在登錄憑據中增加一項僞隨機數,保存於服務器端,如此只需更改服務器端保存的結果即可銷毀原有的登錄憑據。
此方案還可實現重新登錄則原有會話失效。
若需登錄狀態指定時間後超時,只需在憑據中增加首次登錄時間項。
二
有一個完善的登錄憑據管理機制則其它一切均輕而易舉。
好比 google.com 和 gmail,共用 cookies;google.com 和 youtube.com,使用跳轉、框架、img、腳本等方式將憑據傳遞過去,並保存 cookies 即可。
總之,一切免登錄的核心都是在客戶端保存登錄憑據。