服务器发送验证码给客户端是身份验证体系中的基础环节,整个流程涉及客户端请求、服务端生成、第三方渠道下发、用户回填校验四个核心阶段,需要保证安全性、时效性与可达性。以下是基于业界通用架构的完整实现流程。

一、客户端发起请求
用户在 App 或网页触发「获取验证码」操作后,客户端将手机号或邮箱地址(必要时加上图形验证码、行为验证 token 等风控凭证)通过 HTTPS 请求发送至服务端指定接口,如 GET/POST /api/sms/send。请求必须经过 TLS 加密传输,避免敏感信息在链路中被截获。
二、服务端校验与风控拦截
服务端接收请求后,首先进行参数格式校验(如手机号正则匹配),随后执行风控与限流策略:包括同一手机号 60 秒内禁止重复发送(频率限制)、单 IP / 单账号每日发送量上限、图形/滑块验证码校验等。通过校验后,服务端使用安全随机数生成器(如 SecureRandom)产生 4~6 位数字验证码,避免使用可预测的伪随机算法。
三、验证码的生成与缓存存储
生成的验证码不会直接下发,而是先以「手机号 + 验证码」的键值对形式写入Redis 等分布式缓存,并设置 5~10 分钟的过期时间(TTL)。同时可缓存发送次数、发送时间戳,用于后续防刷统计。对于高安全场景,还应在缓存中记录业务场景标识(注册/登录/找回密码),防止不同场景的验证码被混用。
四、调用第三方短信/邮件通道下发
绝大多数业务系统不直连运营商,而是通过短信服务商(如阿里云短信、腾讯云短信、Twilio 等)的 API 接口完成下发。服务端按服务商要求的协议(HTTP/HTTPS + 签名鉴权)组装请求,将手机号、签名、模板 ID 与验证码内容提交。模板需提前在平台审核备案,内容格式符合工信部短信内容规范。邮件场景则通过 SMTP 协议或邮件服务商 API 发送。发送成功后,服务端将发送状态(成功/失败)写入日志系统,用于后续的到达率统计与问题排查。
五、客户端回填与服务端校验
用户收到验证码并回填后,客户端将验证码提交至服务端校验接口。服务端从 Redis 中读取该手机号对应的缓存值,与用户提交值进行比对:一致则删除缓存(防止验证码被重复使用)并下发登录态或放行业务流程;不一致则返回错误提示,并记录失败次数,超过阈值(如 5 次)时使该验证码失效并锁定一段时间。
六、关键安全与可靠性机制
生产环境中必须包含以下保障措施:其一,验证码与用户身份强绑定,校验时不仅比对验证码,还要校验手机号、场景标识;其二,采用HTTPS + 接口签名防止请求伪造与重放攻击;其三,服务商接入失败时配置多通道容灾切换,并接入备用运营商;其四,全流程日志埋点,覆盖请求、生成、下发、校验各环节,便于在到达率下降时快速定位是运营商拦截、号码失效还是通道故障。其五,针对海外业务需考虑时区与国际号码格式处理,并选择具有全球覆盖能力的短信通道。

查看详情

查看详情