EarlyData
用于 Fiber 的 Early Data 中间件增加了对 TLS 1.3 的 Early Data ("0-RTT") 功能的支持。引用 RFC 8446 的话,当客户端和服务器共享一个 PSK 时,TLS 1.3 允许客户端在第一轮通信("early data")中发送数据以加快请求速度,有效地将常规的 1-RTT 请求减少为 0-RTT 请求。
在使用此中间件之前,请确保启用 Fiber 的 EnableTrustedProxyCheck
配置选项,以免信任客户端伪造的 HTTP 请求头。
另请注意,在您的反向代理(例如 nginx,只需通过简单的 ssl_early_data on;
配置即可)中启用 early data 支持会使得请求可以重放。在继续之前,请参阅以下文档
- https://datatracker.ietf.org/doc/html/rfc8446#section-8
- https://blog.trailofbits.com/2019/03/25/what-application-developers-need-to-know-about-tls-early-data-0rtt/
默认情况下,此中间件仅允许对安全的 HTTP 请求方法使用 early data 请求,否则将拒绝该请求,即在执行您的处理程序之前终止请求。此行为可以通过 AllowEarlyData
配置选项控制。安全的 HTTP 方法 — GET
, HEAD
, OPTIONS
和 TRACE
— 不应该修改服务器上的状态。
签名
func New(config ...Config) fiber.Handler
示例
导入作为 Fiber web 框架一部分的中间件包
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/earlydata"
)
在初始化 Fiber 应用后,您可以使用以下方式
// Initialize default config
app.Use(earlydata.New())
// Or extend your config for customization
app.Use(earlydata.New(earlydata.Config{
Error: fiber.ErrTooEarly,
// ...
}))
配置
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
下一个 | func(*fiber.Ctx) bool | Next 定义了一个函数,当返回 true 时跳过此中间件。 | nil |
IsEarlyData | func(*fiber.Ctx) bool | IsEarlyData 返回请求是否为 early-data 请求。 | 检查 "Early-Data" 头是否等于 "1" 的函数 |
AllowEarlyData | func(*fiber.Ctx) bool | AllowEarlyData 返回 early-data 请求是否应该被允许或拒绝。 | 在不安全方法上拒绝、在安全方法上允许的函数 |
错误 | error | 当 early-data 请求被拒绝时返回的错误。 | fiber.ErrTooEarly |
默认配置
var ConfigDefault = Config{
IsEarlyData: func(c *fiber.Ctx) bool {
return c.Get(DefaultHeaderName) == DefaultHeaderTrueValue
},
AllowEarlyData: func(c *fiber.Ctx) bool {
return fiber.IsMethodSafe(c.Method())
},
Error: fiber.ErrTooEarly,
}
常量
const (
DefaultHeaderName = "Early-Data"
DefaultHeaderTrueValue = "1"
)