一.理解HTTP「無狀態」的含義html
咱們知道,HTTP是一種無狀態的協議,客戶端與服務器創建鏈接並傳輸數據,數據傳輸完成後,鏈接就會關閉。redis
舉個栗子,若是在無狀態狀況下訪問淘寶,會出現如下場景:數據庫
1)打開淘寶的url,在這一步輸入用戶名和密碼;後端
2)在首頁選擇同樣商品,點擊進去,又提示須要從新登陸。由於HTTP是無狀態的,雖然在第1步中已經輸入了用戶名和密碼,但咱們的客戶端不會記住上一步輸入的用戶名和密碼,而服務器也不會記住已登陸的狀態;瀏覽器
通過上述例子,咱們能夠把「無狀態」理解爲:不會對本次會話設置緩存區,來分別記錄客戶端和服務器在臨時會話中產生的數據。緩存
理解了HTTP無狀態的含義,再去看cookie,session和token的概念。安全
二.cookie的概念 服務器
cookie是HTTP定義在header中的一個字段,是具體存在於瀏覽器上的,僅僅是瀏覽器實現的一種數據存儲功能。它是session的一種後端無狀態實現。cookie
cookie由服務器生成,發送給客戶端的,客戶端把cookie以kv形式保存到某個目錄下的文本文件內,下一次請求同一網站時會把該cookie發送給服務器。因爲cookie是存在客戶端上的,因此瀏覽器加入了一些限制確保cookie不會被惡意使用,同時不會佔據太多磁盤空間,因此每一個域的cookie數量是有限的。網絡
3、session
Session在廣義上是指一種網絡通信的會話機制,用於跟蹤用戶;在狹義上,Session是在服務器端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據能夠保存在集羣、數據庫、文件中:
1)客戶端第一次請求服務器;
2)第一次建立session時,服務器在內存中開闢一塊空間,並返回Session ID;
3)由於服務器須要記錄用戶狀態,故在響應信息中包含一個SetCookie的響應頭,要求客戶端在Cookie中記錄Seesion ID;
4)客戶端根據SetCookie中的響應頭信息,將sessionID存儲在Cookie中;
5)再次請求服務器,客戶端會在請求頭信息中攜帶Cookie請求頭;
6)服務器根據客戶端攜帶的請求頭進行用戶身份、狀態等較驗。
由上圖中的步驟能夠得知,從廣義上講,session是一種網絡通信的會話機制,用於跟蹤用戶。而cookie在這個過程當中的做用是用於保存Session ID的。cookie只是目前用於實現session機制的主流方案之一。
4、token
token是存儲在客戶端的令牌,通常用於身份校驗。
值得一提的是,在上述步驟②生成token時會加入有效期,而在步驟⑥解析token時,也會去判斷token是否過時。
步驟④存儲token時,能夠存儲在cookie或者redis中。
步驟⑤攜帶token時,能夠在url中攜帶,也能夠在post請求或http的header中攜帶。
5、session和token的區別
1)token和session都用於身份驗證,session是會話,token是令牌;
2)身份認證 token的安全性要高於session,由於每一個請求都有簽名還能防止監聽以及重放攻擊,而session必須靠鏈路層來保障通信安全。
3)session和token都須要去管理過時時間。
HTTP「無狀態」的解釋:http://www.javashuo.com/article/p-wzffznna-hb.html
cookie,session,token的概念:https://blog.csdn.net/lcgoing/article/details/86754955