HTTP 的無狀態
HTTP協議是無狀態的,這與HTTP協議本來的目的是相符的,客戶端只需要簡單的向服務器請求下載某些文件,無論是客戶端還是服務器都沒有必要紀錄彼此過去的行為,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關系一樣。 但是如果能夠提供一些按需生成的動態信息會使web變得更加有用,就萌發了cookie 和session 等客戶端與服務器之間保持狀態的解決方案。
Session -- 創建,保存在服務器中的會話
- 當用戶打開某個web應用時,便與web服務器產生一個session。服務器使用session把用戶的信息臨時保存在了服務器上, 存放于內存。
- session是由服務器創建的,跟瀏覽器沒有半毛錢關系,瀏覽器只是拿到一個session 的 ID。
- session是消耗服務器內存的,所以要合理使用session。
缺陷:如果web服務器做了負載均衡,那么下一個操作請求到了另一臺服務器的時候session會丟失。
Cookie -- 服務器上生成,保存于客戶端
- cookie由服務器生成,發送給瀏覽器,瀏覽器把cookie以kv形式保存到某個目錄下的文本文件內,下一次請求同一網站時會把該cookie發送給服務器。
- 一個cookie的設置以及發送過程分為以下四步:
客戶端發送一個http請求到服務器端
服務器端發送一個http響應到客戶端,其中包含Set-Cookie頭部
客戶端發送一個http請求到服務器端,其中包含Cookie頭部
服務器端發送一個http響應到客戶端 - 局限:由于cookie是存在客戶端上的,所以瀏覽器加入了一些限制確保cookie不會被惡意使用,同時不會占據太多磁盤空間,所以每個域的cookie數量是有限的 ; cookie 不是很安全 , 別人可以利用儲存的本地的cookie 。
Token -- 驗證用戶身份的令牌
- 唯一的 ,比較安全
- token 驗證流程 :
客戶端使用用戶名跟密碼請求登錄。
服務端收到請求,去驗證用戶名與密碼。
驗證成功后,服務端會簽發一個 Token,再把這個 Token 發送給客戶端。
客戶端收到 Token 以后可以把它存儲起來。
客戶端每次向服務端請求資源的時候需要帶著服務端簽發的 Token
服務端收到請求,然后去驗證客戶端請求里面帶著的 Token,如果驗證成功,就向客戶端返回請求的數據。
cookie 和session
- cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
- cookie不是很安全,考慮到安全應當使用session。
- session會在一定時間內保存在服務器上。當訪問增多,會比較占用服務器的性能考慮到減輕服務器性能方面,應當使用cookie。
- 單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
- 將登陸信息等重要信息存放為session,其他信息如果需要保留,可以放在cookie中
6 . 由于采用服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助于cookie機制來達到保存標識的目的,但實際上它還有其他選擇 --由于cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞回服務器.
token 和session
- session只提供一種簡單的認證,即有此 session ID ,即認為有此 User的全部權力 ; token Token是唯一的。提供的是認證 和 授權 ,認證是針對用戶,授權是針對app, 不可以轉移到其它 app上,也不可以轉到其它 用戶上。
- 所以,如果用戶數據可能需要和第三方共享,或者允許第三方調用 API 接口,用 token 。如果只是自己的網站,自己的 app,用session也可以。