EarlyData
适用于 Fiber 的 Early Data 中间件增加了对 TLS 1.3 早期数据(“0-RTT”)功能的支持。引用 RFC 8446,当客户端和服务器共享 PSK 时,TLS 1.3 允许客户端在第一次传输(“早期数据”)中发送数据以加快请求速度,有效地将常规 1-RTT 请求减少为 0-RTT 请求。
在使用此中间件之前,请务必启用 Fiber 的 EnableTrustedProxyCheck
配置选项,以避免信任客户端的虚假 HTTP 请求头。
还要注意,在反向代理(例如 nginx,通过简单的 ssl_early_data on;
完成)中启用对早期数据的支持会使请求可重放。在继续之前,请参阅以下文档
- 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 请求方法的早期数据请求,否则拒绝请求,即在执行处理程序之前中止请求。此行为可由 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 | 当返回 true 时,Next 定义了一个函数来跳过此中间件。 | nil |
IsEarlyData | func(*fiber.Ctx) bool | IsEarlyData 返回请求是否为早期数据请求。 | 检查“Early-Data”标头是否等于“1”的函数 |
AllowEarlyData | func(*fiber.Ctx) bool | AllowEarlyData 返回是否应允许或拒绝早期数据请求。 | 拒绝不安全方法并允许安全方法的函数 |
错误 | error | 如果拒绝早期数据请求,则返回错误。 | 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"
)