cookie 会话身份验证如何工作?

  备案动态     |      2023-09-18
cookie 会话身份验证如何工作?

在Web应用程序中,Cookie-Session是一种标准的身份验证方法。饼干,又称“甜饼干”。类型为“小文本文件”,是指一些网站为了识别用户身份而存储在客户端的数据。 Session的主要作用是通过服务器记录用户的状态。

在典型的在线购物场景中,用户浏览多个页面并将一些商品添加到购物车。但是系统并不知道哪个用户执行了操作,因为HTTP协议是无状态的,所以服务器需要为不同的用户创建对应的Session来识别和跟踪用户。服务器端保存Session的方式有很多种,比如保存到内存、数据库或者文件中。

我们看一下Cookie-Session的认证过程:

这是HTTP 客户端(浏览器)和运行在同一台计算机(本地主机)上的HTTP 服务器之间的典型对话,包括以下步骤。

用户访问登录页面后,输入相应的用户名和密码进行登录。在客户端发起登录请求。一般情况下,在浏览器环境下,可以通过AJAX或者Form来发起登录请求。当服务器认证通过后,会为认证成功的用户创建一个Session,并保存Session信息。之后,服务器会通过HTTP响应头设置SessionId,即HTTP响应头中包含的响应头信息Set-Cookie。如果认证失败,则提示用户执行相关操作。认证成功后,用户访问页面获取用户信息。这时客户端就会在HTTP请求头中携带cookie信息。服务器接收客户端发起的请求,获取cookie中存储的SessionId来验证用户身份,验证通过后返回相应信息。下面我将使用Koa来介绍Cookie-Session的认证过程。首先我们定义一下首页的路由:

//router.js 路由器。 get ( '/' , async ( ctx )={ if (ctx.session.user ) { const { userName }=ctx.session.user ; ctx.body=` h1 Cookie /Session Authentication/h1 你好,${userName } div a href='./getUserInfo' 用户信息/a a href='./logout' logout/a /div ` ; } else { ctx."login"); }});在上面的代码中,我们首先会判断当前用户是否已经登录到Web应用程序。如果登录,则会显示与当前用户相对应的问候消息。如果没有登录,会跳转到登录页面,所以我们需要注册登录页面的路由:

//router.js 路由器。 get ( '/login' , ( ctx )={ if (ctx.session.user ) { ctx.redirect ( ' /' ); } else { ctx.body=` 表单方法=' post' action='/登录' plabel username/labelinput type='text' name='username' //p plabel password/labelinput type='password' name='password' //p 按钮type='未登录用户访问时复制浏览器http://localhost:3000/登录地址,会显示如下用户登录表单:

当用户输入用户名和密码并点击登录按钮时,浏览器会发起POST请求并调用/loginAPI。对应的/login路由处理逻辑如下:

//router.js 路由器。 post ( '/login' , async (ctx)={ try { const loginData=ctx.request . body ; const { 用户名, 密码}=loginData; if (用户名==='bytefer' 密码==='123 ' ) { ctx.session.user={ userName : 'bytefer' , userId : '007' }; ctx.response .redirect('/' } else { ctx.body={ code: 0, message: "登录失败!" } ; }} catch (err) { throw new Error('登录错误');}}); 复制上面的代码中,我们使用ctx.request.body来获取用户输入的用户名和密码,然后进行判断输入的用户名和密码是否完全匹配,当然,在实际的web项目中,通常会判断输入的信息与数据库的用户表中的信息是否一致,另外,为了保证用户的安全系统会对用户的密码进行加密或哈希处理,如果输入的用户信息完全匹配,我们将当前登录的用户信息设置到ctx.session.user属性中,并重定向到主页。而如果用户信息不匹配匹配时,页面上会显示相应的错误信息。

我们看一下登录成功后服务器返回的HTTP响应消息:

从上图可以看出,登录成功后,服务器返回的HTTP响应消息中会包含Set-Cookie响应头。之后我们打开Chrome开发者工具的Application Tab页面,可以看到已经设置的cookie信息:

对于大多数Web应用程序来说,一般都会提供一个用户信息页面,让用户可以查看当前已成功登录的用户信息。这里我们还注册了一个/getUserInfo 路由来显示登录的用户信息:

//router.js 路由器。 get ( '/getUserInfo' , async ( ctx )={ if ( ctx.session.user ) { const { userName, userId }=ctx.session.user ; ctx.body=` div 用户名: ${userName} , 用户ID: ${userId} /div ` ; } else { ctx.body={ code : 0 , message : "您尚未登录。" };}});用户登录成功后,在Web应用中访问其他路由时,会发起相应的HTTP请求,请求头中会自动携带当前用户的cookie信息,如下图:

