Cookie學習筆記

Cookie是一個最早被瀏覽器用來記錄使用者資訊的技術與規範,我們常用於紀錄一些不敏感的資訊,
好讓我們可以減輕伺服器負擔,以及追蹤使用者狀態,提升使用者的操作體驗。

Cookie是如何運作?

基本的運作原理其實是最容易被忽略的事情,因為現在的程式語言和開發框架都已經幫我們處理很多事,我們只要會使用framework提供的方法就夠了,但是如果遇到沒有實作cookie方法的框架該怎麼辦? 或是在寫單元測試及整合測試時遇到cookie該如何模擬?

基本運作機制如下:

( [圖片來源](https://docs.microsoft.com/zh-tw/aspnet/web-api/overview/advanced/http-cookies) )
  1. 當使用者透過瀏覽器請求某一個網站時,伺服器可以回應帶有Set-Cookie屬性的HTTP Header。
  2. 當瀏覽器接收到帶有Set-Cookie的Header時,會自動將cookie的name和value存放到瀏覽器內部的暫存區。
  3. 當瀏覽器再次對伺服器發出請求時,就會尋找暫存區內有沒有該網域並且在時效內的cookie,如果有的話就會加入到這次請求的Header中,放在名為Cookie的屬性裡。

以上運作機制我是參考保哥部落格以及維基百科,維基百科一定要找英文的,中文的cookie頁面寫得很少,但是英文的cookie頁面就寫得非常豐富,很值得一看。

Web Api有沒有Cookie?

現在讓我們回到正題,到底Api有沒有Cookie? 其實大家只要google關鍵字”ASP.NET Web Api Cookie”就能找到這篇官方文章ASP.NET Web API 中的HTTP Cookie,上面包含原理及實作方式都已經寫得非常清楚。事實上,Cookie並不是專屬瀏覽器的功能,Cookie是一種通用的HTTP狀態管理的規範,最早被定義在RFC 2109,現行的瀏覽器都是依照這個規範為基礎,實作Cookie的機制。

因此,我們的問題應該是,Web Api有沒有實作操作Cookie的類別及方法? 答案是: 有的。至於為什麼很多人會覺得Api就應該沒有Cookie,是因為接收Api的應用程式框架(可能是桌面軟體或手機軟體),沒有實作操作Cookie的類別及方法。如果Api只是要向App互傳參數,根本不須要依照Cookie規範,傳參數的方法很多,藏在Header也可以,少數情況下才會用到Cookie。

來看一下Web Api的cookie操作方式,範例為用cookie紀錄使用者的拜訪次數:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public HttpResponseMessage Get()
{
int count = 1;
// 取得cookie
var cookie = Request.Headers.GetCookies("count").FirstOrDefault();
if (cookie != null)
{
count += int.Parse(cookie["count"].Value);
}
// 設定cookie
var response = new HttpResponseMessage();
var newCookie = new CookieHeaderValue("count", count.ToString());
response.Headers.AddCookies(new CookieHeaderValue[] { newCookie });
return response;
}

再來看一下MVC的cookie操作方式,有點不一樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public ActionResult Index()
{
int count = 1;
// 取得cookie
var cookie = Request.Cookies["count"];
if (cookie != null)
{
count += int.Parse(cookie.Value);
}
// 設定cookie
var newCookie = new HttpCookie("count", count.ToString());
Response.AppendCookie(newCookie);
return View();
}

結論

Cookie只是一種基於HTTP的儲存與傳輸規範,在不同的架構中會有不同的做法。