登录验证两种方案:token和cookie以及对比

这篇博客探讨了登录验证的两种方案——cookie和token,包括它们的工作原理、优缺点及使用场景。现代浏览器开始禁止第三方JS设置cookie,导致安全性提升。同时,介绍了JWT作为token实现方式以及在Egg.js框架中的应用。最后,讨论了数据库操作、ORM和数据库迁移,以及阿里云短信服务在实操中的应用。
摘要由CSDN通过智能技术生成

cookie

HTTP无状态,每次请求都要携带cookie,以帮助识别用户身份;
服务端也可以向客户端set-cookie,cookie大小限制为4kb;
cookie默认有跨域限制,不跨域共享和传递,例如:
在这里插入图片描述

现代浏览器开始禁止第三方JS设置cookie

和跨域限制不同,这里是指禁止网页引入的第三方JS设置cookie,例如你有一个手机性能对比的网站,用户可以在你这个网站上来参考手机的性能,只访问你的网页你是没啥收入的,如果你想获得更多的收入,那么你可以植入一些JD的广告,而广告内容可能是一个图片,代码如下:

<img src="jd.com?info='华为手机'" >

JD广告的js虽然访问不了你的cookie,因为cookie是不跨域共享的,但是可以拿到当前网页中的内容(它一看大概是和手机内容相关的),一旦你曾经登录过JD,那么上面的代码中的请求就会携带上你的cookie信息(jd就会知道你是谁),并顺路带上当前你访问的内容。

当有一天你访问JD时,你就会发现JD给你智能推荐你想要那款华为手机了。

在这里插入图片描述

因此,cookie新增了一个SameSite属性,用来防止CSRF攻击和用户追踪

SameSite有三个值,其中Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。

参考链接:cookie和token的区别

cookie 和 session

cookie在客户端,用于登录验证,存储用户标识 如useId;
session在服务端,存储用户详细信息,和cookie信息一一对应;
cookie+session是常见登录验证解决方案;
在这里插入图片描述

为什么要有session:

  1. 安全性
  2. cookie体积小,存储信息有限;
  3. cookie每次都会被携带,http携带信息少的话传输快;

cookie vs token

  • cookie是http规范,会自动传递;而token需要开发者手动自己传递;
  • cookie会被浏览器默认存储;而token需要自己存储(localstorage或sessionStorage);
  • token没有跨域限制;

cookie是官方的登录验证方案,但虽然互联网的发展,cookie暴露出很多限制,因此有了民间发起的token方式,更加灵活。

实现token的方案jwt(json web token)
  1. 前端发起登录,后端验证成功后,返回一个加密的token;
  2. 前端自行存储这个token(其中包括用户信息,加密了的,非对称加密);
  3. 以后访问服务端接口,都会携带这个token,作为验证信息;

token vs cookie 优缺点以及使用场景

参考链接: token vs cookie 优缺点以及使用场景

实战

使用Taro开发微信小程序进行登录

首先用户授权,授权之后通过getUserInfo() 接口获取用户的头像、昵称信息。

在 Egg.js 中,默认情况下 CSRF 中间件只会对 POST、PUT、DELETE、PATCH 等修改性请求进行 CSRF token 校验,而不会对 GET、HEAD、OPTIONS、TRACE 等非修改性请求进行校验。这是为了避免对一些不会对数据进行修改的请求增加额外的复杂性。

安装jwt和redis:

npm install egg-jwt egg-redis --save

TTL

ttl 的全称是 “Time To Live”,它表示缓存的生存时间或剩余生存时间。在缓存系统中,ttl 用来指示一个缓存条目在多长时间内有效,通常以秒为单位。当缓存的 TTL 达到 0 时,缓存条目将被自动清除,即缓存失效。

数据库

MySQL是一个流行的开源关系型数据库管理系统,它是由瑞典公司MySQL AB开发的,并由Oracle公司持有和维护。MySQL采用了客户端-服务器模型,可以在各种操作系统上运行,包括Linux、Windows和macOS等。它支持SQL(Structured Query Language)作为查询语言,并提供了丰富的功能和工具,使用户能够管理和操作数据库。MySQL被广泛应用于Web应用程序开发、数据存储和管理等领域,因其高性能、可靠性和易用性而备受青睐。

Redis是一个开源的内存数据库(In-Memory Database),也被称为数据结构服务器。它提供了一个键值对存储系统,并支持多种数据结构,如字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)等。Redis以其高性能、灵活性和丰富的功能而闻名,被广泛应用于缓存、会话存储、消息队列等场景。<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

. . . . .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值