Cookie vs. Session

  • HTTP Cookie( Web Cookie或浏览器 Cookie)是服务器发送到浏览器并保存在浏览器的一小块数据
  • 在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
    通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。
  • Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能

主要用途:

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

什么是 Session

  • 代表服务器和客户端一次会话的过程
  • 存储特定用户会话所需的属性及配置信息
    这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
  • 客户端关闭会话,或者 Session 超时失效时会话结束
  • 作用范围:Cookie 保存在客户端(浏览器),Session 保存在服务器端
  • 存取方式:Cookie 只能保存 ASCII,Session 可以存任意数据类型
    (一般情况下我们可以在 Session 中保持一些常用变量信息,比如说 UserId 等)
  • 隐私策略:
    • Cookie 存储在客户端,比较容易遭到不法获取
    • Session 存储在服务端,安全性相对 Cookie 要好一些
  • 存储大小:单个 Cookie 保存的数据不能超过4K,Session 可存储数据远高于 Cookie

CookieSession如何配合?

Cookie vs. Session

  • 浏览器无状态(HTTP协议无状态),需要CookieSession配合实现识别跟踪用户
  • SessionID是连接CookieSession的一道桥梁,大部分系统也是根据此原理来验证用户登录状态
  • 每次请求中都携带一个SessionID的参数
    (使用POST提交或请求地址后拼接xxx?SessionID=123456...
  • TOKEN机制
    (Token 机制多用于 App 客户端和服务器交互的模式,也可以用于 Web 端做用户状态管理)
  • Token 的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识
  • Token 机制和 Cookie 和 Session 的使用机制比较类似

服务器根据用户首次操作提交信息生成 Token,响应时返回给客户端;以后客户端每次请求都需携带此 Token

如何考虑分布式 Session 问题?

  • Nginx ip_hash 策略
    (服务端使用 Nginx 代理,每个请求按访问 IP 的 hash 分配;绑定请求 IP 与后端服务器)
  • Session 复制
    (任何一个服务器上的 Session 发生改变(增删改),该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点)
  • Session 共享
    (将用户的 Session 等信息使用缓存中间件来统一管理,保障分发到每一个服务器的响应结果都一致)

如何解决跨域请求?

同源策略:Same origin policy,是浏览器最核心也最基本的安全功能。指协议+域名+端口三者相同,即便两个不同的域名指向同一个 IP 地址,也非同源。

解决跨域请求的常用方法:

  • 代理
    (使用Nginx在后端转发请求,避免了前端出现跨域的问题)
  • JSONP
  • 其他

Jsonp跨域的原理是什么?

  • 浏览器的同源策略把跨域请求都禁止了,但是页面中的 <script><img><iframe>标签是例外,不受同源策略限制
  • Jsonp就是利用 <script> 标签跨域特性进行跨域数据访问

与服务端约定好一个回调函数名,服务端接收到请求后,将返回一段 Javascript,在这段 Javascript 代码中调用约定好的回调函数,并且将数据作为参数进行传递。

当网页接收到这段 Javascript 代码后,就会执行这个回调函数,这时数据已经成功传输到客户端了

缺点是:它只支持 GET 请求,而不支持 POST 请求等其他类型的 HTTP 请求

参考:

Cookie vs. Session

上一篇:loj#6187. Odd


下一篇:leetcode——两数之和