Cookie

因为HTTP是无状态的,所以HTTP1.1引入cookie来保存状态信息。

概念

cookie采用的是客户端的会话状态的一种储存机制。它是服务器在本地机器上存储的小段文本或者是内存中的一段数据,并随每一个请求发送至同一个服务器。但由于每一次请求都需要携带cookie,所以会带来额外的开销。
(但现在cookie慢慢被淘汰,使用Web storage API和IndexedDB)

用途

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

创建过程

  1. 首先客户端向服务器发送http请求,但是这是第一次请求,所以没有cookie。
  2. 服务器接收到后,要求客户端设置cookie,所以返回一个set-cookie=xxx首部字段
  3. 客户端就想cookie=xxx存在自己的浏览器中
  4. 当客户端再次对同一个服务器发送请求时,会从浏览器中取出 Cookie 信息并通过 Cookie 请求首部字段发送给服务器

cookie分类

  • 会话期cookie:浏览器关闭后cookie会被自动删除
  • 持久性cookie:通过指定过期时间(Expires)或有效期(max-age)而变成持久性。

cookie有哪些字段可以设置

  1. name:cookie的名字
  2. value:cookie的值
  3. domain:可以访问cookie的域名
  • 如果不指定,默认为当前文档的主机(不包含子域名)。如果指定,则一般包含子域名。
  • 顶级域名只能设置domain为顶级域名。否则cookie无法生成。
  • 二级域名只能设置为顶级域名或者自身,不能读取
  1. path:可以访问该cookie的页面路径
  2. expires、max-age:cookie超时时间,不设置的话默认值为session。
  3. size:cookie大小
  4. http:httponly属性,如果为true,则只有http请求头会带有次cookie信息,不能通过document.cookie来访问,在一定程度避免XSS攻击
  5. secure:设置是否只能通过https来传递此条cookie

Cookie如何防范XSS攻击:

1、什么是XSS攻击:XSS攻击是跨站脚本攻击,攻击者通过注入恶意的脚本,在用户浏览网页的时候进行攻击(分为存储型和反射型)。
存储型是把一些数据存在数据库,当用户浏览到时进行攻击。
反射型是不存在数据库,而是将攻击代码放在url地址的请求参数中,防御用httponly,对用户的输入进行检查,进行特殊字符过滤。
2、XSS防御思路:对输入和url参数进行过滤,对输出进行编码,对提交的所有东西进行过滤。然后偶对动态输出到页面的内容进行html编码,使脚本无法在浏览器中运行。
为了减轻这些攻击需要在http头部配上set-cookie

  • httponly:禁止js脚本访问cookie
  • secure:告诉浏览器尽在请求为https的时候发送cookie

Session

Session可以存储在服务器上的文件、数据库或内存中。

session维护用户登录状态过程

  1. 用户登录时提交用户名和密码,封存在http请求报文中
  2. 服务器验证用户名和密码,正确则存在Redis中,key为SessionID
  3. 服务器返回的响应报文中带有set-cookie首部,包含了这个sessionID。客户端收到后,将cookie保存。
  4. 之后客户向同一个服务器请求时,会包含此cookie,服务器收到后取出sessionID,取出用户信息。

Cookie和Session的区别

  1. cookie数据保存在客户的浏览器上,session保存在服务器。
  2. cookie不是很安全,别人可以分析存在浏览器的cookie。为安全应用session。cookie一般用来保存不敏感的信息,如网站的主题,session用来保存用户的登录信息等等
  3. session会在一定时间内保存在服务器上,当访问增多,会占用服务器性能,考虑减轻服务器性能,应用cookie
  4. 单个cookie保存的数据不能超过4k,许多浏览器都限制一个站点最多保存20个cookie
    5、cookie只能存储ASCII字节码,而Session可以存储任何类型的数据,考虑数据复杂度时首选session。