简短版
- Cookie是存储在浏览器的数据,会跟随HTTP请求发送到服务器
- Session是存储在服务器端的一系列数据,通常和指定的用户相关联(通过Cookie里的值)
详细版
Cookie
HTTP 协议是无状态的,为了让 HTTP 协议尽可能简单,使得它能够处理大量事务。HTTP/1.1 引入 Cookie 来保存状态信息。
Cookie 是服务器发送到浏览器并保存在本地的一小块数据(最大的存储容量是4KB),浏览器在之后向同一个服务器请求时会携带 Cookie 里存储的信息,用于标识请求是否来自与同一浏览器。
除了能接收服务器端传输的 Cookie 之外,浏览器也可以通过 document.cookie
创建新的 Cookie,同时也能通过该属性访问非 HttpOnly (标记为 HttpOnly 的 Cookie 不能被 js 脚本调用,可以在一定程度上避免跨站脚本攻击(XSS)) 的 Cookie。
Cookie 按照其生命周期通常分为两种
- 会话期 Cookie:浏览器关闭之后会自动删除,仅在会话器有效
- 持久性 Cookie:指定了过期时间和有效期的 Cookie
Session
Session 和 Cookie 类似,都是用来存储一些用户的信息。Session 存储在服务器端,存储在服务器端会让这些信息更加安全。Session 可以存储在服务器的内存、数据库和文件当中,也可以存在 Redis 这种内存型数据库中,效率会更高。
每一个 Session 都有一个唯一的 Session ID,用于查找、回溯存储的值。Session 被创建时,它的 Session ID 会以 Cookie 的形式返回给浏览器,如果浏览器不支持或者禁用了 Cookie,则会把 Session ID 放在 URL 参数里进行传递。
Session 维护用户登录信息的例子
- 用户登录,提交用户名和密码的表单,放到 HTTP 请求报文,发送登录的 HTTP 请求
- 服务器验证用户名和密码,如果校验成功,则把用户信息存储在 Redis 中,用户信息在 Redis 中的 Key 即为 Session ID
- 服务器返回 HTTP 响应,并在响应头中将 Session ID 作为Cookie 的值返回给客户端,客户端收到请求之后将 Session ID 存储在 Cookie 当中
- 客户端在后续的请求中会携带该 Cookie 值,服务器收到请求后会根据 Session ID 在 Redis 中取出用户信息,然后进行后续的业务操作
Cookie VS Session
Cookie | Session |
---|---|
Cookie 存储在客户端 | Session 存储在服务器端 |
Cookie 只能存储 ASCII 字符串 | Session 可以存储任意类型的数据 |
Cookie 最大能够存储4KB | Session 能够存储的最大容量一般没有限制 |
- Session 将信息存储在服务器,一定程度上要比 Cookie 更加安全
- Session 存储的数据类型要更多,因此在考虑复杂性的时候会优先选择 Session
- Cookie 不需要依赖 Session 就可以使用, 而 Session 通常会依赖于 Cookie,通过 Cookie 传递 Session ID(浏览器不支持或者禁用 Cookie时,Session ID 可以通过 URL 参数里进行传递)
网友评论