網路程式設計-HTTP cookie
1. cookie的起源
早期Web開發面臨的最大問題之一是如何管理狀態。簡言之,伺服器端沒有辦法知道兩個請求是否來自於同一個瀏覽器。那時的辦法是在請求的頁面中插入一個token,並且在下一次請求中將這個token返回(至伺服器)。這就需要在form中插入一個包含token的隱藏表單域,或著在URL的qurey字串中傳遞該token。這兩種辦法都強調手工操作並且極易出錯。
Lou Montulli那時是網景通訊的一個僱員,被認為在1994年將“magic cookies”的概念應用到了web通訊中。他意圖解決的是web中的購物車,現在所有購物網站都依賴購物車。他的最早的說明文件提供了一些cookies工作原理的基本資訊該文件在
2. cookie是什麼?
坦白的說,一個cookie就是儲存在使用者主機瀏覽器中的一小段文字檔案。Cookies是純文字形式,它們不包含任何可執行程式碼。一個Web頁面或伺服器告之瀏覽器來將這些資訊儲存並且基於一系列規則在之後的每個請求中都將該資訊返回至伺服器。Web伺服器之後可以利用這些資訊來標識使用者。多數需要登入的站點通常會在你的認證資訊通過後來設定一個cookie,之後只要這個cookie存在並且合法,你就可以自由的瀏覽這個站點的所有部分。再次,cookie只是包含了資料,就其本身而言並不有害。
3. 建立cookie
首先,服務端生成Cookie,然在http響應header中設定Set-Cookie欄位,客戶端會讀取到Set-Cookie欄位後,會將cookie資訊儲存起來,下次繼續訪問服務端時,會在http請求中設定Cookie欄位併發送給服務端,服務端可以解析這個Cookie欄位。Set-Cookie訊息的格式如下面的字串(中括號中的部分都是可選的)
Set-Cookie: value; Path=/show_cookie; Domain=www.localhost.com; Max-Age=10; HttpOnly; Secure
其中:
- value 通常是以name=value的格式來指定cookie的值。
- Path 設定訪問哪些路徑應該攜帶這個cookie。如果不設定,則訪問所有路徑都攜帶這個cookie。
- Domain 設定訪問哪些域名範圍的主機時應該攜帶這個cookie。如果不設定,則該Domain下的主機都攜帶cookie。
- Max-Age 用來設定cookie什麼時候過期,MaxAge為負數或等於0表示立即過期,MaxAge大於0表示過多少秒之後過期。(
Expires
也可以設定cookie持久化時的過期時長,Expires是老式的過期方法。) - Secure 屬性是一個標記並且沒有其它的值。一個secure cookie只有當請求是通過SSL和HTTPS建立時,才會傳送到伺服器端。
- HttpOnly 屬性也是一個標記,它使JavaScript 指令碼無法獲得Cookie。其主要目的為防止跨站指令碼攻擊(Cross-sitescripting,XSS)對Cookie 的資訊竊取。
案例:使用golang種植cookie
func HttpServer() {
http.HandleFunc("/set_cookie", func(w http.ResponseWriter, r *http.Request) {
c := http.Cookie{
Name: "user",
Value: "Wuhan,max",
Domain: "www.localhost.com",
Path: "/set_cookie",
MaxAge: 10,
Secure: false,
HttpOnly: true,
}
c2 := http.Cookie{
Name: "cart",
Value: "1,2,3",
}
w.Header().Set("Set-Cookie", c.String())
w.Header().Add("Set-Cookie", c2.String())
})
err := http.ListenAndServe("127.0.0.1:8080", nil)
if err != nil {
log.Panic(err)
}
}