目前没有可用的登录服务器处理登录请求_前端登录,这一篇就够了

登录是每个网站中都经常用到的一个功能,在页面上我们输入账号密码,敲一下回车键,就登录了,但这背后的登录原理你是否清楚呢?今天我们就来介绍几种常用的登录方式。

  • Cookie + Session 登录
  • Token 登录
  • SSO 单点登录
  • OAuth 第三方登录

Cookie + Session 登录

HTTP 是一种无状态的协议,客户端每次发送请求时,首先要和服务器端建立一个连接,在请求完成后又会断开这个连接。这种方式可以节省传输时占用的连接资源,但同时也存在一个问题: 每次请求都是独立的 ,服务器端无法判断本次请求和上一次请求是否来自同一个用户,进而也就无法判断用户的登录状态。

为了解决 HTTP 无状态的问题, Lou Montulli 在 1994 年的时候,推出了 Cookie。

Cookie 是服务器端发送给客户端的一段特殊信息,这些信息以文本的方式存放在客户端,客户端每次向服务器端发送请求时都会带上这些特殊信息。

有了 Cookie 之后,服务器端就能够获取到客户端传递过来的信息了,如果需要对信息进行验证,还需要通过 Session。

客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个便是 Session 对象。

有了 Cookie 和 Session 之后,我们就可以进行登录认证了。

Cookie + Session 实现流程

Cookie + Session 的登录方式是最经典的一种登录方式,现在仍然有大量的企业在使用。

用户首次登录时:

7173cf66803ebf1799827a3d451cba78.png
a.com/pageA

服务器端的 SessionId 可能存放在很多地方,例如:内存、文件、数据库等。

第一次登录完成之后,后续的访问就可以直接使用 Cookie 进行身份验证了:

09e1cc1a253e8a785426382894ec755b.png
a.com/pageB 

Cookie + Session 存在的问题

虽然我们使用 Cookie + Session 的方式完成了登录验证,但仍然存在一些问题:

  • 由于服务器端需要对接大量的客户端,也就需要存放大量的 SessionId,这样会导致服务器压力过大。
  • 如果服务器端是一个集群,为了同步登录态,需要将 SessionId 同步到每一台机器上,无形中增加了服务器端维护成本。
  • 由于 SessionId 存放在 Cookie 中,所以无法避免 CSRF 攻击。

Token 登录

为了解决 Session + Cookie 机制暴露出的诸多问题,我们可以使用 Token 的登录方式。

Token 是服务端生成的一串字符串,以作为客户端请求的一个令牌。当第一次登录后,服务器会生成一个 Token 并返回给客户端,客户端后续访问时,只需带上这个 Token 即可完成身份认证。

Token 机制实现流程

用户首次登录时:

bd3501455ae8b4f32042651c634b60e6.png
  1. 用户输入账号密码,并点击登录。
  2. 服务器端验证账号密码无误,创建 Token。
  3. 服务器端将 Token 返回给客户端,由 客户端自由保存

后续页面访问时:

b45fb214d24a610702ebb3a643456420.png
a.com/pageB

Token 机制的特点

根据上面的案例,我们可以分析出 Token 的优缺点:

  • 服务器端不需要存放 Token,所以不会对服务器端造成压力,即使是服务器集群,也不需要增加维护成本。
  • Token 可以存放在前端任何地方,可以不用保存在 Cookie 中,提升了页面的安全性。
  • Token 下发之后,只要在生效时间之内,就一直有效,如果服务器端想收回此 Token 的权限,并不容易。

Token 的生成方式

最常见的 Token 生成方式是使用 JWT(Json Web Token),它是一种用于通信双方之间传递安全信息的简洁的、URL安全的表述性声明规范。

上文中我们说到,使用 Token 后,服务器端并不会存储 Token,那怎么判断客户端发过来的 Token 是合法有效的呢?

答案其实就在 Token 字符串中,其实 Token 并不是一串杂乱无章的字符串,而是通过多种算法拼接组合而成的字符串,我们来具体分析一下。

JWT 算法主要分为 3 个部分:header(头信息),playload(消息体),signature(签名)。

header 部分指定了该 JWT 使用的签名算法:

header = '{"alg":"HS256","typ":"JWT"}'   // `HS256` 表示使用了 HMAC-SHA256 来生成签名。

playload 部分表明了 JWT 的意图:

payload = '{"loggedInAs":"admin","iat":1422779638}'     //iat 表示令牌生成的时间

signature 部分为 JWT 的签名,主要为了让 JWT 不能被随意篡改,签名的方法分为两个步骤:

  1. 输入 base64url 编码的 header 部分、 .base64url 编码的 playload 部分,输出 unsignedToken。
  2. 输入服务器端私钥、unsignedToken,输出 signature 签名。
