cookie-session

目录

一、cookie 和 session

1、cookie

2、session

3、总结:

二、cookie 设置


一、cookie 和 session

       cookie 和 session 都是一块存储区域,主要是给服务端用的(当然客户端可以使用 cookie),作用:(1)认证客户端(2)区别存取与客户端相关的数据。

1、cookie

(1)cookie 是什么

       存储在客户端,即在客户端/浏览器端划分出的一块存储区。存储的是一条一条的记录,每条记录由多个 k-v 键值对组成,其中一个为主体,即数据,其他为针对该条记录的配置,如过期时间、http-only等。

       每次请求时,请求头 Cookie 字段将复制 cookie 存储的 记录。

(2)存储权限

       客户端和服务端都可以向 cookie 中存储记录。

       客户端自然可以存取 cookie 中的记录。

       服务端通过在 response 中设置 "Set-Cookie" 字段来向客户端追加/设置 cookie。

(3)cookie 的作用

       a. 认证

       客户端在登录成功后,服务端生成令牌,将令牌存储,并将 令牌 放在 cookie 中(或返回令牌后由客户端放入 cookie 中),在之后的请求中,服务端每次从 Cookie 中取令牌,验证令牌是否存储。

       cookie 存令牌有 csrf、xss 攻击风险,是不安全的,安全的做法是:

       客户端在登录成功后,服务端生成令牌,将令牌存储,并将 令牌 返回给 客户端(不存入 cookie),在之后的请求中,客户端将令牌放入 Header 中(设置一个新字段如X-Token),服务端每次从 Header 中取令牌,验证令牌是否存储。

       b. 区分客户端,存储与客户端相关的数据

       数据在客户端存储,减轻了服务器的数据存储压力,尤其是客户端比较多的情况,如CC攻击。

       数据靠客户端存储,敏感数据不便存储,即便加密也不是很安全。

       每次请求都需要携带 cookie 的数据,加大了网络传输的压力,只适应于小数据量。

2、session

(1)session 是什么

       存储在服务端,即在服务端划分出的一块存储区域,但它并没有规定具体存储在哪里,可以是内存、文件、缓存中间件、数据库等。

       session 相对于 cookie,只是把 数据存储 从 客户端 转移到了 服务端,相当于 在服务端 为每个客户端 开辟了一块 专用存储区。

       对于每个客户端,生成一个 sessionid 存入 cookie,这样每次请求时,通过 Cookie 字段中的 sessionid 即可索引到对应的 session 区域。

(2)存储权限

       session 是服务端自维护的,只有服务端才能将数据存入 session。

       对于客户端来说,只能看到 cookie 中有一条 sessionid 的记录,看不到 session 中存储的数据。

(3)session 的作用

       a. 认证

       客户端在登录成功后,服务端生成令牌,将令牌存入 session,并将 令牌 放在 cookie 中(或返回令牌后由客户端放入 cookie 中),在之后的请求中,服务端每次从 Cookie 中取令牌,验证令牌是否存储在 session 中。

       cookie 存令牌有 csrf、xss 攻击风险,是不安全的,安全的做法是:

       客户端在登录成功后,服务端生成令牌,将令牌存入 session,并将 令牌 返回给 客户端(不存入 cookie),在之后的请求中,客户端将令牌放入 Header 中(设置一个新字段如X-Token),服务端每次从 Header 中取令牌,验证令牌是否存储在 session 中。

       b. 区分客户端,存储与客户端相关的数据

       数据在服务端存储,数据安全,减轻了数据传输压力,且可以存储的数据量大。

       数据在服务端存储,客户端比较多,数据量比较大的情况下占用的存储多。

3、总结:

(1)cookie 和 session 都是一块存储区域,主要是给服务端用的(当然客户端可以使用 cookie),作用:区别存取与客户端相关的数据。

(2)cookie 存储在客户端,每次请求时请求头携带 Cookie,这样服务端就能获取客户端数据。

(3)session 存储在服务端,只是将 sessionid 存储在 客户端(默认存 cookie,也可以不存 cookie),服务端拿到每次请求的 sessionid,就可以索引到对应的 session 存储区,获取客户端数据。

(4)session 相对于 cookie,只是将 客户端数据存储 由 客户端 转移到了 服务端,相当于服务端为每个客户端开辟了一块专用存储区。cookie 存储小,可以存储不敏感的信息,session 存储大,比较安全。 

(5)出于安全考虑,cookie 不存令牌,容易遭到 csrf、xss 攻击。

二、cookie 设置

1、参数设置

//func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)

	var (
		name     = "user"
		value    = form.User
		maxAge   = 10 //s
		path     = "/"
		domain   = ""
		secure   = true
		httpOnly = true
	)
	c.SetCookie(name, value, maxAge, path, domain, secure, httpOnly)

	// MaxAge=0 means no 'Max-Age' attribute specified.
	// MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
	// MaxAge>0 means Max-Age attribute present and given in seconds

//func (c *Context) Cookie(name string) (string, error) 
    value, _ := c.Cookie("key")

2、参数简介

(1)Max-Age

过期:    >0                   >0

不过期:session           =0

删除       -                      <0

(2)HttpOnly

       HttpOnly 是加在 cookie 记录上的一个标志,该标识告诉浏览器不要将 cookie 展示给客户端。设置该选项可以有效避免 XSS 攻击(攻击者可通过 XSS 脚本获取 cookie 内容)。

       当设置 HttpOnly 标识后,浏览器就会知道到这是特殊的 cookie,只能由服务器检索到,所有来自客户端脚本的访问都会被禁止,前提是使用新版的浏览器(>= IE6)。

(3)Security

       Security 标志会强制浏览器通过 HTTPS 等加密通道发送 cookie,这会阻止窃听,尤其是当 HTTPS 连接通过 SSLStrip 等工具降级为 HTTP 时。

3、Cookie 与跨域

       根据同源策略,cookie 是区分端口的,但是对浏览器来说,cookie是区分域,不区分端口的,在一个ip地址下多个端口的 cookie 是共享的。

[ Security ] WEB安全 ( 三 ) 之 Cookie安全策略

Cookie的Secure属性

cookie在不同端口号可以共享吗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值