概念
- cookie:服务器发送到用户浏览器并保存在本地的一小块数据,是客户端保存用户信息的一种机制,用来记录用户的一些信息,它会在浏览器下次在向同一服务器发起请求被携带并发送到服务器上。
- session:代表着客户端与服务器进行会话的一次过程,是服务端记录用户状态时用于标识具体用户的机制。当用户在应用程序的web页面之间跳转时,存储在session对象中的变量将不会丢失。
区别
- 作用范围不同:session保存在服务器端,cookie保存在客户端。
- 有效期不同:cookie可设置长时间保持,session在客户端关闭或者session超时都会失效。
- 隐私策略不同:cookie存储在客户端,比较容易被窃取进行cookie欺骗,session存储在服务器,安全性相对较高。
- 存储方式不同:cookie只能保存ASCII,session可以存任意数据类型。
- 存储大小不同, 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie。
- Session比较消耗服务器性能。
联系
- 当用户第一次请求服务器时,服务器根据用户提交的相关信息,创建一个session对象,返回时将此session的唯一标识信息sessionid返回给浏览器,浏览器会将此信息存入到cookie中,同时cookie会记录对应的域名。
- 当用户第二次请求时,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效。
- SessionID 是连接 Cookie 和 Session 的一道桥梁。
应用场景
- cookie:判断用户是否登录过网站;用来记录购物车或者记录用户使用偏好来制定推送;
- session:登录验证信息
拓展
- 浏览器禁止cookie
1)URl重写:在请求中携带sessionId的参数,也可以 Post 的方式提交,也可以在请求的地址后面拼接 xxx?SessionID=123456…
2)Token机制:当用户第一次登录后,服务器根据提交的用户信息生成一个 Token,响应时将 Token 返回给客户端,以后客户端只需带上这个 Token 前来请求数据即可,无需再次登录验证。 - 分布式 Session
1)Session 复制,任何一个服务器上的 Session 发生改变(增删改),该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点。
2)共享 Session,服务端无状态,将用户的 Session 等信息使用缓存中间件来统一管理,保障分发到每一个服务器的响应结果都一致。
3)Nginx ip_hash 策略,服务端使用 Nginx 代理,每个请求按访问 IP 的 hash 分配,这样来自同一 IP 固定访问一个后台服务器,避免了在服务器 A 创建 Session,第二次分发到服务器 B 的现象。
参考文献:
https://www.cnblogs.com/ityouknow/p/10856177.html
https://www.cnblogs.com/8023-CHD/p/11067141.html