Node.js/Express/TS场景下为何将邮箱验证令牌存在数据库而非数组?
邮箱验证JWT存储方案相关问题解答
为什么不建议将JWT存储在本地数组
- 本地数组属于进程内存存储,服务重启、发版、宕机都会导致所有未校验的令牌直接丢失,用户收到的激活链接会直接失效,严重影响使用体验。
- 多实例部署场景下存在硬伤:负载均衡架构中用户的激活请求不一定会落到发送邮件时存储令牌的服务节点,其他节点的内存数组中没有对应令牌,会直接返回校验失败,基本无法用于生产环境的分布式部署。
- 无容量限制,恶意批量注册会直接占满服务内存,触发OOM导致服务崩溃。
令牌存储到数据库专属表的核心优势
- 持久化存储不受服务生命周期影响,多节点共享存储,完美适配重启、多实例部署等生产场景,不会出现无故校验失败的问题。
- 可实现更多业务管控逻辑:比如限制同一用户的激活邮件发送频率、查询待激活的令牌列表、批量清理过期令牌等。
- 方便排查问题:用户反馈激活失败时,可以直接查询数据库中令牌的状态、过期时间、生成时间等信息,快速定位问题原因。
校验成功后是否需要删除令牌
建议校验通过后立即物理删除令牌或者将令牌标记为已使用状态,不要保留有效可用的激活令牌:
- 避免激活链接被泄露后,在有效期内被恶意调用,即使你已经修改了用户激活状态,也可能被恶意请求刷接口,存在安全隐患。
- 无效令牌占用数据库存储空间,定期清理或者用完即删可以降低存储成本,提升查询效率。
内容的提问来源于stack exchange,提问作者nikolardlvc
相关产品推荐
相关产品推荐

