zoukankan      html  css  js  c++  java
  • 验证码实现原理

    最简单的验证码

     

    极验验证

     

    扫码登录

     

    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来增强安全性。

  • 相关阅读:
    【JUC源码解析】AQS
    【JUC源码解析】Exchanger
    圣杯布局和双飞翼布局的理解和区别
    右侧固定宽度,左侧自适应屏幕的布局(笔试题)
    CSS和CSS3中的伪元素和伪类(总结)
    用CSS创建小三角形问题(笔试题常考)
    Pycharm下载安装和使用
    PIC33单片机中断服务函数写法(其他单片机同样适用)
    记录,ubuntu16.04将gitlab迁移到docker上遇到的一些问题与解决方法
    【算法】 算法效率
  • 原文地址:https://www.cnblogs.com/paulwinflo/p/13553412.html
Copyright © 2011-2022 走看看