假設伺服器有乙個介面,通過請求這個介面,可以新增乙個管理員
但是,不是任何人都有權力做這種操作的
那麼伺服器如何知道請求介面的人是有權力的呢?
答案是:只有登入過的管理員才能做這種操作
可問題是,客戶端和伺服器的傳輸使用的是http協議,http協議是無狀態的,什麼叫無狀態,就是伺服器不知道這一次請求的人,跟之前登入請求成功的人是不是同乙個人
由於http協議的無狀態,伺服器忘記了之前的所有請求,它無法確定這一次請求的客戶端,就是之前登入成功的那個客戶端。
你可以把伺服器想象成有著嚴重臉盲症的東哥,他沒有辦法分清楚跟他說話的人之前做過什麼於是,伺服器想了乙個辦法
它按照下面的流程來認證客戶端的身份
客戶端登入成功後,伺服器會給客戶端乙個出入證(令牌 token)
後續客戶端的每次請求,都必須要附帶這個出入證(令牌 token)
伺服器發揚了認證不認人的優良傳統,就可以很輕鬆的識別身份了。
能夠存放多個出入證。這些出入證來自不同的**,也可能是乙個**有多個出入證,分別用於出入不同的地方
正確的出示出入證。客戶端不能將肯德基的出入證傳送給麥當勞。
管理出入證的有效期。客戶端要能夠自動的發現那些已經過期的出入證,並把它從卡包內移除。
能夠滿足上面所有要求的,就是cookie
cookie類似於乙個卡包,專門用於存放各種出入證,並有著一套機制來自動管理這些證件。
卡包內的每一張卡片,稱之為乙個cookie。
cookie是瀏覽器中特有的乙個概念,它就像瀏覽器的專屬卡包,管理著各個**的身份資訊。
當瀏覽器向伺服器傳送乙個請求的時候,它會瞄一眼自己的卡包,看看哪些卡片適合附帶捎給伺服器
如果乙個cookie同時滿足以下條件,則這個cookie會被附帶到請求中
cookie中的path和這次請求的path是匹配的
驗證cookie的安全傳輸
如果乙個cookie滿足了上述的所有條件,則瀏覽器會把它自動加入到這次請求中
看到打馬賽克的地方了嗎?這部分就是通過請求頭cookie
傳送到伺服器的,它的格式是鍵=值; 鍵=值; 鍵=值; ...
,每乙個鍵值對就是乙個符合條件的cookie。
**cookie中包含了重要的身份資訊,永遠不要把你的cookie洩露給別人!!!**否則,他人就拿到了你的證件,有了證件,就具備了為所欲為的可能性。
由於cookie是儲存在瀏覽器端的,同時,很多證件又是伺服器頒發的
所以,cookie的設定有兩種模式:
伺服器可以通過設定響應頭,來告訴瀏覽器應該如何設定cookie
響應頭按照下面的格式設定:
set-cookie
: cookie1
set-cookie
: cookie2
set-cookie
: cookie3
...
通過這種模式,就可以在一次響應中設定多個cookie了,具體設定多少個cookie,設定什麼cookie,根據你的需要自行處理
其中,每個cookie的格式如下:
鍵=值; path=?; domain=?; expire=?; max-age=?; secure; httponly
每個cookie除了鍵值對是必須要設定的,其他的屬性都是可選的,並且順序不限
當這樣的響應頭到達客戶端後,瀏覽器會自動的將cookie儲存到卡包中,如果卡包中已經存在一模一樣的卡片(其他key、path、domain相同),則會自動的覆蓋之前的設定。
下面,依次說明每個屬性值:
expire:設定cookie的過期時間。這裡必須是乙個有效的gmt時間,即格林威治標準時間字串,比如fri, 17 apr 2020 09:35:59 gmt
,表示格林威治時間的2020-04-17 09:35:59
,即北京時間的2020-04-17 17:35:59
。當客戶端的時間達到這個時間點後,會自動銷毀該cookie。
max-age:設定cookie的相對有效期。expire和max-age通常僅設定乙個即可。比如設定max-age
為1000
,瀏覽器在新增cookie時,會自動設定它的expire
為當前時間加上1000秒,作為過期時間。
secure:設定cookie是否是安全連線。如果設定了該值,則表示該cookie後續只能隨著https
請求傳送。如果不設定,則表示該cookie會隨著所有請求傳送。
httponly:設定cookie是否僅能用於傳輸。如果設定了該值,表示該cookie僅能用於傳輸,而不允許在客戶端通過js獲取,這對防止跨站指令碼攻擊(xss)會很有用。
下面來乙個例子,客戶端通過post
請求伺服器,並在訊息體中給予了賬號和密碼,伺服器驗證登入成功後,在響應頭中加入了以下內容:
set-cookie: token=123456; path=/; max-age=3600; httponly
當該響應到達瀏覽器後,瀏覽器會建立下面的cookie:
key
: token
value
:123456
domain
: yuanjin.tech
path
: /expire
:2020-04-17 18:55:00
#假設當前時間是2020-04-17 17:55:00
secure
:false
#任何請求都可以附帶這個cookie,只要滿足其他要求
#不允許js獲取該cookie
於是,隨著瀏覽器後續對伺服器的請求,只要滿足要求,這個cookie就會被附帶到請求頭中傳給伺服器:
cookie
: token=123456; 其他cookie...
現在,還剩下最後乙個問題,就是如何刪除瀏覽器的乙個cookie呢?
如果要刪除瀏覽器的cookie,只需要讓伺服器響應乙個同樣的域、同樣的路徑、同樣的key,只是時間過期的cookie即可
所以,刪除cookie其實就是修改cookie
下面的響應會讓瀏覽器刪除token
cookie
: token=; domain=yuanjin.tech; path=/; max-age=-
1
瀏覽器按照要求修改了cookie後,會發現cookie已經過期,於是自然就會刪除了。
無論是修改還是刪除,都要注意cookie的域和路徑,因為完全可能存在域或路徑不同,但key相同的cookie既然cookie是存放在瀏覽器端的,所以瀏覽器向js公開了介面,讓其可以設定cookie因此無法僅通過key確定是哪乙個cookie
document.cookie =
"鍵=值; path=?; domain=?; expire=?; max-age=?; secure"
;
可以看出,在客戶端設定cookie,和伺服器設定cookie的格式一樣,只是有下面的不同
以上,就是cookie原理部分的內容。
如果把它用於登入場景,就是如下的流程:
登入請求
瀏覽器傳送請求到伺服器,附帶賬號密碼
客戶端收到cookie,瀏覽器自動記錄下來
簡單的cookie設定
後續請求
瀏覽器傳送請求到伺服器,希望新增乙個管理員,並將cookie自動附帶到請求中
伺服器先獲取cookie,驗證cookie中的資訊是否正確,如果不正確,不予以操作,如果正確,完成正常的業務流程
Cookie的基本概念
1.會話 會話技術預設就是指開啟乙個瀏覽器到關閉瀏覽器這個過程就稱作為乙個會話。2.會話技術類別 1.cookie技術 2.session技術 3.cookie會話技術 4.cookie是乙個伺服器傳送給瀏覽器,在瀏覽器上儲存的乙個小檔案 5.應用場景 瀏覽器第一次訪問伺服器時,伺服器會校驗使用者名...
基本概念 C 基本概念
由於工作中需要用到c 編寫的一些工具,有時候需要根據需求修改或者定製工具,所以現在不得不學習一下c 的基礎語法,此為筆記,不成章法!機器語言 組合語言 高階語言 面向過程的程式設計方法 物件導向的程式設計方法 泛型程式設計方法 1 演算法設計 2 源程式編輯 3 編譯 4 連線 5 執行除錯 輸入裝...
基本概念 數控系統基本概念
第一章 基本概念 數控工具機cnc是一種按事先編制好的加工零件程式進行加工的高效 自動化加工裝置。是 computer numerical control machine tools 的簡稱。數控工具機較好地解決了複雜 精密 小批量 多品種的零件加工問題,是一種柔性的 高效能的自動化工具機。西門子系...