北川广海の梦

北川广海の梦

浅谈验证码

web
181
2020-05-08

验证码

一般来说为了防止服务器资源大量非法访问,或者进行人机验证,都必须要用到验证码。虽然现在很多验证码防不住了,不过咱先不关心这个。

验证机制

验证码防止机器的原因主要在于机器一般不能直接看图片嘛。。。不过现在技术越来越发达,所以我说可能防不住了。
服务器生成一个随机的Code码,然后根据这个码生成一张图片。将图片发送给客户端,客户端根据图片,识别出Code,并再提交给服务器。服务器验证你这个code和我生成的那个一不一样,一样的话就通过了。
验证码是并不能保证账户安全的,它只能保证使用这个账户登录的,是个正常的人类而已。

要保证账户安全,就需要额外的机制,例如短信验证码,邮箱验证码,这个以后再谈。

传统实现

上面说了,最关键的就是要验证你客户端提交的Code和我生成的Code是不是一样的。所以,我生成Code过后,得将它保存起来,并且设置过期时间,一般大概五分钟左右。并且保存的时候得保证我能知道这个验证码是为哪个客户端生成的。
所以使用session可能是最简单的做法,咱直接将Code保存在Session中,验证的时候直接从Session中取出来。Session本身就是为了区分不同的客户端而存在的,自然解决了这个问题。

分布式扩展

要实现分布式的验证码很简单,只需要能区分每个客户端对应的验证码就行了,别让他们搞混了。Redis我看就很合适,将验证码单独弄成WEB API独立出来,用户生成一个唯一的ID,例如UUID来请求验证码,服务器拿着这个ID去向验证码API要验证码,验证码API就将这个UUID和生成的Code存入Reids,然后把Code和图片给服务器,服务器再给客户端,验证的时候服务器再向验证码API发送验证请求就行。这样就可以将验证码直接独立出来,减少系统耦合。