Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Cookie 会话身份验证是如何工作的?

Cookie 会话身份验证是如何工作的?

作者头像
艾编程
发布于 2023-01-16 14:51:46
发布于 2023-01-16 14:51:46
1.1K00
代码可运行
举报
文章被收录于专栏:艾编程艾编程
运行总次数:0
代码可运行

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

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

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

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

  1. 用户访问登录页面后,输入相应的用户名和密码进行登录操作。
  2. 在客户端发起登录请求。一般在浏览器环境下,可以通过AJAX或者Form发起登录请求。
  3. 当服务器通过认证时,将为认证成功的用户创建一个Session,并存储Session信息。之后服务器会通过HTTP响应头来设置SessionId,即HTTP响应头中会包含 的响应头信息Set-Cookie。如果认证失败,则提示用户进行相关操作。
  4. 认证成功后,用户访问页面获取用户信息,此时客户端会在HTTP请求头中携带cookie信息。
  5. 服务端接收到客户端发起的请求,获取cookie中存储的SessionId来验证用户身份,验证通过后返回相应信息。

下面我将使用Koa来介绍Cookie-Session的认证过程。首先我们来定义首页的路由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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">注销</a>         </div>         ` ;   } else {     ctx.
   









“登录”);
}
});

在上面的代码中,我们首先会判断当前用户是否已经登录到web应用中。如果已登录,将显示与当前用户对应的问候消息。如果没有登录,会跳转到登录页面,所以我们需要注册登录页面的路由:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// router.js
路由器。get ( "/login" , ( ctx     ) => {
 if (ctx.session.user ) { ctx.redirect ( " /" );   } else { ctx.body     = ` <form method = "     post" action="/ login">       <p><label>用户名</label><input type="text" name="username" /></p>       <p><label>密码</label><input type="password" name="密码" /></p>       <button type="

当未登录的用户在浏览器中访问 http://localhost:3000/login地址时,会显示如下用户登录表单:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// router.js
路由器。post ( "/login" , async (ctx) => {
 try {
   const loginData = ctx.request . body ; const
  { username, password } = loginData;
   if (username === "bytefer" && password === "123 " ) {
     ctx. session . user = { userName : "bytefer" , userId : "007" };
     ctx. response . redirect ( "/"
  }否则{
     ctx。body = {代码:0,消息:“登录失败!” };
  }
} catch (err) {
   throw  new  Error ( "登录错误" );
}
});

在上面的代码中,我们使用ctx.request.body获取用户输入的用户名和密码,然后判断输入的用户名和密码是否完全匹配。当然,在真实的web项目中,通常会判断输入的信息与数据库user表中的信息一致。此外,为确保系统的安全,用户的密码将被加密或散列。如果输入的用户信息完全匹配,我们将当前登录的用户信息设置到该ctx.session.user属性并重定向到首页。并且如果用户信息不匹配,页面上会显示相应的错误信息。

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// router.js
路由器。get ( "/getUserInfo" , async (     ctx ) => {
 if ( ctx.session.user ) { const { userName, userId } = ctx.session.user ; ctx.body = ` < div         > UserName           : ${userName} , UserId: ${userId}         </div>       ` ;   } else {     ctx.body = { code : 0 , message :
   






“您还没有登录。” };
}
});

用户登录成功后,访问web应用中的其他路由时,会发起相应的HTTP请求,请求头中会自动携带当前用户的Cookie信息,如下图:

除了上述功能,我们还需要注册一个路由来处理用户注销操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// router.js
路由器。get ( "/logout" , async (   ctx ) => {
 ctx.session = null ; ctx.body = ` < h1   >成功注销</h1>   <a href="./login">登录</a>   ` ; });

同样我们看一下注销成功后服务器返回的HTTP响应报文:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// app.js
const  Koa = require ( "koa" );
const app = new  Koa ();
const session = require ( "koa-session" );
const bodyParser = require ( "koa-bodyparser" );

常量端口 = 3000 ;
const router = require ( "./router.js" );

const  CONFIG = {
 key : "sid" ,
 maxAge : 86400000 ,
 httpOnly: true ,
 signed : true ,
 rolling : false ,
 renew : false ,
 sameSite : null ,
};
应用程序。键= [ “bytefer” ];
应用程序。use ( async  function ( ctx, next     ) { try
{ await
   next ( );
} catch (err) {
   ctx.status = err.status || 500 ; ctx.type
= "html" ;
   CTX。body = "<p>系统错误</p>" ;
   CTX。应用程序。发出(“错误”,错误,ctx);
}
});
应用程序。使用(会话(配置,应用程序));
应用程序。使用( bodyParser ());
应用程序。使用(路由器。路由())。使用(路由器。allowedMethods());

应用程序。on ( "error" , ( err, ctx ) => {
 控制台. 日志(错误);
});

应用程序。listen (port, function ( ) {
 console . log ( `服务器运行在 http://localhost: ${port} ` );
});

Cookie-Session的认证过程已经介绍过了,最后总结一下这种认证方式存在的一些问题。

饼干的缺陷

  • 每次HTTP请求都会添加Cookies,无形中增加了流量。
  • 安全性差,攻击者可以利用本地 cookie 进行欺骗和 CSRF 攻击。
  • Cookie 大小限制在 4KB 左右,不足以满足复杂的存储要求。

会话缺陷

  • session保存在服务器端,如果短时间内有大量用户,会影响服务器的性能。
  • 可扩展性不好。当有多台服务器时,如何共享Session就会成为一个问题。也就是说当用户第一次访问服务器A,第二次请求转发给服务器B时,服务器B无从知晓其状态。

那么如何解决以上问题呢?解决方案之一是使用基于令牌的身份验证。在下一篇文章中,我将介绍JWT认证方式。有兴趣记得关注我哦。

如果需要更加全面的学好前端,也可以来参与我们的三十天学习计划,全程不涉及任何费用!这是一套免费的三十天挑战计划的课程体系,包含了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老师的博客-艾编程

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
鉴权实战 - Koa
Bearer token 组成:Header、payload(载荷)、Signature(签名) Header.Payload.Signature
Cellinlab
2023/05/17
4490
常见登录认证 DEMO
basic auth 是最简单的一种,将用户名和密码通过 form 表单提交的方式在 Http 的 Authorization 字段设置好并发送给后端验证
JS菌
2019/07/30
2.9K0
Koa2+MongoDB+JWT实战--Restful API最佳实践
Web API 已经在最近几年变成重要的话题,一个干净的 API 设计对于后端系统是非常重要的。
前端森林
2020/04/23
9.5K0
Koa2+MongoDB+JWT实战--Restful API最佳实践
Nuxt + Koa2 + Mongodb 手撸一个网上商城
文档地址:https://finget.github.io/2019/08/06/nuxt-koa-mongodb/
FinGet
2019/08/09
9.7K1
Nuxt + Koa2 + Mongodb 手撸一个网上商城
关于koa2,你不知道的事
koa 是一个基于 node 实现的一个新的 web 框架,它是由 express 框架的原班人马打造。特点是优雅、简洁、表达力强、自由度高。和 express 相比,它是一个更轻量的 node 框架,因为它所有的功能都通过插件来实现,这种插拔式的架构设计模式,很符合 unix 哲学。
lucifer210
2020/04/14
7480
关于koa2,你不知道的事
Koa与常用中间件的使用
Node.js 是一个异步的世界,官方 API 支持的都是 callback 形式的异步编程模型,这会带来许多问题,例如callback 的嵌套问题 ,以及异步函数中可能同步调用 callback 返回数据,可能会带来不一致性,为了解决以上问题 Koa 出现了。
越陌度阡
2020/11/26
4.6K0
Koa与常用中间件的使用
Node
想要实现其他复杂的操作和效果,都要依靠 宿主环境 提供API,目前,已经嵌入 JavaScript 的宿主环境有多种,最常见的环境就是 浏览器 和 操作系统 ;
jinghong
2020/05/09
10.8K0
Node
【Nodejs进阶】koa2+mySql用户注册和登录以及实现列表分页
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。
微芒不朽
2022/09/13
1.6K0
使用NodeJS实现JWT原理
JWT是json web token的简称,本文介绍它的原理,最后后端用nodejs自己实现如何为客户端生成令牌token和校验token 一 为什么需要会话管理 我们用 nodejs 为前端或者其他服务提供 resful 接口时,http 协议他是一个无状态的协议,有时候我们需要根据这个请求的上下获取具体的用户是否有权限,针对用户的上下文进行操作。所以出现了cookies session还有jwt这几种技术的出现, 都是对HTTP协议的一个补充。使得我们可以用HTTP协议+状态管理构建一个的面向用户的WE
用户1097444
2022/06/29
9410
使用NodeJS实现JWT原理
【从前端到全栈】- koa快速入门指南
随着技术的不断发展,前端工程师也被赋予了越来越多的职责。不再是从前只需要切个图,加个css样式就能完成任务的切图仔了。接下来这篇文章,完成一个简单的登录注册,能让你快速上手,成为一个‘小全栈工程师’,here we go !
用户2356368
2019/04/03
9030
【从前端到全栈】- koa快速入门指南
Web前端学习 第5章 node基础教程9 cookie与session
在说cookie与session的概念之前,我们讨论一个问题,那就是如何保持用户的登录状态。
学习猿地
2020/06/19
5260
使用 NodeJS 实现 JWT 原理
我们用nodejs为前端或者其他服务提供resful接口时,http协议他是一个无状态的协议,有时候我们需要根据这个请求的上下获取具体的用户是否有权限,针对用户的上下文进行操作。所以出现了cookies session还有jwt这几种技术的出现, 都是对HTTP协议的一个补充。使得我们可以用HTTP协议+状态管理构建一个的面向用户的WEB应用。
前端老王
2020/09/23
1.2K0
使用 NodeJS 实现 JWT 原理
前后端权限机制
本项目使用vue全家桶,axios和cube-ui cube-ui文档地址:https://didi.github.io/cube-ui/#/zh-CN/docs/quick-start
一粒小麦
2019/07/18
1.3K0
前后端权限机制
详解 Cookie,Session,Token
很久很久之前, Web基本都是文档的浏览而已。既然是浏览, 作为服务器, 不需要记录在某一段时间里都浏览了什么文档, 每次请求都是一个新的HTTP协议,就是请求加响应。不用记录谁刚刚发了HTTP请求, 每次请求都是全新的。
木子星兮
2020/10/09
2.1K0
详解 Cookie,Session,Token
Koa
koa本身不带路由,因此我们要引入第三方模块 cnpm i koa-router -D
切图仔
2022/09/14
6560
Koa
【Node】使用 koa 实现一个简单JWT鉴权
全称 JSON Web Token, 是目前最流行的跨域认证解决方案。基本的实现是服务端认证后,生成一个 JSON 对象,发回给用户。用户与服务端通信的时候,都要发回这个 JSON 对象。
GopalFeng
2022/08/01
1.7K0
【Node】使用 koa 实现一个简单JWT鉴权
一杯茶的时间,上手 Koa2 + MySQL 开发
凭借精巧的“洋葱模型”和对 Promise 以及 async/await 异步编程的完全支持,Koa 框架自从诞生以来就吸引了无数 Node 爱好者。然而 Koa 本身只是一个简单的中间件框架,要想实现一个足够复杂的 Web 应用还需要很多周边生态支持。这篇教程不仅会带你梳理 Koa 的基础知识,还会充分地运用和讲解构建 Web 应用必须的组件(路由、数据库、鉴权等),最终实现一个较为完善的用户系统。
一只图雀
2020/05/29
3.7K0
一杯茶的时间,上手 Koa2 + MySQL 开发
【案例】HTTP Cookie 的运行机制
HTTP(Hypertext Transfer protocol,超文本传输协议) 有一个很重要的特点:
Jimmy_is_jimmy
2023/09/07
3430
【案例】HTTP Cookie 的运行机制
前端小白玩转koa(一)
这里推荐一篇实用的文章:https://cloud.tencent.com/developer/article/2467267?shareByChannel=link
一起重学前端
2024/11/25
2090
Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
前言   前面一有写到一篇Node.js+Express构建网站简单示例https://cloud.tencent.com/developer/article/1020656   这篇还是用以前的例子, 用Node.js+Koa2构建   Koa:   https://github.com/koajs/koa http://koa.bootcss.com  (中文)   Koa就不多介绍了,前面也写过Express,同一个团队打造,前面也过express文章,对比着看,自然可以看出些优点! 搭
Porschev
2018/01/16
4.4K0
Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
相关推荐
鉴权实战 - Koa
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验