#登录鉴权——(cookie&session)&JWT

登录鉴权是业务系统中常见的功能:

​ 当登录系统时,如果不是系统的内置用户,则需要提示并引导用户注册,如果是已经注册过的用户,在登录时要判断其输入的用户名和密码是否匹配,如匹配则跳转至首页,如不匹配,则提示用户名和密码错误重新输入;另一种场景是当登录安全性较高的系统时,假设长时间停在某一个页面未进行其他操作,比如某些银行的移动客户端,停留在某个页面三十分钟未进行操作,再次进入的时候会提示长时间未操作请重新登录,然后引导跳转至登录界面重新登录。

​ 下面概述一下实现原理:

​ 在数据库我们会默认留一个用户,并且分发给每个用户一个令牌,首次登录需要判断输入的用户名和密码是否正确,如不正确,需要提示用户输入正确的用户名和密码;如正确,判断令牌是否在有效时间内,如果有效则正常登录进行操作,如果失效则提示重新登录并生成新的令牌传给后端进行校验。

​ 以上功能需要前后端配合实现,下面分别记录一下利用cookie和session实现校验以及利用JWT(JSONWebToken)来实现

一、cookie和session实现登录鉴权

cookie介绍:

Cookie是一种存储在客户端浏览器中的数据,它的作用是让浏览器记住一些信息,以便在后续的请求中使用。当浏览器访问某个网站时,它会发送一个 请求给服务器,请求的内容会包含一些信息,如用户ID、访问时间等。服务器在收到请求后会生成一个Cookie,并将它存储在客户端浏览器中。在后续的 请求中**,浏览器会将生成的Cookie再次发送给服务器**,服务器在接收到Cookie后,可以识别出它是之前发送过的请求,从而简化后续请求的处理流程,提 高网站的性能。

​ cookie是有大小限制的,它的大小取决于服务器和浏览器设置的具体限制,当cookie过大时会造成浏览器缓存过多,影响服务器的性能。

​ 总的来说,Cookie的作用是提高网站的性能和用户体验,它可以让服务器更好地理解用户的行为,从而生成更个性化的内容,或提供更好的搜索和登录体 验。

总结:大小受限,存储在浏览器的客户端,可手动设置,会随每次请求传到服务端

session介绍:

Session是一种在Web应用程序中实现用户状态的方法。通过Session,Web应用程序可以在用户登录后将用户状态保存在客户端的浏览器中,以便在后续的请求中使用。具体来说,Session可以用于以下场景:

用户登录时保存用户信息:用户在登录时,服务器将用户信息保存到Session中,然后在后续的请求中使用这些信息。

保存用户信息:用户在浏览某个页面时,可以将一些信息(如登录状态、购物车内容等)保存在Session中,以便在后续的页面中使用。

记住用户的搜索历史:当用户在搜索框中输入关键字并点击搜索时,服务器会将用户的搜索历史保存在Session中,以便在用户后续的搜索请求中使用。
总的来说,Session可以提高Web应用程序的用户体验和性能,因为它可以让服务器记住用户的特定信息,并在后续的请求中使用这些信息,从而简化服务器端的工作流程。

在Web应用程序中,Session的大小限制通常取决于服务器端和客户端的具体设置。
服务器端:在服务器端,我们可以通过在Session中设置过期时间来限制其大小。通过设置过期时间,服务器可以确保在一定的时间内使用完保存的信息,从而避免过大的Session对服务器性能造成影响。
客户端:**在客户端,我们可以通过在浏览器设置Cookie大小时限来限制其大小。**通过设置Cookie大小时限,用户可以确保浏览器不会保存过多的信息,从而避免影响后续请求的性能。

​ 总结:存储在客户端,方便存取,大小需要限制

实现流程

​ 将每次用户登录的相关信息(用户名,id等)都存储在cookie中,随着请求传递到服务端,然后后端将这些信息单独存储在数据库中生成一个id, 将这个id返回给客户端,客户端将接收到的sessionID存储在localStorage或者sessionStorage中,随后在每次向服务端的请求中客户端都将读取并将该值写入cookie传递给服务端,服务端判断max-age和cookie对应关系的算法来判断传入的cookie是否是有效的,如果是则返回正确的数据,如果不是则返回401,提示重新登录。

由于暂时写的不是前后端分离的,我们依然利用ejs模板来写前端,后端采用插件:express-session

首先安装express-session: npm i express-session

1.在app.js中进行配置:
1.在app.js中进行配置:
// express-session引入
const expressSession = require('express-session')

//注册session中间件
// [注]:配置一定要放在路由和api文件之前
app.use(expressSession({
   
      name: 'cjSystem', //名称
      secret: 'secret',//密钥
      cookie: {
   
        maxAge: 1000 * 60 * 60 //一个小时
      },
      resave: true, //表示重新设置session之后,cookie的过期时间会重新计算,必须设置
      saveUninitialized: true, //表示一开始就设置cookie,但是此时cookie是无效的,除非登录之后设置
      secure: false,//值为true时表示只能在https中访问cookie,为false时表示可以在http中访问cookie
      store:MongoStore.create({
   
          mongoUrl:'mongodb://10.45.126.221:27017/cj_session',//新创建一个数据库 存储session
          ttl: 1000 * 60 *60 //与上述cookie的时间保持一致
      })
    }
))

// 设置中间件: session过期校验
app.use((req,res,next) => {
   
    //排除login相关的路由
    if(req.url.includes('login')){
   
        next()
    }else if(req.session.user){
   
        // 重新设置session,刷新c
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值