【HTTP学习】Http协议中Cookie详细介绍
Http協(xié)議中Cookie詳細介紹
Cookie總是保存在客戶端中,按在客戶端中的存儲位置,可分為內(nèi)存Cookie和硬盤Cookie。內(nèi)存Cookie由瀏覽器維護,保存在內(nèi)存中,瀏覽器關閉后就消失了,其存在時間是短暫的。硬盤Cookie保存在硬盤里,有一個過期時間,除非用戶手工清理或到了過期時間,硬盤Cookie不會被刪除,其存在時間是長期的。所以,按存在時間,可分為非持久Cookie和持久Cookie。
HTTP請求+cookie的交互流程
如果步驟5攜帶的是過期的cookie或者是錯誤的cookie,那么將認證失敗,返回至要求身份認證頁面。
HTTP協(xié)議作為無狀態(tài)協(xié)議,對于HTTP協(xié)議而言,無狀態(tài)同樣指每次request請求之前是相互獨立的,當前請求并不會記錄它的上一次請求信息。那么問題來了,既然無狀態(tài),那完成一套完整的業(yè)務邏輯,發(fā)送多次請求的情況數(shù)不勝數(shù),使用http如何將上下文請求進行關聯(lián)呢?機智的人類通過優(yōu)化,找到了一種簡單的方式記錄http協(xié)議的請求信息
優(yōu)化后的HTTP請求:
瀏覽器發(fā)送request請求到服務器,服務器除了返回請求的response之外,還給請求分配一個唯一標識ID,協(xié)同response一并返回給瀏覽器。
同時服務器在本地創(chuàng)建一個MAP結構,專門以key-value(請求ID-會話內(nèi)容)形式將每個request進行存儲
此時瀏覽器的request已經(jīng)被賦予了一個ID,第二次訪問時,服務器先從request中查找該ID,根據(jù)ID查找維護會話的content內(nèi)容,該內(nèi)容中記錄了上一次request的信息狀態(tài)。
根據(jù)查找出的request信息生成基于這些信息的response內(nèi)容,再次返回給瀏覽器。如果有需要會再次更新會話內(nèi)容,為下一次請求提供準備。
所以根據(jù)這個會話ID,以建立多次請求-響應模式的關聯(lián)數(shù)據(jù)傳遞。說到這里可能已經(jīng)喚起了大家許多共鳴。這就是cookie和session對無狀態(tài)的http協(xié)議的強大作用。服務端生成這個全局的唯一標識,傳遞給客戶端用于唯一標記這次請求,也就是cookie;而服務器創(chuàng)建的那個map結構就是session。所以,cookies由服務端生成,用于標記客戶端的唯一標識,無特定含義,在每次網(wǎng)絡請求中,都會被傳送。session服務端自己維護的一個map數(shù)據(jù)結構,記錄key-content上下文內(nèi)容狀態(tài)。
cookie的屬性
一般cookie所具有的屬性,包括:
Domain:域,表示當前cookie所屬于哪個域或子域下面。
對于服務器返回的Set-Cookie中,如果沒有指定Domain的值,那么其Domain的值是默認為當前所提交的http的請求所對應的主域名的。比如訪問 http://www.example.com,返回一個cookie,沒有指名domain值,那么其為值為默認的www.example.com。
Path:表示cookie的所屬路徑。
Expire time/Max-age:表示了cookie的有效期。expire的值,是一個時間,過了這個時間,該cookie就失效了。或者是用max-age指定當前cookie是在多長時間之后而失效。如果服務器返回的一個cookie,沒有指定其expire time,那么表明此cookie有效期只是當前的session,即是session cookie,當前session會話結束后,就過期了。對應的,當關閉(瀏覽器中)該頁面的時候,此cookie就應該被瀏覽器所刪除了。
secure:表示該cookie只能用https傳輸。一般用于包含認證信息的cookie,要求傳輸此cookie的時候,必須用https傳輸。
httponly:表示此cookie必須用于http或https傳輸。這意味著,瀏覽器腳本,比如javascript中,是不允許訪問操作此cookie的。
服務器發(fā)送cookie給客戶端
從服務器端,發(fā)送cookie給客戶端,是對應的Set-Cookie。包括了對應的cookie的名稱,值,以及各個屬性。
Set-Cookie: lu=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Jan 2013 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly Set-Cookie: made_write_conn=1295214458; Path=/; Domain=.169it.com Set-Cookie: reg_fb_gate=deleted; Expires=Thu, 01 Jan 1970 00:00:01 GMT; Path=/; Domain=.169it.com; HttpOnly
從客戶端把cookie發(fā)送到服務器
從客戶端發(fā)送cookie給服務器的時候,是不發(fā)送cookie的各個屬性的,而只是發(fā)送對應的名稱和值。
GET /spec.html HTTP/1.1 Host: www.example.org Cookie: name=value; name2=value2 Accept: */*
關于修改,設置cookie
除了服務器發(fā)送給客戶端(瀏覽器)的時候,通過Set-Cookie,創(chuàng)建或更新對應的cookie之外,還可以通過瀏覽器內(nèi)置的一些腳本,比如javascript,去設置對應的cookie,對應實現(xiàn)是操作js中的document.cookie。
Cookie的缺陷
cookie會被附加在每個HTTP請求中,所以無形中增加了流量。
由于在HTTP請求中的cookie是明文傳遞的,所以安全性成問題。(除非用HTTPS)
Cookie的大小限制在4KB左右。對于復雜的存儲需求來說是不夠用的。
作者:gtea
博客地址:https://www.cnblogs.com/gtea
總結
以上是生活随笔為你收集整理的【HTTP学习】Http协议中Cookie详细介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: atoi
- 下一篇: lol洛无限火力怎么出装(英雄联盟无限火