01
概念
HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的HTTP协议记录稳定的状态信息成为了可能。
Cookie 主要用于以下三个方面:
02
创建 cookie
Cookie 的生命周期可以通过两种方式定义:
限制访问 Cookie:
有两种方法可以确保 Cookie 被安全发送,并且不会被意外的参与者或脚本访问:Secure 属性和 HttpOnly 属性。
标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端,因此可以预防 {{Glossary(“ MitM”,“ man-in-the -middle“)}} 攻击者的攻击。但即便设置了 Secure 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,Secure 标记也无法提供确实的安全保障, 例如,可以访问客户端硬盘的人可以读取它。
Domain 和 Path 标识定义了Cookie的作用域:即允许 Cookie 应该发送给哪些URL。
Domain 指定了哪些主机可以接受 Cookie。如果不指定,默认为 {{Glossary("origin")}},不包含子域名。如果指定了Domain,则一般包含子域名。因此,指定 Domain 比省略它的限制要少。但是,当子域需要共享有关用户的信息时,这可能会有所帮助。
Path 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)。以字符 %x2F ("/") 作为路径分隔符,子路径也会被匹配。
func (*gin.Context).SetCookie(name string, value string, maxAge int, path string, domain string, secure bool, httpOnly bool)
SetCookie 向响应头添加一个 Set-Cookie header。提供的 cookie 必须具有有效的名称,无效的 cookie 可能会被静默删除。
c.SetCookie("key", "lucy", 10, "/", "localhost", false, true)
03
读取 cookie
func (*gin.Context).Cookie(name string) (string, error)
Cookie 返回给定 cookie 名称的未转义的结果值,如果未找到则返回 ErrNoCookie,如果给定 cookie 名称存在多个,则只返回第一个 cookie 名称的结果值。
val, err := c.Cookie("key")
04
安全
信息被存在 Cookie 中时,需要明白 cookie 的值是可以被访问,且可以被终端用户所修改的。根据应用程序的不同,可能需要使用服务器查找的不透明标识符,或者研究诸如 JSON Web Tokens 之类的替代身份验证/机密机制。
当机器处于不安全环境时,切记不能通过 HTTP Cookie 存储、传输敏感信息。
缓解涉及Cookie的攻击的方法:
完整代码:
推荐阅读: