1、cookie
http請求是無狀態(tài)的請求協(xié)議响蓉,不會記住用戶的狀態(tài)和信息硕勿,也不清楚你在之前訪問了什么 。用戶使用當前的這個瀏覽器繼續(xù)訪問這個瀏覽器時枫甲,會主動攜帶這個網(wǎng)站設置的cookie信息源武。cookie會在瀏覽器中記錄信息,并且在訪問時同時攜帶這個信息瀏覽器更換或刪除cookie后想幻,信息丟失粱栖。cookie在瀏覽器中記錄的信息是不安全的,因為不能記錄敏感信息 脏毯。
2闹究、session
session是在服務器端進行數(shù)據(jù)的記錄,并且在每個用戶會生成一個sessionid食店,并且把這個id設置在用戶的瀏覽器中渣淤,也就是設置為cookie。
3吉嫩、token
token的意思是“令牌”价认,是用戶身份的驗證方式,最簡單的token組成:用戶唯一的身份標識率挣、當前時間的時間戳刻伊、簽名〗饭Γ可以防止惡意第三方拼接token請求服務器捶箱。還可以把不變的參數(shù)也放進token,避免多次查庫动漾。
token 的認證流程與cookie很相似丁屎。
1)用戶登錄,成功后服務器返回Token給客戶端旱眯。
2)客戶端收到數(shù)據(jù)后保存在客戶端
3)客戶端再次訪問服務器晨川,將token放入headers中
4)服務器端采用filter過濾器校驗。校驗成功則返回請求數(shù)據(jù)删豺,校驗失敗則返回錯誤碼
token與session的不同主要在
1)認證成功后共虑,會對當前用戶數(shù)據(jù)進行加密,生成一個加密字符串token呀页,返還給客戶端(服務器端并不進行保存)
2)瀏覽器會將接收到的token值存儲在Local Storage中妈拌,(通過js代碼寫入Local Storage,通過js獲取蓬蝶,并不會像cookie一樣自動攜帶)
3)再次訪問時服務器端對token值的處理:服務器對瀏覽器傳來的token值進行解密尘分,解密完成后進行用戶數(shù)據(jù)的查詢猜惋,如果查詢成功,則通過認證培愁,實現(xiàn)狀態(tài)保持著摔,所以,即時有了多臺服務器定续,服務器也只是做了token的解密和用戶數(shù)據(jù)的查詢谍咆,它不需要在服務端去保留用戶的認證信息或者會話信息,這就意味著基于token認證機制的應用不需要去考慮用戶在哪一臺服務器登錄了香罐,這就為應用的擴展提供了便利卧波,解決了session擴展性的弊端。
總結:
1)session存儲于服務器庇茫,可以理解為一個狀態(tài)列表,擁有一個唯一識別符號sessionId螃成,通常存放于cookie中旦签。服務器收到cookie后解析出sessionId,再去session列表中查找寸宏,才能找到相應session宁炫。依賴cookie
2)cookie類似一個令牌,裝有sessionId氮凝,存儲在客戶端羔巢,瀏覽器通常會自動添加。
3)token也類似一個令牌罩阵,無狀態(tài)竿秆,用戶信息都被加密到token中,服務器收到token后解密就可知道是哪個用戶稿壁。需要開發(fā)者手動添加幽钢。
4)token可以抵抗csrf,cookie+session不行傅是。CSRF攻擊者之所以屢屢得手匪燕,是因為用戶請求的驗證信息都存在cookie中。攻擊者甚至不需要知道驗證信息具體是什么直接就通過cookie繞過了驗證喧笔。針對這點帽驯,我們只要不將驗證信息存放在cookie中即可。通常的做法是HTTP 請求中利用參數(shù)加入一個隨機產(chǎn)生的 token书闸,并在服務器端建立一個攔截器來驗證這個 token尼变,如果請求中沒有token或者token內(nèi)容不正確晚碾,則認為可能是CSRF攻擊而拒絕該請求睡互。