一、 Cookie
-
Cookie的意义: HTTP的请求是无状态的, 每次请求结束以后就会断开. 所以服务器和客户端就不会保存任何链接信息. Cookie的出现可以将一些数据保存在客户端, 并且再次发起请求时同时发给服务器, 这样就相当于保存了这个数据, 服务器就可以根据这个数据做出相应的处理
-
如何设置Cookie
- 当客户端第一次发起请求时, 服务器肯定是不知道他的身份, 所以会生成一个唯一的数据, 通过"key=value"的格式, 放进响应报文的 "Set-Cookie"字段中. 浏览器收到以后会将Cookie存储起来
- 客户端第二次发送请求时, 会将之前存储的Cookie数据放在请求报文的 "Cookie"字段中, 服务器根据这个唯一的数据就可以知道客户端的身份, 并作出对应的处理
- 我们可以在浏览器的开发者工具中看到之前存储过的Cookie
-
Cookie的相关属性
- Cookie的有效期:
- Expires: 过期时间. 设置具体的时间点, 表示Cookie过期, 相当于过期时间
- Max-Age: 存活时间. 设置具体多少秒Cookie过期, 相当于保质期.
- 当与Expires同时出现时, 会优先使用Max-Age
- Cookie的作用域:
- Domain: 设置Cookie生效的域名
- Path: 设置Cookie生效的路径.
- 浏览器在发送Cookie前会检查host和path部分, 如果不满足条件, 就不会再请求头里添加Cookie
- Cookie的安全性:
- HttpOnly: 表示Cookie只能通过HTTP协议传输, 这样浏览器的脚本攻击就不能生效了(XSS)
- SameSite: 设置为"Strict"规定Cookie不能跨站发送, 设置为"Lax"则表示可以使用GET/HEAD等安全的方法, 不能使用POST跨站发送(XSRF)
- Secure: 表示Cookie只能通过HTTPS加密传输
- Cookie的有效期:
-
Cookie的应用
- 身份识别: 用户登录一个网站后, 使用Cookie来表示这个用户, 当再次请求时, 服务器拿到这个Cookie就知道了是哪个用户在操作
二、缓存
-
缓存的意义: 由于HTTP获取资源的成本比较高, 为了避免多次请求, 可以将拿到的数据缓存起来, 下次请求时可以直接使用. 然后在适当的时候进行更新数据, 这样就可以更快的响应数据
-
如何进行缓存: 浏览器发送请求, 获取服务器资源; 服务器返回资源同时标记资源有效期; 浏览器缓存资源, 在有效期内复用
-
如何控制缓存:
- 服务器和浏览器的报文会包含 "Cache-Control" 字段来控制
- max-age: 表示资源的保质期(与Cookie类似), max-age是从响应报文创建的时刻计算
- no_store: 表示不允许缓存
- no_cache: 表示可以缓存, 但是在每次使用缓存前都需要去查询是否过期
- must-revalidate: 表示可以缓存, 在缓存的有效期内可以使用
- 条件请求: "Cache-Control"负责控制刷新数据, 条件请求则控制如何使用缓存数据
- if-Modified-Since: 客户端将最后的修改时间发送到服务器, 服务器会跟资源的实际修改时间(Last-modified)对比, 如果一致, 会返回304(缓存重定向), 客户端会直接将缓存显示到浏览器; 如果不一致, 则返回200和新的内容, 客户端会将新资源进行缓存
- ETag: 服务器对资源的唯一标识, 用来解决资源修改时无法准确区分文件变化的问题
- If-None-Match: 服务器会在第一次返回请求时返回一个ETag, 客户端第二次请求时, 将ETag的值放进If-None-Match字段, 服务器会对比自己的ETag和客户端传入的进行 304/200的响应
- 服务器和浏览器的报文会包含 "Cache-Control" 字段来控制
三、HTTP代理服务器
-
代理的意义: 由于代理处于HTTP通信的中间位置, 对上游类似屏蔽了真实客户端, 对下游屏蔽了服务器, 这就为HTTP协议增加了更多的灵活性, 实现了客户端和服务器的双赢
-
代理的作用
- 负载均衡: 代理面向客户端时, 背后可以是多台服务器来处理请求, 面对大量并发请求时, 代理就可以通过负载均衡算法来平均的让所有服务器响应请求, 避免阻塞; 常见的负载均衡算法有:
- 随机法: 通过随机算法来选择对应服务器
- 加权随机: 对不同的服务器分配不同权重, 然后进行随机
- 轮询法: 按照顺序轮流分配到各个服务器, 不会关系服务器实际连接数和系统整体负载
- 加权轮询: 对不同的服务器分配不同权重, 然后进行轮询
- 源地址哈希: 对客户端地址的IP地址进行哈希计算, 映射到一个服务器; 这样同一个客户端的请求会一直由这个服务器响应
- 最小连接数: 动态选择当前积压最少的服务器进行响应
- 心跳检查: 实时监控服务器, 如果有故障就暂时踢出集群, 保证集群稳定性
- 安全防护: 可以过滤/限制IP地址或流量, 保护后端服务器
- 数据过滤: 拦截上下行数据, 根据策略修改请求和响应
- 内容缓存: 对服务器的响应进行缓存
- 负载均衡: 代理面向客户端时, 背后可以是多台服务器来处理请求, 面对大量并发请求时, 代理就可以通过负载均衡算法来平均的让所有服务器响应请求, 避免阻塞; 常见的负载均衡算法有:
-
代理的相关头字段:
- Via: 代理经过的每次代理都会将服务器信息(域名/主机名)追加到这个字段
- X-Forwarded-For: 与Via类似, 不过会追加IP地址
- X-Real-IP: 获取源客户度的真是IP地址
-
代理缓存控制:
- private: 表示只能缓存再客户端
- public: 完全开放, 谁都可以使用
- must-revalidate: 只要过期就必须回源服务器验证
- proxy-revalidate: 代理缓存过期后必须验证, 客户端只用验证到代理即可
- s-maxage: 缓存的有效时间
- no-transform: 代理缓存时不会对数据进行优化