最近在做公司的認證系統,總結了如下一番心得。
傳統的認證方式一般采用cookie/session來實現,這是我們的出發點。
1.為什么選用token而不選用cookie/session?
本質上token和cookie/session都是字符串,然而token是自帶加密算法和用戶信息(比如用戶id),;而cookie本身不包含用戶信息,它指向的是服務器上用戶的 session,而由session保存用戶信息。這點差別,決定token可以很容易的跨服務器,只要不同服務器實現相同解密算法即可;而cookie/session是存在於某一台服務器上,
要實現跨服務器比較困難,這是任何基於cookie/session應用天生的短板。
2.token需要過期時間嗎?
token即是獲取受保護資源的憑證,當然必須有過期時間。否則一次登錄便可永久使用,認證功能就失去了其意義。非但必須有個過期時間,而且過期時間還不能太長,
參考各個主流網站的token過期時間,一般不超過1h.
3.token過期該怎么辦?
token過期,就要重新獲取。那么重新獲取有兩種方式,一是重復第一次獲取token的過程(比如登錄,掃描授權等),這樣做的缺點是用戶體驗不好,每一小時強制登錄一次幾乎是無法忍受的。那么還剩第二種方法,那就是主動去刷新token. 主動刷新token的憑證是refresh token,也是加密字符串,並且和token是相關聯的。相比獲取各種資源的token,refresh token的作用僅僅是獲取新的token,因此其作用和安全性要求都大為降低,所以其過期時間也可以設置得長一些。
4.refresh token需要過期時間么?
客戶端需要保存token和refresh token,以便下一次訪問能繼續。如果客戶端是瀏覽器,那么兩個token都需要設置過期時間;但是可以設置得長一點,可以以天為單位(例如7天、15天);如果客戶端是一個服務器,那么refresh token可以永久有效,直到下一次登錄,refresh token本身被更新為止。
以上幾個問題是層層遞進的,雖說如此,也無法從邏輯上/理論上保證認證系統的絕對安全。但是,我覺得任何一種認證方式,都不能做到邏輯上的絕對安全和毫無漏洞。但是如果給攻擊者造成了足夠的麻煩,使其破解成本大大提升,那么我們就認為認證系統足夠安全了。認證功能最后的落地實現,總是和現實想妥協的結果。