验证码实现原理

为什么会写这篇文档

验证码 生活中使用的还挺频繁,一直都没了解过原理。因为这些我不懂,我也能做好前端工作。源于某天突然心血来潮,想了解一下实现原理。然后百度了半天,没发现一个很完整介绍文档,大多都是贴一段代码,介绍实现的代码。这些并不是我想了解的,我想了解的是原理,然后多方搜集,多方了解,就有了这篇文档。

生活中的各种验证码

验证码实现原理_第1张图片
最简单的验证码.png
验证码实现原理_第2张图片
极验验证.png
验证码实现原理_第3张图片
扫码登录.png
验证码实现原理_第4张图片
12306验证码.png

先说结论吧

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

什么是session

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

什么是token

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

session原理的验证码

流程图

验证码实现原理_第5张图片
session原理验证码.png

讲解

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

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

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

token原理的验证码

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

流程图

验证码实现原理_第6张图片
token原理验证码.png

讲解

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

那么这种操作,安全吗?

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

完整代码

完整代码

其他类型的验证码

扫码登录极验验证12306的验证码。这些类型的验证码原理,放在下一篇文章中解释吧。

你可能感兴趣的:(验证码实现原理)