基于Echo框架的Cookie限流方案实践

小墨姑娘_4567

小墨姑娘_4567

2026-11-11

262人浏览

原创

仅靠c.Cookie("token")做限流不可靠,因Cookie由客户端控制,可被伪造、篡改或重放;必须结合服务端签名验证、时效校验与Redis状态计数,才能实现安全有效的限流。

基于echo框架的cookie限流方案实践

直接用 Cookie 做限流不可靠,必须配合服务端存储 + 签名校验,否则前端可伪造、篡改、重放。

为什么不能只靠 c.Cookie("token") 做限流判断

Cookie 是客户端可控的,c.Cookie() 读出来的值未经验证,攻击者可手动构造请求头或修改浏览器 Cookie 绕过限制。常见错误包括:

  • 仅检查 cookie.Value != "" 就放行
  • 把 cookie.MaxAge 当作限流窗口,忽略服务端时间漂移和并发写入冲突
  • 未对 Cookie 值做签名或加密,导致 token 可被解码、篡改后重复使用

真正有效的限流必须满足:可验证来源(签名)、有时效性(服务端控制)、有状态(服务端计数)。

用 signed cookie + Redis 实现每用户每小时 10 次请求

核心思路是:生成带签名和过期时间的 Cookie,服务端解析时校验签名与时间,并在 Redis 中维护该用户的计数器。

  • 签名密钥必须保密且长度 ≥ 32 字节,用 crypto/rand.Read() 生成,不要硬编码
  • Cookie 的 Value 存的是 base64 编码后的 userID|timestamp|signature,不是明文 ID
  • 每次请求先调用 c.Cookie("user_token"),再用 securecookie.Decode()(推荐 github.com/gorilla/securecookie)校验并解包
  • 解包成功后,提取 userID,拼成 Redis key 如 rate:limit:user:abc123:202611(按小时分片),用 INCR + EXPIRE 原子操作
  • 若 INCR 返回值 > 10,立即返回 http.StatusTooManyRequests

示例关键片段:

NotebookLM CLI Cookies
NotebookLM CLI Cookies

使用 nlm CLI 检索并回答已上传至 NotebookLM 的文档问题。适用于用户需要查找信息、总结来源或查询特定笔记本时。

下载
func rateLimitByCookie(next echo.Handler) echo.Handler {
	return echo.HandlerFunc(func(c echo.Context) error {
		cookie, err := c.Cookie("user_token")
		if err != nil {
			return echo.NewHTTPError(http.StatusUnauthorized, "missing or invalid token")
		}
		var payload struct {
			UserID    string `json:"uid"`
			Timestamp int64  `json:"ts"`
		}
		if err := secureCookie.Decode("user-token", cookie.Value, &payload); err != nil {
			return echo.NewHTTPError(http.StatusUnauthorized, "invalid signature")
		}
		if time.Now().Unix()-payload.Timestamp > 3600 {
			return echo.NewHTTPError(http.StatusUnauthorized, "token expired")
		}

		key := fmt.Sprintf("rate:limit:user:%s:%s", payload.UserID, time.Now().Format("200601"))
		count, err := rdb.Incr(ctx, key).Result()
		if err != nil {
			return err
		}
		if count == 1 {
			rdb.Expire(ctx, key, 3600*time.Second)
		}
		if count > 10 {
			return echo.NewHTTPError(http.StatusTooManyRequests, "too many requests")
		}
		return next.ServeHTTP(c.Response(), c.Request())
	})
}

Cookie 设置细节决定限流是否生效

限流 Cookie 不是普通会话 Cookie,它需要更严格的传输与存储控制:

  • MaxAge 和 Expires 必须设为短周期(如 3600),且两者只设其一;同时设可能被浏览器忽略
  • Secure 必须为 true(仅 HTTPS 传输),否则中间人可劫持 token
  • HttpOnly 必须为 true,防止 XSS 注入后 JS 读取并滥用
  • SameSite 推荐 Lax 或 Strict,避免 CSRF 场景下被第三方站点携带
  • Domain 字段要显式设置(如 .example.com),否则子域名间无法共享,导致限流不一致

设置时务必用 c.SetCookie() 传入完整 *http.Cookie 实例,禁用 http.SetCookie() —— 后者绕过 Echo 中间件链,可能被后续日志或压缩中间件覆盖 Header。

容易被忽略的边界问题

真实部署中,以下三点最容易出问题:

  • Redis 连接超时或失败时,限流逻辑应降级为“放行”而非 panic 或阻塞,否则整个服务不可用
  • 用户注销或换设备后,旧 Cookie 仍可能在浏览器里残留,需配合服务端主动失效机制(如黑名单 key rate:blocked:uid)
  • 同一用户多标签页并发请求,Redis INCR 虽原子,但若限流窗口内刚好卡在第 10 次和第 11 次之间,可能漏判——需加 GETSET 或 Lua 脚本保证精确性

限流不是加个中间件就完事,它本质是服务端状态 + 客户端凭证 + 时间窗口的三方协同,任何一环松动都会让策略失效。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

2023.06.30

12819

10

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.23

1326

5

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

884

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1986

14

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

60

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

20

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

40

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

60

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

40

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Revel 官方 app.conf 文档
Revel 官方 app.conf 文档

共0课时 | 0人学习

php注册登录系统开发实战
php注册登录系统开发实战

共10课时 | 13.8万人学习

PHP基于Cookie的购物车模块设计
PHP基于Cookie的购物车模块设计

共10课时 | 11.1万人学习