HTTP是无状态的协议,就是说通常情况下,HTTP每次请求都是独立的,服务器几乎没有什么信息可以判断请求是哪个用户发送的。我们的Web应用却经常需要鉴别每次请求的身份,以便做一些个性化操作和资源的保护。
为了客服HTTP的无状态性,引入了用户识别机制,常用的一种机制就是cookie。cookie是一种存储在客户端的信息。一般分为两类:会话cookie和持久cookie,其他的分类都是该两种分类的引申。
- 会话cookie: 用户退出浏览器则cookie被删除,不设置Expires字段。
- 持久cookie: 存储在硬盘上,在过期之前仍然有效。
cookie,简而言之就是在本地计算机保存一些用户操作的历史信息(当然包括登录信息),并在用户再次访问该站点时浏览器通过HTTP协议将本地cookie内容发送给服务器,从而完成验证,或继续上一步操作。
cookie工作原理:
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。