const base64Header = encodeBase64(header)
const base64Payload = encodeBase64(payload)
const unsignedToken = `${base64Header}.${base64Payload}`
const key = '服务器私钥'

signature = HMAC(key, unsignedToken)

最后的 Token 计算如下:

const base64Header = encodeBase64(header)
const base64Payload = encodeBase64(payload)
const base64Signature = encodeBase64(signature)

token = `${base64Header}.${base64Payload}.${base64Signature}`

服务器在判断 Token 时:

const [base64Header, base64Payload, base64Signature] = token.split('.')

const signature1 = decodeBase64(base64Signature)
const unsignedToken = `${base64Header}.${base64Payload}`
const signature2 = HMAC('服务器私钥', unsignedToken)

if(signature1 === signature2) {
  return '签名验证成功,token 没有被篡改'
}

const payload =  decodeBase64(base64Payload)
if(new Date() - payload.iat < 'token 有效期'){
  return 'token 有效'
}

有了 Token 之后,登录方式已经变得非常高效,接下来我们介绍另外两种登录方式。

SSO 单点登录

单点登录指的是在公司内部搭建一个公共的认证中心,公司下的所有产品的登录都可以在认证中心里完成,一个产品在认证中心登录后,再去访问另一个产品,可以不用再次登录,即可获取登录状态。

SSO 机制实现流程

用户首次访问时,需要在认证中心登录:

ec244cbdc3069c994a7ee30dbd8e5400.png
  1. 用户访问网站 a.com 下的 pageA 页面。
  2. 由于没有登录,则会重定向到认证中心,并带上回调地址 www.sso.com?return_uri=a.com/pageA ,以便登录后直接进入对应页面。
  3. 用户在认证中心输入账号密码,提交登录。
  4. 认证中心验证账号密码有效,然后重定向 a.com?ticket=123 带上授权码 ticket,并将认证中心 sso.com 的登录态写入 Cookie。
  5. a.com 服务器中,拿着 ticket 向认证中心确认,授权码 ticket 真实有效。
  6. 验证成功后,服务器将登录信息写入 Cookie(此时客户端有 2 个 Cookie 分别存有 a.comsso.com 的登录态)。

认证中心登录完成之后,继续访问 a.com 下的其他页面:

cb5746fc202be24a2ff00503e7612e51.png

这个时候,由于 a.com 存在已登录的 Cookie 信息,所以服务器端直接认证成功。

如果认证中心登录完成之后,访问 b.com 下的页面:

7eea41bcd9e12d88e6a697a28a942d04.png

这个时候,由于认证中心存在之前登录过的 Cookie,所以也不用再次输入账号密码,直接返回第 4 步,下发 ticket 给 b.com 即可。

SSO 单点登录退出

目前我们已经完成了单点登录,在同一套认证中心的管理下,多个产品可以共享登录态。现在我们需要考虑退出了,即:在一个产品中退出了登录,怎么让其他的产品也都退出登录?

原理其实不难,可以回过头来看第 5 步,每一个产品在向认证中心验证 ticket 时,其实可以顺带将自己的退出登录 api 发送到认证中心。

当某个产品 c.com 退出登录时:

c.com
sso.com

OAuth 第三方登录

在上文中,我们使用单点登录完成了多产品的登录态共享,但都是建立在一套统一的认证中心下,对于一些小型企业,未免太麻烦,有没有一种登录能够做到开箱即用?

其实是有的,很多大厂都会提供自己的第三方登录服务,我们一起来分析一下。

1c144ebf68cbc6e70a997299e4c6b852.png

OAuth 机制实现流程

这里以微信开放平台的接入流程为例:

e9c93ba743d08eb168a8c43e33cc1d95.png
a.com
a.com
a.com
a.com?code=123
a.com
a.com
a.com

总结

