Cookie和Session关系和区别!

Cookie

HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息)。

每个HTTP请求都是完全独立的,服务端无法确认当前访问者的身份信息。

  • 无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。

所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态。

  • 这个状态用于告知服务端前后两个请求是否来自同一浏览器。

而这个状态需要通过 Cookie 或者 Session 去实现。

Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息。

实际上Cookie是服务器在本地机器上存储的一小段文本,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。

Cookie会根据 HTTP响应报文 里的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。

当下客户端再向服务端发起请求时,客户端会自动在请求报文中加入Cookie值之后发送出去。

之后服务端发现客户端发送过来的Cookie后,会检查是那个客户端发送过来的请求。

  • 然后对服务器上的记录,最后得到了之前的状态信息。
1
2
Set-Cookie: status=enable; expires=Wed, 13-Mar-2019 12:08:53 GMT; Max-Age=31536000; path=/;
domain=fafa.com;secure; HttpOnly;

如果给某个 Cookie 设置了 HttpOnly 属性,则无法通过 JS 脚本 读取到该 Cookie 的信息。

但还是能通过 Application 中手动修改 Cookie,所以只是在一定程度上可以防止 XSS 攻击,不是绝对的安全

Session

Session 是基于 Cookie 实现的,Session 存储在服务器端,SessionID 会被存储到客户端的 Cookie 中。

服务端执行Session机制时候会生成 SessionID 值,这个ID值会发送给客户端。

客户端每次请求都会把这个ID值放到HTTP请求的头部发送给服务端,而这个ID值在客户端会保存下来,保存的容器就是Cookie。

因此当我们完全禁掉浏览器的Cookie的时候,服务端的Session也会不能正常使用。

在这里插入图片描述

Session认证流程:

用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的 Session。

请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器。

浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名。

当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息。

如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID。

  • 再根据 SessionID 查找对应的 Session 信息。

Cookie与Session的区别:

安全性:

  • Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。

存取值的类型不同:

  • Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。

有效期不同:

  • Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能。
  • Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。

存储大小不同:

  • 单个 Cookie 保存的数据不能超过 3K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。