不一樣的HTTP 十一

2021-10-19 17:19:33 字數 2810 閱讀 9740

http 的 cookie 機制也是一樣的道理,既然伺服器記不住,那就在外部想辦法記住。相當於是伺服器給每個客戶端都貼上一張小紙條,上面寫了一些只有伺服器才能理解的資料,需要的時候客戶端把這些資訊發給伺服器,伺服器看到 cookie,就能夠認出對方是誰了。

這要用到兩個字段:響應頭欄位set-cookie和請求頭欄位cookie

當使用者通過瀏覽器第一次訪問伺服器的時候,伺服器肯定是不知道他的身份的。所以,就要建立乙個獨特的身份標識資料,格式是「key=value」,然後放進 set-cookie 欄位裡,隨著響應報文一同發給瀏覽器。

瀏覽器收到響應報文,看到裡面有 set-cookie,知道這是伺服器給的身份標識,於是就儲存起來,下次再請求的時候就自動把這個值放進 cookie 欄位裡發給伺服器。

因為第二次請求裡面有了 cookie 字段,伺服器就知道這個使用者不是新人,之前來過,就可以拿出 cookie 裡的值,識別出使用者的身份,然後提供個性化的服務。

不過因為伺服器的「記憶能力」實在是太差,一張小紙條經常不夠用。所以,伺服器有時會在響應頭里新增多個 set-cookie,儲存多個「key=value」。但瀏覽器這邊傳送時不需要用多個 cookie 字段,只要在一行裡用「;」隔開就行。

從這張圖中我們也能夠看到,cookie 是由瀏覽器負責儲存的,而不是作業系統。所以,它是「瀏覽器繫結」的,只能在本瀏覽器內生效。

如果你換個瀏覽器或者換台電腦,新的瀏覽器裡沒有伺服器對應的 cookie,就好像是脫掉了貼著紙條的衣服,「健忘」的伺服器也就認不出來了,只能再走一遍 set-cookie 流程。

首先,我們應該設定 cookie 的生存週期,也就是它的有效期,讓它只能在一段時間內可用,就像是食品的「保鮮期」,一旦超過這個期限瀏覽器就認為是 cookie 失效,在儲存裡刪除,也不會傳送給伺服器。

expires」俗稱「過期時間」,用的是絕對時間點,可以理解為「截止日期」(deadline)。

max-age」用的是相對時間,單位是秒,瀏覽器用收到報文的時間點再加上 max-age,就可以得到失效的絕對時間。

expires 和 max-age 可以同時出現,兩者的失效時間可以一致,也可以不一致,但瀏覽器會優先採用 max-age 計算失效期。

比如,expires 標記的過期時間是「gmt 2023年 6 月 7 號 8 點 19 分」,而 max-age 則只有 10 秒,如果現在是 6 月 6 號零點,那麼 cookie 的實際有效期就是「6 月 6 號零點過 10 秒」。

其次,我們需要設定 cookie 的作用域,讓瀏覽器僅傳送給特定的伺服器和 uri,避免被其他**盜用。

作用域的設定比較簡單,「domain」和「path」指定了 cookie 所屬的網域名稱和路徑,瀏覽器在傳送 cookie 前會從 uri 中提取出 host 和 path 部分,對比 cookie 的屬性。如果不滿足條件,就不會在請求頭里傳送 cookie。

最後要考慮的就是cookie 的安全性了,盡量不要讓伺服器以外的人看到。

寫過前端的同學一定知道,在 js 指令碼裡可以用 document.cookie 來讀寫 cookie 資料,這就帶來了安全隱患,有可能會導致「跨站指令碼」(xss)攻擊竊取資料。

屬性「httponly」會告訴瀏覽器,此 cookie 只能通過瀏覽器 http 協議傳輸,禁止其他方式訪問,瀏覽器的 js 引擎就會禁用 document.cookie 等一切相關的 api,指令碼攻擊也就無從談起了。

另乙個屬性「samesite」可以防範「跨站請求偽造」(xsrf)攻擊,設定成「samesite=strict」可以嚴格限定 cookie 不能隨著跳轉鏈結跨站傳送,而「samesite=lax」則略寬鬆一點,允許 get/head 等安全方法,但禁止 post 跨站傳送。

還有乙個屬性叫「secure」,表示這個 cookie 僅能用 https 協議加密傳輸,明文的 http 協議會禁止傳送。但 cookie 本身不是加密的,瀏覽器裡還是以明文的形式存在。

cookie 最基本的乙個用途就是身份識別,儲存使用者的登入資訊,實現會話事務。

比如,你用賬號和密碼登入某電商,登入成功後**伺服器就會發給瀏覽器乙個 cookie,內容大概是「name=yourid」,這樣就成功地把身份標籤貼在了你身上。

之後你在**裡隨便訪問哪件商品的頁面,瀏覽器都會自動把身份 cookie 發給伺服器,所以伺服器總會知道你的身份,一方面免去了重複登入的麻煩,另一方面也能夠自動記錄你的瀏覽記錄和購物下單(在後台資料庫或者也用 cookie),實現了「狀態保持」。

cookie 的另乙個常見用途是廣告跟蹤

你上網的時候肯定看過很多的廣告,這些背後都是廣告商**(例如 google),它會「偷偷地」給你貼上 cookie 小紙條,這樣你上其他的**,別的廣告就能用 cookie 讀出你的身份,然後做行為分析,再推給你廣告。

這種 cookie 不是由訪問的主站儲存的,所以又叫「第三方 cookie」(third-party cookie)。如果廣告商勢力很大,廣告到處都是,那麼就比較「恐怖」了,無論你走到**它都會通過 cookie 認出你來,實現廣告「精準打擊」。

為了防止濫用 cookie 蒐集使用者隱私,網際網路組織相繼提出了 dnt(do not track)和 p3p(platform for privacy preferences project),但實際作用不大。

不一樣的HTTP(一)

uri 即統一資源識別符號,作為網際網路上資源的唯一身份 http 即超文字傳輸協議,用來傳輸超文字。只允許用 get 動作從伺服器上獲取 html 文件,並且在響應請求之後立即關閉連線,功能非常有限 增加了 head post 等新方法 增加了響應狀態碼,標記可能的錯誤原因 引入了協議版本號概念 ...

不一樣的HTTP 二

一.http是什麼?1.首先,http 是乙個協議。不過,協議又是什麼呢?第一點,協議必須要有兩個或多個參與者,也就是 協 第二點,協議是對參與者的一種行為約定和規範,也就是 議 http 是乙個用在計算機世界裡的協議。它使用計算機能夠理解的語言確立了一種計算機之間交流通訊的規範,以及相關的各種控制...

不一樣的HTTP 三

cdn,全稱是 content delivery network 翻譯過來就是 內容分發網路 它應用了 http 協議裡的快取和 技術,代替源站響應客戶端的請求。爬蟲 crawler 實際上是一種可以自動訪問 web 資源的應用程式。html是 http 協議傳輸的主要內容之一,它描述了超文字頁面,...