HTTP是無狀態的協議,就是說通常情況下,HTTP每次請求都是獨立的,服務器幾乎沒有什么信息可以判斷請求是哪個用戶發送的。我們的Web應用卻經常需要鑒別每次請求的身份,以便做一些個性化操作和資源的保護。
為了客服HTTP的無狀態性,引入了用戶識別機制,常用的一種機制就是cookie。cookie是一種存儲在客戶端的信息。一般分為兩類:會話cookie和持久cookie,其他的分類都是該兩種分類的引申。
- 會話cookie: 用戶退出瀏覽器則cookie被刪除,不設置Expires字段。
- 持久cookie: 存儲在硬盤上,在過期之前仍然有效。
cookie,簡而言之就是在本地計算機保存一些用戶操作的歷史信息(當然包括登錄信息),并在用戶再次訪問該站點時瀏覽器通過HTTP協議將本地cookie內容發送給服務器,從而完成驗證,或繼續上一步操作。
cookie工作原理:
image.png
1.1 Go與cookie
Go中cookie結構的定義:
type Cookie struct {
Name string
Value string
Path string
Domain string
Expires time.Time
RawExpires string
// MaxAge=0 表示不設置MaxAge字段,可表示會話cookie
// MaxAge<0 表示直接刪除cookie,可以表示會話cookie
// MaxAge>0 持久cookie。過期時間為設置的時間
MaxAge int
Secure bool
HttpOnly bool
SameSite SameSite
Raw string
Unparsed []string
}
設置cookie:
expiration := time.Now()
expiration = expiration.AddDate(1, 0, 0)
cookie := http.Cookie{Name: "cookieid", Value: "123456", Expires: expiration}
http.SetCookie(w, &cookie)
讀取cookie:
cookie, _ := r.Cookie("cookieid")
fmt.Fprint(w, cookie)
cookie是存儲在客戶端的信息,通常常常需要在服務端存儲用戶的信息,結合cookie驗證用戶的一些請求。下一節我們介紹服務端的存儲機制session。