本文介绍了 4 种常见的登录方式,原理应该大家都清楚了,总结一下这 4 种方案的使用场景:

  • Cookie + Session 历史悠久,适合于简单的后端架构,需开发人员自己处理好安全问题。
  • Token 方案对后端压力小,适合大型分布式的后端架构,但已分发出去的 token ,如果想收回权限,就不是很方便了。
  • SSO 单点登录,适用于中大型企业,想要统一内部所有产品的登录方式。
  • OAuth 第三方登录,简单易用,对用户和开发者都友好,但第三方平台很多,需要选择合适自己的第三方登录平台。
  • 前端30K面试准备,最完整面试真题分享!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生运动会管理系统是一种针对大学生运动会管理的信息化系统,主要用于管理运动员、比赛项目、比赛场馆、裁判员等相关信息,以及赛事安排、成绩统计等工作。在这篇毕设中,我们将使用Spring Boot框架开发一个基于Web的大学生运动会管理系统。 1. 系统需求分析 在系统需求分析阶段,我们需要明确系统的功能需求和非功能需求。下面是本系统的需求分析: 1.1. 功能需求 - 运动员管理:包括运动员信息的录入、修改、查询和删除等功能。 - 项目管理:包括比赛项目的添加、修改、查询和删除等功能。 - 场馆管理:包括比赛场馆的添加、修改、查询和删除等功能。 - 裁判员管理:包括裁判员信息的录入、修改、查询和删除等功能。 - 赛事安排:包括比赛日程的制定、比赛场次的安排、运动员名单的确认等功能。 - 成绩统计:包括比赛成绩的录入、统计和排名等功能。 1.2. 非功能需求 - 安全性:系统需要确保数据的安全,防止恶意用户入侵和篡改数据。 - 可用性:系统需要保证24小时不间断运行,能够快速响应用户的请求。 - 可扩展性:系统需要支持扩展和升级,以应对未来的需求变化。 2. 系统设计 在系统设计阶段,我们需要确定系统的架构和技术选型。本系统采用的技术栈如下: - 后端框架:Spring Boot - 数据库:MySQL - 前端框架:Vue.js - Web容器:Tomcat 系统的架构图如下所示: ![系统架构图](https://img-blog.csdnimg.cn/20211009162301361.png) 在本系统中,Spring Boot作为后端框架,主要负责业务逻辑的处理和数据的持久化。Vue.js作为前端框架,主要负责页面展示和用户交互。MySQL作为数据库,主要用于存储系统的各种数据。 3. 系统实现 在系统实现阶段,我们需要具体实现系统的各项功能。下面是本系统的主要实现步骤: 3.1. 数据库设计 在数据库设计阶段,我们需要确定系统所需的数据表和数据结构。本系统需要设计如下数据表: - 运动员表(athlete):用于存储运动员的信息,包括姓名、性别、年龄、身高、体重等字段。 - 项目表(event):用于存储比赛项目的信息,包括项目名称、项目类型、项目描述等字段。 - 场馆表(venue):用于存储比赛场馆的信息,包括场馆名称、场馆地址等字段。 - 裁判员表(referee):用于存储裁判员的信息,包括姓名、性别、年龄、工作单位等字段。 - 成绩表(score):用于存储比赛成绩的信息,包括运动员姓名、项目名称、比赛成绩等字段。 3.2. 后端实现 在后端实现阶段,我们需要具体实现系统的各项功能。下面是本系统的主要后端实现步骤: - 运动员管理功能:实现运动员信息的增删改查功能。 - 项目管理功能:实现比赛项目的增删改查功能。 - 场馆管理功能:实现比赛场馆的增删改查功能。 - 裁判员管理功能:实现裁判员信息的增删改查功能。 - 赛事安排功能:实现比赛日程的制定、比赛场次的安排、运动员名单的确认等功能。 - 成绩统计功能:实现比赛成绩的录入、统计和排名等功能。 3.3. 前端实现 在前端实现阶段,我们需要具体实现系统的各项页面和交互功能。下面是本系统的主要前端实现步骤: - 运动员管理页面:实现运动员信息的录入、修改、查询和删除等功能。 - 项目管理页面:实现比赛项目的添加、修改、查询和删除等功能。 - 场馆管理页面:实现比赛场馆的添加、修改、查询和删除等功能。 - 裁判员管理页面:实现裁判员信息的录入、修改、查询和删除等功能。 - 赛事安排页面:实现比赛日程的制定、比赛场次的安排、运动员名单的确认等功能。 - 成绩统计页面:实现比赛成绩的录入、统计和排名等功能。 4. 系统测试 在系统测试阶段,我们需要对系统进行全面的测试,确保系统的质量和稳定性。主要测试内容如下: - 功能测试:测试系统的各项功能是否能够正常运行。 - 性能测试:测试系统的性能指标,如响应时间、吞吐量等。 - 安全测试:测试系统的安全性,防止恶意攻击和数据泄露。 - 兼容性测试:测试系统在不同浏览器和操作系统下的兼容性。 5. 系统部署 在系统部署阶段,我们需要将系统部署到服务器上,确保系统能够正常运行。主要部署步骤如下: - 部署数据库:将MySQL数据库安装到服务器上,并创建相应的数据库和数据表。 - 部署后端:使用Maven将Spring Boot项目打包成jar包,并上传到服务器上运行。 - 部署前端:使用npm将Vue.js项目打包成静态文件,并上传到服务器上的Web容器中。 6. 总结 本篇毕设主要介绍了使用Spring Boot框架开发基于Web的大学生运动会管理系统的整个开发流程。通过本篇毕设的实践,我们了解了如何进行需求分析、系统设计、系统实现、系统测试和系统部署等各个阶段的工作。同时,我们也了解了如何使用Spring Boot和Vue.js等技术进行开发,以及如何使用MySQL和Tomcat进行部署。希望本篇毕设能够为大家提供参考和帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值