Cookie和Session

1. Cookie概述

HTTP cookie(网络cookie,浏览器cookie)是服务器发送给用户网络浏览器的一小部分数据。 浏览器可以存储它,并将下一个请求发回给同一台服务器。 通常,它用于判断两个请求是否来自同一浏览器 - 例如,保持用户登录。 它记住无状态HTTP协议的有状态信息。
Cookie的用途:

  • 回话管理
    记录登录,购物车,游戏分数或服务器应记住的任何其他内容
  • 个性化
    用户偏好,主题和其他设置
  • 追踪
    记录和分析用户行为
2. 如何创建Cookie

当收到一个HTTP请求时,服务器可以发送带响应的Set-Cookie头。 Cookie通常由浏览器存储,然后将cookie发送到Cookie HTTP标头中的同一服务器。 可以指定到期日期或持续时间,之后不再发送cookie。 此外,可以设置对特定域和路径的限制,限制cookie的发送位置。

Set-Cookie HTTP响应头将来自服务器的cookie发送给用户代理。 一个简单的cookie就像下面这样设置:


image.png

完整的响应头如下


Cookie和Session_第1张图片
image.png

设置Cookie后,每次请求都会带上设置的Cookie,请求如下:


image.png
3. 会话Cookie和持久性Cookie
  • 没有设置Expires 或者Max-Age,当Client关闭后,Cookie也会消失,不会持久化.
  • 当我们设置Expires 或者Max-Age后,就会被持久化到客户端文件中.通常设置如下
image.png
4. Cookie的访问控制

安全Cookie只能通过HTTPS协议通过加密请求发送到服务器。 即使在安全的情况下,敏感信息也不应该存储在cookie中,因为它们本身就不安全,并且该标志不能提供真正的保护。 从Chrome 52和Firefox 52开始,不安全的网站(http:)无法使用Secure指令设置Cookie。
为了避免被XSS攻击,我们可以通过设置HttpOnly 头来减轻这种攻击,HttpOnly表明不能通过JavaScript 的Document.cookie API来获取Cookie,而仅仅的发送给服务器.通常设置如下

image.png

控制Cookie的访问范围通过Domain和Path来控制
Domain=mozilla.org 即表明 *.mozilla.org可以访问Cookie
Path=/docs即表明只能访问 /docs/*

5. Cookie的安全性

Cookie通常用于Web应用程序中以识别用户及其已验证的会话,因此窃取cookie可能会导致劫持经过验证的用户会话。窃取cookie的常见方式包括社交工程或利用应用程序中的XSS漏洞。


image.png

当其他用户打开带有这个脚本的页面,就会运行这段程序,造成问题。
可以采用如下方式解决:

  • HttpOnly来禁止使用js获取到Cookie.
  • 对用户的一些比较重要的操作进行验证
  • 对输入进行验证,把用户的输入都文本化

另外一种常见的攻击就是CSRF(跨站域请求伪造)
试想下这样一种场景,当你登陆某个银行的网站之后,然后有个黑客放了个钓鱼地址,把你诱导到一个新的地址,接下来,页面就会发送下面这个请求,把你的钱转走了。

image.png

防止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,就会失效。

你可能感兴趣的:(Cookie和Session)