HTTP学习笔记(四)

192 阅读6分钟

一、 Cookie

  1. Cookie的意义: HTTP的请求是无状态的, 每次请求结束以后就会断开. 所以服务器和客户端就不会保存任何链接信息. Cookie的出现可以将一些数据保存在客户端, 并且再次发起请求时同时发给服务器, 这样就相当于保存了这个数据, 服务器就可以根据这个数据做出相应的处理

  2. 如何设置Cookie

    1. 当客户端第一次发起请求时, 服务器肯定是不知道他的身份, 所以会生成一个唯一的数据, 通过"key=value"的格式, 放进响应报文的 "Set-Cookie"字段中. 浏览器收到以后会将Cookie存储起来
    2. 客户端第二次发送请求时, 会将之前存储的Cookie数据放在请求报文的 "Cookie"字段中, 服务器根据这个唯一的数据就可以知道客户端的身份, 并作出对应的处理
    3. 我们可以在浏览器的开发者工具中看到之前存储过的Cookie
  3. Cookie的相关属性

    1. Cookie的有效期:
      • Expires: 过期时间. 设置具体的时间点, 表示Cookie过期, 相当于过期时间
      • Max-Age: 存活时间. 设置具体多少秒Cookie过期, 相当于保质期.
      • 当与Expires同时出现时, 会优先使用Max-Age
    2. Cookie的作用域:
      • Domain: 设置Cookie生效的域名
      • Path: 设置Cookie生效的路径.
      • 浏览器在发送Cookie前会检查host和path部分, 如果不满足条件, 就不会再请求头里添加Cookie
    3. Cookie的安全性:
      • HttpOnly: 表示Cookie只能通过HTTP协议传输, 这样浏览器的脚本攻击就不能生效了(XSS)
      • SameSite: 设置为"Strict"规定Cookie不能跨站发送, 设置为"Lax"则表示可以使用GET/HEAD等安全的方法, 不能使用POST跨站发送(XSRF)
      • Secure: 表示Cookie只能通过HTTPS加密传输
  4. Cookie的应用

    1. 身份识别: 用户登录一个网站后, 使用Cookie来表示这个用户, 当再次请求时, 服务器拿到这个Cookie就知道了是哪个用户在操作

二、缓存

  1. 缓存的意义: 由于HTTP获取资源的成本比较高, 为了避免多次请求, 可以将拿到的数据缓存起来, 下次请求时可以直接使用. 然后在适当的时候进行更新数据, 这样就可以更快的响应数据

  2. 如何进行缓存: 浏览器发送请求, 获取服务器资源; 服务器返回资源同时标记资源有效期; 浏览器缓存资源, 在有效期内复用

  3. 如何控制缓存:

    1. 服务器和浏览器的报文会包含 "Cache-Control" 字段来控制
      • max-age: 表示资源的保质期(与Cookie类似), max-age是从响应报文创建的时刻计算
      • no_store: 表示不允许缓存
      • no_cache: 表示可以缓存, 但是在每次使用缓存前都需要去查询是否过期
      • must-revalidate: 表示可以缓存, 在缓存的有效期内可以使用
    2. 条件请求: "Cache-Control"负责控制刷新数据, 条件请求则控制如何使用缓存数据
      • if-Modified-Since: 客户端将最后的修改时间发送到服务器, 服务器会跟资源的实际修改时间(Last-modified)对比, 如果一致, 会返回304(缓存重定向), 客户端会直接将缓存显示到浏览器; 如果不一致, 则返回200和新的内容, 客户端会将新资源进行缓存
      • ETag: 服务器对资源的唯一标识, 用来解决资源修改时无法准确区分文件变化的问题
      • If-None-Match: 服务器会在第一次返回请求时返回一个ETag, 客户端第二次请求时, 将ETag的值放进If-None-Match字段, 服务器会对比自己的ETag和客户端传入的进行 304/200的响应

三、HTTP代理服务器

  1. 代理的意义: 由于代理处于HTTP通信的中间位置, 对上游类似屏蔽了真实客户端, 对下游屏蔽了服务器, 这就为HTTP协议增加了更多的灵活性, 实现了客户端和服务器的双赢

  2. 代理的作用

    1. 负载均衡: 代理面向客户端时, 背后可以是多台服务器来处理请求, 面对大量并发请求时, 代理就可以通过负载均衡算法来平均的让所有服务器响应请求, 避免阻塞; 常见的负载均衡算法有:
      • 随机法: 通过随机算法来选择对应服务器
      • 加权随机: 对不同的服务器分配不同权重, 然后进行随机
      • 轮询法: 按照顺序轮流分配到各个服务器, 不会关系服务器实际连接数和系统整体负载
      • 加权轮询: 对不同的服务器分配不同权重, 然后进行轮询
      • 源地址哈希: 对客户端地址的IP地址进行哈希计算, 映射到一个服务器; 这样同一个客户端的请求会一直由这个服务器响应
      • 最小连接数: 动态选择当前积压最少的服务器进行响应
    2. 心跳检查: 实时监控服务器, 如果有故障就暂时踢出集群, 保证集群稳定性
    3. 安全防护: 可以过滤/限制IP地址或流量, 保护后端服务器
    4. 数据过滤: 拦截上下行数据, 根据策略修改请求和响应
    5. 内容缓存: 对服务器的响应进行缓存
  3. 代理的相关头字段:

    1. Via: 代理经过的每次代理都会将服务器信息(域名/主机名)追加到这个字段
    2. X-Forwarded-For: 与Via类似, 不过会追加IP地址
    3. X-Real-IP: 获取源客户度的真是IP地址
  4. 代理缓存控制:

    1. private: 表示只能缓存再客户端
    2. public: 完全开放, 谁都可以使用
    3. must-revalidate: 只要过期就必须回源服务器验证
    4. proxy-revalidate: 代理缓存过期后必须验证, 客户端只用验证到代理即可
    5. s-maxage: 缓存的有效时间
    6. no-transform: 代理缓存时不会对数据进行优化

系列目录

HTTP学习笔记(一)

HTTP学习笔记(二)

HTTP学习笔记(三)

HTTP学习笔记(四)

HTTP学习笔记(五)

HTTP学习笔记(六)