gin-cookie介绍

453 阅读3分钟

「这是我参与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来做一些业务处理,也可一定量减轻业务复杂度。