菜比之路

走菜比的路,让大牛说去吧
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

验证码实现原理

Posted on 2020-08-24 13:41  毕加索的ma  阅读(857)  评论(0编辑  收藏  举报

最简单的验证码

 

 

 

 

极验验证

 

 

 

 

扫码登录

 

 

 

 

12306验证码

 

 

 

先说结论吧

仔细了解了一番后,发现,其实 验证码 ,还是基于session原理 或者token原理

什么是session

这里推荐一本书《图解http》,里面讲解的很清楚。如果只是想简单的了解一下session,可以看看这个文章。

什么是token

token是另一种使用较多的鉴权方式,具体原理可以看一下JWT验证原理

session原理的验证码

流程图

 

session原理验证码

 

 

讲解

大致流程可见上图。
其实原理蛮简单。

  1. 服务端接收到请求,生成随机数作为验证码,然后保存在session对象中。
  2. 将验证码生成图片文件流。
  3. 将文件流返回给浏览器,并且将sessionId通过cookie形式保存到浏览器。
  4. 用户提交验证码,浏览器发送请求的时候,会自动带上cookie。
  5. 后端从cookie中解析到sessionId,然后从后端存储的session中,取到对应的session对象。
  6. 比对用户提交的验证码和服务器存储的验证码,相等则验证通过。

注意: 这种验证码,验证依赖cookie,如果在用户提交验证码数据之前,手动删除了cookie中的sessionId, 那么服务器就不能正确的拿到生成的验证码,这样即使用户输入的是正确的验证码,服务器也会判断为验证不通过。

 

token原理的验证码

token原理的验证码与session原理的验证码,很显著的区别是,session会保存在服务器端,token是保存在客户端。大致流程可以参考下图。

流程图

token原理验证码

 

 

 

 

讲解

这种类型的验证码,在 生成 验证码后,其实是将 正确 的验证码,一起返回给 客户端 了。

那么这种操作,安全吗?

回答是,相对较安全, 因为在生成token的时候,是需要签名的,只要这个签名没有被 破解 ,则是 安全 的。但是由于token是存储在客户端的,服务端并不存储,所以可以看做是无状态的。如果token在传输过程中被窃取,那么窃取者可以模拟客户端正常发送请求。这种情况服务端其实是并不知晓的,这种情况是不安全的,可以通过https来增强安全性。