1. Cookie概述
HTTP cookie(网络cookie,浏览器cookie)是服务器发送给用户网络浏览器的一小部分数据。 浏览器可以存储它,并将下一个请求发回给同一台服务器。 通常,它用于判断两个请求是否来自同一浏览器 - 例如,保持用户登录。 它记住无状态HTTP协议的有状态信息。
Cookie的用途:
- 回话管理
记录登录,购物车,游戏分数或服务器应记住的任何其他内容 - 个性化
用户偏好,主题和其他设置 - 追踪
记录和分析用户行为
2. 如何创建Cookie
当收到一个HTTP请求时,服务器可以发送带响应的Set-Cookie头。 Cookie通常由浏览器存储,然后将cookie发送到Cookie HTTP标头中的同一服务器。 可以指定到期日期或持续时间,之后不再发送cookie。 此外,可以设置对特定域和路径的限制,限制cookie的发送位置。
Set-Cookie HTTP响应头将来自服务器的cookie发送给用户代理。 一个简单的cookie就像下面这样设置:
完整的响应头如下
设置Cookie后,每次请求都会带上设置的Cookie,请求如下:
3. 会话Cookie和持久性Cookie
- 没有设置
Expires
或者Max-Age
,当Client关闭后,Cookie也会消失,不会持久化. - 当我们设置
Expires
或者Max-Age
后,就会被持久化到客户端文件中.通常设置如下
4. Cookie的访问控制
安全Cookie只能通过HTTPS协议通过加密请求发送到服务器。 即使在安全的情况下,敏感信息也不应该存储在cookie中,因为它们本身就不安全,并且该标志不能提供真正的保护。 从Chrome 52和Firefox 52开始,不安全的网站(http:)无法使用Secure指令设置Cookie。
为了避免被XSS攻击,我们可以通过设置HttpOnly
头来减轻这种攻击,HttpOnly
表明不能通过JavaScript 的Document.cookie API来获取Cookie,而仅仅的发送给服务器.通常设置如下
控制Cookie的访问范围通过Domain和Path来控制
Domain=mozilla.org
即表明*.mozilla.org
可以访问CookiePath=/docs
即表明只能访问/docs/*
5. Cookie的安全性
Cookie通常用于Web应用程序中以识别用户及其已验证的会话,因此窃取cookie可能会导致劫持经过验证的用户会话。窃取cookie的常见方式包括社交工程或利用应用程序中的XSS漏洞。
当其他用户打开带有这个脚本的页面,就会运行这段程序,造成问题。
可以采用如下方式解决:
-
HttpOnly
来禁止使用js获取到Cookie. - 对用户的一些比较重要的操作进行验证
- 对输入进行验证,把用户的输入都文本化
另外一种常见的攻击就是CSRF(跨站域请求伪造)
试想下这样一种场景,当你登陆某个银行的网站之后,然后有个黑客放了个钓鱼地址,把你诱导到一个新的地址,接下来,页面就会发送下面这个请求,把你的钱转走了。
防止CSRF的手段有如下几种
- 和XSS一样,对输入进行过滤
- 对于用户的重要行为一定要进行验证
- 尽量对重要的cookie信息缩短Cookie的生存时间
6. Session
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;通常借助 cookie 本身和后端存储实现的,一种更高级的会话状态实现。session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
服务器会为每一个访问服务器的用户创建一个session对象,并且把session对象的id保存在本地cookie上,只要用户再次访问服务器时,带着session的id,服务器就会匹配用户在服务器上的session,根据session中的数据,还原用户上次的浏览状态或提供其他人性化服务。
通常来说,Session是一种更安全的方式,把信息保存时服务器端。但是它会占用服务器的内存,Session的信息一多,就会对服务器造成压力。
Session的生命周期是服务端设置的时间长短,一段时间没有active,就会失效。