Cookie定義

HTTP cookie技術可以把網站伺服器發送給瀏覽器的特定數據都存在客戶端的硬碟上,目的是把無狀態的HTTP請求(stateless)變成有狀態的HTTP請求(stateful)。為什麼叫cookie呢?因為它的和magic cookie很類似的原理,magic cookie用於描述程序接收到數據並把數據原封不動的返回去的一種行為。1994年網景(netscape)公司的程序員開發一個在線購物應用,設計購物車時,不想把這些數據都存在伺服器端,而是直接存在用戶的電腦上,減輕服務端的儲存壓力,不過現代版的購物車通常都是儲存在伺服器(Cache/資料庫)中,cookie可只記錄購物車的唯一標識符,而不是直接記錄具體的商品。

Cookie流程及結構

大部分web網站都會使用到cookie,使用它的基本流程可以概括為3步

  • 瀏覽器向伺服器請求一個從未請求過的web頁面;

GET /index.html HTTP/1.1
Host: www.example.org
...

  • 瀏覽器會在接下來的http請求的header中把以上cookie原樣返回給伺服器。

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: theme=light
Set-Cookie: sessionToken=abc123; Expires=Wed, 09 Jun 2020 10:18:14 GMT
...

  • 伺服器返回瀏覽器此頁面,並在返回http包的header中設置set-cookie屬性;

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: theme=light; sessionToken=abc123

上面示例設置了兩個cookies: 第一個是theme,由於沒有設置它的ExpiresMax-Age屬性,所以是個session cookie,它會在瀏覽器關閉時直接被刪除掉。 第二個是SessionToken,它有過期時間,所以只會在指定的過期時間後才會被刪除(也可手動刪除)。

瀏覽器訪問example.org/spec.html時,會把上一步的cookies設置在header中原樣返回給伺服器,當然不需要再指定cookie的其它屬性,只需要把key-value返回即可。

伺服器根據設置的cookies就能知道標識這個客戶,把無狀態的HTTP請求變成了有狀態的請求。

可以看看具體的網頁端的知乎是如何登錄的?

下圖就是通過chrome調試器中看到的https://www.zhihu.com下登錄成功後所有的cookies.其中z_c0就是登錄成功的憑證,當手動把它刪除時後刷新界面,會要求重新登錄。

從調試器中可以看出cookies除了key-value結構外,還有一些其它的屬性。

  1. DomainPath,它倆定義了cookie的作用範圍,告訴瀏覽器這些cookie屬於那個作用域下,為了保證安全,cookie只能設置當前資源的頂級域或子域,不能設置其它域的cookie,比如:zhihu.com網站不能設置baidu.com域名下的cookie。
  2. ExpiresMax-Age,瀏覽器會在Expires指定的時間點過期時,把對應的cookie刪除掉。Max-Age與Expires作用相同,只是指定的是瀏覽器將在未來多少秒後將cookie刪除
  3. SecureHttpOnly,這兩個屬性沒有具體的值,如果指定了對應的屬性,則表示啟用了它。

HTTP/1.0 200 OK
Set-Cookie: lu=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Jan 2020 21:47:38 GMT;
Path=/; Domain=.example.com; HttpOnly

HttpOnly表示這個cookie不能被客戶端使用JavaScript讀取到,是不公開的cookie。比如你在chrome調試器的console中輸入document.cookie將得不到標記為HttpOnly的欄位。Secure表示cookie只能通過加密傳輸,即只能用於HTTPS連接。比如你可以看到:

知乎cookie裡面的登錄憑證的HTTPOnlySecure都是打開的!

4. SameSite屬性是chromium特有的。用於允許伺服器通過聲明特定的cookie應與同一可註冊域發起的請求一起發送來減輕跨域攻擊CSRF和信息泄漏攻擊風險。

Where cookie comes from??

web.archive.org

題圖: Photo byErol AhmedonUnsplash

推薦閱讀:

相关文章