「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」
前言
cookies定义上可以说是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件,它和你的网络浏览行为有关,所以存储在你电脑上的cookies就好像你的一张身份证,你电脑上的cookies和其他电脑上的cookies是不一样的;cookies不能被视作代码执行。
技术角度上cookie介绍
- HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由同一个客户端发出
- Cookie就是解决HTTP协议无状态的方案之一,中文是小甜饼的意思
- Cookie实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求
- Cookie由服务器创建,并发送给浏览器,最终由浏览器保存
gin框架中使用cookie
在我们的路由里新定义了一个接口来测试
// 服务端要给客户端
cookier.GET("cookie", func(c *gin.Context) {
// 获取客户端是否携带cookie
cookie, err := c.Cookie("name")
if err != nil {
cookie = "NotSet"
// 给客户端设置cookie
// maxAge int, 单位为秒
// path,cookie所在目录
// domain string,域名
// secure 是否智能通过https访问
// httpOnly bool
是否允许别人通过js获取自己的cookie
c.SetCookie("name", "gin", 600, "/", "localhost", false, true)
}
fmt.Printf("cookie的值是: %s\n", cookie)})
这时候我们访问http://localhost:8000/cookie 会看到下面的日志,因为从客户端第一次访问过来是没cookie的。
同时我们判断了没有name这个值的话,就设置一个新的值gin,这时候第二次访问就能看到cookie的值不为空了。
同时可以看到SetCookie的方法
func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)
path: 表示这个cookie影响到的路径,浏览器跟会根据这项配置,像指定域中匹配的路径发送cookie。
max-age: 与expires作用相同,用来告诉浏览器此cookie多久过期(单位是秒),而不是一个固定的时间点。
HttpOnly: 告知浏览器不允许通过脚本document.cookie去更改这个值,同样这个值在document.cookie中也不可见。但在http请求张仍然会携带这个cookie。注意这个值虽然在脚本中不可获取,但仍然在浏览器安装目录中以文件形式存在。这项设置通常在服务器端设置。
secure: 安全标志,指定后,只有在使用SSL链接时候才能发送到服务器,如果是http链接则不会传递该信息。就算设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息,所以不要把重要信息放cookie就对了服务器端设置
cookie缺点
- 任何人访问都可以在浏览器里查到cookie,是明文的不够安全。
- 每次访问都要查询cookie,也额外增加服务器带宽消耗。
- cookie还可以被浏览器禁用。
- cookie有上限。
总结
综上所诉,Cookie是由服务器端生成,发送给User-Agent,浏览器会将Cookie的key/value保存到某个目录下的文本文件内。我们可以定义一些参数放到cookie来做一些业务处理,也可一定量减轻业务复杂度。