目录
1. 什么是 Cookie? 为什么会产生 Cookie?
Cookie 就是服务器发送到用户浏览器并保存在本地的一小块数据. 它会在浏览器下次向同一服务器再次发起请求时被携带并发送到服务器上, 服务器就可以通过 Cookie 判断请求是否来自同一浏览器. 用户登录一次之后就可以长期保持登录状态的特性就是利用了 Cookie. 因此, Cookie 是在客户端浏览器中存储数据的.
产生 Cookie 的原因: 比如说, 每个人都可以在淘宝选购商品到购物车中, 由于购物车界面的 URL 是固定的, 按理来说, 原生的 HTTP 协议是一种无状态的协议, 所以无论是谁访问购物车的 URL, 得到的结果都是一样的. 然而, 现实生活中每个人的购物车都不同, 这里就使用到了 Cookie, Cookie 中存储了当前用户的信息, 因此, 即使访问相同的 URL, 也可以通过 Cookie 中的用户信息返回不同的购物车界面.
1. 1 Cookie 在 HTTP 协议中是如何表示的?
如果用户第一次访问任意 URL 时, 是不会带有 Cookie 请求头的.
只有服务器通过在 HTTP 响应信息中增加 set-cookie 响应头字段种下 cookie, 当用户再一次访问相同 URL 时, 就会带着 Cookie 请求头
1. 2 Cookie 的特性
- Cookie 信息是和种 Cookie 的 URL的域名绑定的. 换句话说, Cookie 可以在同域名下的多个网页中使用, 但是不能跨域名使用.
例如: Cookie 是由 www.huu.com 种的, 那么在访问 tieba.huu.com 中就可以带着这个 Cookie, 但是访问 www.qq.com 时, 就不可以使用该 Cookie. - Cookie 是具有过期时间的, 如果不设置 Cookie 的过期时间, 默认情况下, Cookie 的生命周期为浏览器会话时间, 一旦关闭浏览器, Cookie 就消失了.
2. 什么是 Session? 为什么需要使用 Session?
Session 是服务端和客户端的一次会话过程. 也可以理解为是在用户和网页或 web 程序交互的过程中保持信息的服务端存储.
需要使用 Session 的原因: 由于 Cookie 的信息是完全保存在浏览器上的, 一旦 Cookie 丢失, 用户信息就可能发生泄漏. 所以, Cookie 是不可以存储敏感信息的. 那么, 此时可以将用户的敏感信息存储在服务器上, 服务器通过一种算法生成一个唯一的 session-id, 将这个 session-id 存储在 Cookie 中, 之后浏览器再向服务器发出请求, 服务器就会通过该 session-id 查找用户信息并根据查到的用户信息进行不同的处理.
3. Cookie 和 Session 的区别
- 作用范围不同: Cookie 保存在浏览器上(客户端), Session 保存在服务端.
- 存取方式不同: Cookie 只能保存 ASCII 字符串, 而 Session 可以存储任意类型的数据.
- 有效时间不同: Cookie 的有效时间可以是浏览器的会话时间, 也可以设置成长时间保持, 例如我们进行登录后可以长时间保持登录状态. 而 Session 的有效时间较短, 客户端的关闭或者 Session 超时都会失效.
- Cookie 是在浏览器上进行存储的, 因此不是很安全, 无法存储一些敏感信息. 而 Session 是在服务端进行存储的, 相较之下比较安全.
- 存储大小不同, 单个 Cookie 保存的数据不能超过 4K, 而 Session 的存储容量远远大于 Cookie 的存储容量.
4 Cookie 和 Session 的联系
由于 HTTP 协议是一种无状态的协议, 所以浏览器无法辨认出是谁在请求服务端资源, 所以通常让 Cookie 和 Session 配合起来, 进而使服务器可以达到分辨不同用户的功能.
Cookie 和 Session 是通过 SessionID 进行配合的. 配合过程如图所示:
5. 因为服务端是通过 Cookie 中的信息来判断用户是否登录, 如果浏览器中禁用了 Cookie, 怎样保证整个机制的运转?
- 可以在每次请求中都带上 SessionID
- 可以使用 Post 方式提交
- 可以在请求的地址后面拼接上SessionID, 如: XXX?SessionID=xxx
- 可以使用 Token 机制. Token 机制类似于 Session 机制: 当用户第一次登陆, 服务端会将用户信息存成一个 Token , 返回给客户端, 之后客户端只需要带上 Token 就可以请求服务端数据了.