一、何為cookie 由於http協議是無狀態的,所以沒法知道當前訪問的客戶端是誰,所以有了cookie這個東西,通過cookie來讓服務端知道當前是誰訪問我,可以看做是一個身份牌 二、cookie的工作流程 (1) 第一次用戶登錄的時候,輸入用戶名和密碼信息,服務端接收後進行用戶認證。 (2)服務 ...
一、何為cookie
由於http協議是無狀態的,所以沒法知道當前訪問的客戶端是誰,所以有了cookie這個東西,通過cookie來讓服務端知道當前是誰訪問我,可以看做是一個身份牌
二、cookie的工作流程
(1) 第一次用戶登錄的時候,輸入用戶名和密碼信息,服務端接收後進行用戶認證。
(2)服務端通過驗證後,生成一個token以cookie的形式放在http的response header中一起返回給客戶端。
(3)瀏覽器根據是否設置cookie的過期時間判斷該cookie是會話cookie還是永久cookie,並將cookie存儲在不同的位置。
(4)下次進行http請求時,請求頭中會自動攜帶存儲的cookie。
(5)服務端根據請求頭中的cookie裡面的token確認該用戶的身份信息。
三、配置cookie
cookie 通常由後端配置(當然前端也可配置),通過在http響應頭部設置cookie來添加cookie
前端設置cookie
使用document.cookie即可
比如:
document.cookie = 'name=ry;max-age=2000;domian=ryuan.me;path=/;secure'
cookie有以下的屬性:
- max-age:cookie過期的時間,表示多少秒後過期。
- expires:設置cookie過期的一個日期,表示在什麼時候過期。max-age優先順序高一些。
- domian:設置cookie存放的域,沒有設置則為當前主機的域。
- path: cookie存儲的路徑
- secure: 加入此配置項,表示cookie只能通過https協議進行傳輸。
後端設置cookie
通過設置響應頭部信息,添加cookie,通過http響應返回給瀏覽器即可,瀏覽器收到cookie會自動保存下來。
var http = require('http');
http.createServer(function(req,res){
res.setHeader('status','200 ok');
res.setHeader('Set-Cookie','name=yyyy;max-age=10000;path=/;');
res.write('hello this is cookie test!!');
res.end();
}).listen(8800,()=>{
console.log('sever start at 8800');
});
後端可以設置cookie的屬性,除了上述前端可以設置的之外,還有兩個:
- httpOnly :添加來這個屬性之後,表示前端不能JavaScript 經由 Document.cookie 屬性、XMLHttpRequest 和 Request APIs 進行訪問
- SameSite=Strict,SameSite=Lax
允許伺服器設定一則 cookie 不隨著跨域請求一起發送,這樣可以在一定程度上防範跨站請求偽造攻擊(CSRF)
四、單點登錄
前提:cookie在不同的域之間是不可以訪問,修改的。但是在同一個一級域裡面,cookie是可以共用的。
舉個例子:
- (不同域之間不能相互訪問)跨域不能訪問: 比如在qq.com和baidu.com之間是不可以訪問到對方的cookie的
- 但是在同一個一級域裡面,其子域是可以共用一個cookie的,比如在y.qq.com(QQ音樂的首頁), v.qq.com(騰訊視頻首頁),他們兩個都在qq.com這個一級域裡面,所以,cookie在同一一級域裡面可以共用,基於這個可以實現單點登錄(也就是在qq音樂登錄後,再訪問騰訊視頻後會自動登錄你的qq號)
怎麼實現
在設置cookie時對domain賦值成同一一級功能變數名稱即可
比如node中:
res.setHeader('Set-Cookie','name=yyyy;max-age=10000;path=/;domain=qq.com';)
個人筆記總結,僅供參考,大步走多回頭
等什麼望穿秋水 任來世枯朽成灰