除了上面的函数之外,我们还需要注册一个路由来处理用户注销操作:

//router.js 路由器。 get ( '/logout' , async ( ctx )={ ctx.session=null ; ctx.body=` h1 成功注销/h1 a href='./login'login/a ` ; });复制同样的我们看一下注销成功后服务器返回的HTTP响应消息:

已经描述了Web 应用程序中包含的路由。为了应用程序能够正常运行,我们还需要创建一个Koa应用程序并配置koa-session和koa-bodyparser等中间件。具体代码如下:

//app.js const Koa=require('koa'); const app=new Koa(); const session=require('koa-session'); const bodyParser=require('koa-bodyparser'); const port=3000 ;const router=require ( './router.js' );const CONFIG={ key : 'sid' , maxAge : 86400000 , httpOnly: true ,signed : true ,rolling : false , renew : false , sameSite : null ,} ;应用程序。 key=["bytefer"];应用。 use ( async function ( ctx, next ) { try{ wait next ( );} catch (err) { ctx.status=err.status || 500 ; ctx.type='html' ; ctx.body='p 系统错误/p'; ctx.app.issue("错误", 错误, ctx); } });应用程序。使用(会话(配置,应用程序));应用。使用(bodyParser());应用。使用(router.routing())。使用(router.allowedMethods());应用。 on ( '错误' , ( err, ctx )={ console.log(err); });应用。 Listen (port, function ( ) { console .log ( `服务器运行在http://localhost: ${port} ` );});已经介绍了复制Cookie-Session的认证过程,最后总结一下现有的一些认证方法的问题。

cookie 缺陷

Cookie 会添加到每个HTTP 请求中,这实际上增加了流量。安全性差,攻击者可以利用本地cookie进行欺骗和CSRF攻击。 Cookie 大小限制在4KB 左右,不足以满足复杂的存储需求。会话缺陷

会话保存在服务器端。如果短时间内有大量用户,服务器的性能就会受到影响。可扩展性不好。当有多台服务器时,如何共享Session就成了一个问题。也就是说,当用户第一次访问服务器A,第二次请求转发到服务器B时,服务器B无法知道其状态。那么如何解决以上问题呢?解决方案之一是使用基于令牌的身份验证。在下一篇文章中,我将介绍JWT认证方法。有兴趣记得关注我。

如果您需要更全面地学习前端,也可以来参加我们的30天学习计划,该计划不涉及任何费用!这是一套免费的30天挑战计划课程体系,包括html+css+云部署的课程体系,可以通过钉钉群学习,可以在群里提问,而且每堂课也有作业,有阶段性项目练习和综合项目实战,目的是帮助大家夯实前端基础,轻松入门前端行业

为帮助到一部分同学不走弯路,真正达到一线互联网大厂前端项目研发要求,首次实力宠粉,打造了《30天挑战学习计划》,内容如下:

HTML/HTML5、CSS/CSS3、JavaScript,真实企业项目开发,云服务器在线部署,从入门到熟练

PC端项目开发(1) 手机WebApp开发(2) 多端响应式开发(1) 共4个完整项目开发!一行行代码引领实践开发,我们做企业实际开发做的事。从学习开始就进入工作状态,以免浪费时间。

从学习开始同步使用Git管理项目代码的版本,并用Markdown记录学习笔记,包括真实大厂项目的开发标准和设计规范、命名规范、项目代码规范、SEO优化规范

从蓝湖UI设计稿到PC端、移动端、多端响应式开发项目开发

真机调试、云服务在线部署; Linux环境下部署Nginx,Nginx性能优化; Gzip压缩、HTTPS加密协议、域名服务器归档、分析;企业项目域名重定向、多站点、多系统部署的终极解决方案;使用Git在线项目部署;这些内容在“30天挑战学习计划”中都被覆盖到了每一个细节,包括视频+图文教程+项目资料等,只为实力爱好者,真正一次性掌握企业项目开发必备技能,无需少走弯路!

过程中【不涉及】任何费用和利益,非诚勿扰 。

如果你没有添加助理老师微信,可以添加下方微信,说明要参加30天挑战学习计划,来自公众号!老师会邀请你进入学习,并给你发放相关资料。

30天挑战学习计划Web前端从入门到实战| arry老师的博客-Aiprogramming