代码编织梦想

前言

    B/S架构大家应该都不陌生,web1.0时代,用户通过个人电脑浏览网站,单项获取信息,比如我们浏览新闻,查阅资料等。web2.0很快就到来,和1.0相比,用户可以随时随地分享自己的信息。这个时候就涉及到了我们的身份认证。当我们使用http无状态请求访问资源服务的时候,服务端是如何知道我们的身份的,我们今天就来聊一聊。💬💬💬💬💬💬

传统方式下的身份认证

      传统方式的身份认证,我们要从cookie和session说起来,我们先回顾一下cookie和session是有什么特点吧。

  • Cookie:存储在客户端的,客户端专门存东西的一个标识。

      1.能存储的东西很少,基本上只能存储4k左右的东西
    
      2.能被手动清除,不续期的情况下,只有20分钟的有效期
    
      3.Cookie安全问题,别人能从本地Cookie中获取信息
    
      4.Cookie不能直接存储中文,如果需要,则需要进行url转码
    
      5.不能跨域,不能跨域,不能跨域。
    
  • Session:存储在服务器端的,服务端专门存东西的一个标识。

      1.安全性:Session的安全性比Cookie的安全性要高
    
      2.性能:当服务器访问较多,比较占用性能
    
      3.生命周期:异常关机会造成Session的销毁,默认存储30分钟
    
      4.Session的钝化以及活化
    
           钝化:服务器正常关闭后,tomcat会自动将Session数据写入硬盘的文件中
    
           活化:服务器再次启动后,从文件中加载数据到Session中
    
       5.浏览器关闭后再次重启SessionId的地址值不为同一个
    
       4.访问范围:Session为一个浏览器共享
    
                  Cookie为多个浏览器共享
    

      基于 cookie、session 的身份认证中,用户登录后,服务器会为登录用户创建一个 session,cookie的验证是有状态的,sessionid 会保存 在cookie 中。当用户登录成功后,之后的每次请求都会携带cookie。服务器通过 cookie 中的 sessionid 找到内存中的 session 数据,来验证用户身份,从而在响应中返回相应的数据。我们可以参照下图进行理解

在这里插入图片描述
😆😆这个图看着是没什么问题了对不,以前大多数B/S架构都采用这种实现方式,有的同学就说了:“我现在这么实现也ok啊,我干嘛还要去研究那个token呢?”,那你们可以想一想,当你的后端服务需要水平扩展的时候,你的session怎么办?当然我们也是有一些常规做法的。例如服务之间的session同步方案、分布式缓存方案、用户负载方案。我们一个一个来说。

1.session同步,就是在用户登录成功产生session之后,在你的各个服务上进行session同步,保证请求能够畅通访问其他服务,这个开销不得不说是很大的。
2.分布式缓存,将session存储在分布式缓存中,所有服务都从缓存中获取用户session。这是在集群中增加了中间件,代价也不小。
3.用户负载,这是一个偷奸耍滑的方案,通过nginx负载,将同一个用户的请求指向最初登录的那个服务器。

token如何实现身份认证

      前面我们说了session方案需要考虑服务扩展问题,那么有没有更好的解决方案呢?这就得从我们的Jwt(json web token)说起了,现在流行的应用架构,很多都用使用jwt基于token实现身份认证的。什么是Jwt前面的文章有解释。那么如何实现呢,我们简单的说明一下token实现身份认证的步骤。

  • 用户登录成功服务端返回token
  • 之后每次用户请求都携带token,在Authorization Header中。
  • 后端服务取出token进行decode,判断有效期及失效策略。
  • 返回对应的成功失败

      常用的token身份认证方案有两种,一种是单token方案,另外一种是双token方案。下面我们就来分别看图理解一下两种方案的认证及续期过程。

单token续期方案

在这里插入图片描述

1.用户登录,服务端返回生成的Jwt,携带必要的信息。
2.用户再次访问时均需要在Authorization Header中携带Jwt。
3.服务端有配置好的token失效时间或者次数,还有重新登录期限。每次登录会记录当前登录时间。
4.用户携带token访问时,服务端根据token失效时间和重新登录期限判断返回对应代码
5.当token有效时,服务端返回对应资源。
6.当token失效时,前端拿到错误代码后重新请求refresh token接口进行token刷新,该接口会返回新的有效token给前端。
7.前端下次请求会携带刷新后的新token访问。
8.当某次访问时,服务端判断token使用时长超过了定义好的登录期限,则返回重新登录错误代码给前端,前端拿到代码后跳转至登录页面。

双token续期方案

在这里插入图片描述

1.用户登录返回access_token、refresh_token。
2.用户请求资源时携带access_token。
3.当access_token有效时,返回对应的资源。
4.当服务端校验access_token失效,则返回对应错误代码。
5.前端拿到access_token失效对应的错误代码,发起刷新token请求,本次请求携带之前缓存的refresh_token。
6.服务端拿到refresh_token,判断是否有效,失效则返回重新登录错误代码。
7.前端拿到重新登录错误代码则跳转登录页面。

小结

      可以看到,使用token进行身份认证,不仅将服务端的存储压力分摊到了客户端上,并且可以让服务端进行毫无顾及的扩展,除此之外也不存在跨域问题,对于移动端也更加友好,不仅如此,Jwt的加密使得这种方案在安全性上更上一层楼。因此,各位架构师们,这是一种不得不掌握的身份认证方案。
点赞收藏,富婆包养✋✋

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010786653/article/details/129819369

深入了解token认证的来龙去脉_hebeind100的博客-爱代码爱编程

  Token 是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。     不久前,我在前后端分离实践中提到了基于 Token 的认证,现在我们稍稍深入一些。   通常情况下,我们在讨论某个技术的时候

token的作用及原理-爱代码爱编程

Token 是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。 为什么要用 Token? 要回

深入了解token认证的来龙去脉(转载)_swirlee的博客-爱代码爱编程

Token 是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。     不久前,我在前后端分离实践中提到了基于 Token 的认证,现在我们稍稍深入一些。 通常情况下,我们在讨论某个技术的时候,都是从问题开始。那么第一个问

token-爱代码爱编程

Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位   不久前,我在在前后端分离实践中提到了基于 Token 的认证,现在我们稍稍深入一些。   通常情况下,我们在讨论某个技术的时候,都是从问题开始。那么第一个问

jwt与token+redis,哪种方案更好用?-爱代码爱编程

在设计no session系统时,遇到了有两种可选方案:jwt与token+redis。 JWT: 生成并发给客户端之后,后台是不用存储,客户端访问时会验证其签名、过期时间等再取出里面的信息(如username),再使用该信息直接查询用户信息完成登录验证。jwt自带签名、过期等校验,后台不用存储,缺陷是一旦下发,服务后台无法拒绝携带该jwt的请求(如踢除

token是写死的吗_深入理解token-爱代码爱编程

链接:https://my.oschina.net/jamesfancy/blog/1613994 摘要: Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位 不久前,我在在前后端分离实践中提到了基于 Token

token干什么用_什么是Token?Token有什么用处?为什么使用它?Token认证又是什么?...-爱代码爱编程

写这一篇文章的来源是因为某一天的我被面试官提问:让你设计一个登录页面,你会如何设计? 我当时的脑子只有??? 不就是提交账号、密码给后台就搞定了呢? 不可能那么简单,我弱弱的想,难道要对密码加密?? 之后他继续提问,当你登录成功后,去请求购物车时,后台为什么会返回的是你的购物车,而不是别人的? 不是匹配用户id吗??我还没领悟到面试官想让我回

jwt的token自动续约_node.js - JWT(JSON Web Token)自动延长到期时间-爱代码爱编程

node.js - JWT(JSON Web Token)自动延长到期时间 我想为我们的新REST API实现基于JWT的身份验证。 但是由于在令牌中设置了到期,是否可以自动延长它? 我不希望用户在每X分钟后需要登录,如果他们在那段时间内积极使用该应用程序。 这将是一个巨大的用户体验失败。 但是延长过期会创建一个新令牌(旧令牌在到期之前仍然有效)。

浅谈JWT身份认证及其优缺点-爱代码爱编程

一、登录模式 在介绍JWT之前,我要先介绍一下常见的几种登录模式。 1、单一服务器模式(Session) 我们登录认证成功之后,将用户信息就存放在服务端(Session),然后将其对应的session_id存储在客户端(Cookie),从Cookie中取出session_id,服务端就可以根据这个session_id获取对应的Session,从而获取

基于jwt实现用户身份认证-爱代码爱编程

常见场景 账号/密码登录、手机号验证码登录、微信扫码登录 解决方案 基于Session认证方案 什么是session认证方案 服务端生成httpsession认证(内存-sessionId)sessionId写到浏

makop勒索病毒|勒索病毒解密|勒索病毒恢复|数据库修复-爱代码爱编程

目录 前言:案例简介 一、什么是.[back23@vpn.tg].makop勒索病毒? 二、中了.[back23@vpn.tg].makop后缀勒索病毒文件怎么恢复? 三、恢复案例介绍: 1. 被加密数据情况 2. 数据恢复完成情况 预防勒索病毒-日常防护建议: 前言:案例简介         2022年,某企业咨询称遭到勒索软件攻击,

prometheus监控运维实战十: 主机监控指标_prometheus 磁盘使用率-爱代码爱编程

1、CPU指标 CPU负载 node_load1 node_load5 node_load15 以上三个指标为主机的CPU平均负载,分别对应一分钟、五分钟和十五分钟的时间间隔。CPU负载是指某段时间内占用CPU时间的

跨域常见的解决方案_跨域访问-爱代码爱编程

目录 一:什么是跨域 二:为什么会跨域 三:跨域的解决方案 1.代理服务器 1.1.生产环境 1.2.开发环境 2.JSONP 3.CORS 一:什么是跨域 跨域是指浏览器在向一个服务器发送请求时,该请求的地址与当前页面的地址不同,即协议、域名、端口号中至少有一个不同,导致浏览器出于安全考虑,阻止了页面与请求之间的交互。  

prometheus监控实战系列十一:可视化_监控prometheus grafana页面样式-爱代码爱编程

Prometheus自身提供了对于指标的查询以及简单的图表展示功能,但对于企业级的监控展示而言,这是远远不够的。对此,Promethes官方推荐的可视化方案是与grafana结合,来实现丰富的监控展示效果。 1、安装gra

sqlmap的详细使用教程_sqlmap结果输出到文件-爱代码爱编程

SQL注入是一种广泛存在于Web应用程序的漏洞,可以导致敏感数据泄露、系统破坏等严重后果。SQLMap是一款自动化SQL注入工具,它可以帮助渗透测试人员快速发现和利用SQL注入漏洞。本文将介绍SQLMap的详细使用教程和常用

进程与子进程_fork创建子进程和父进程共用errno-爱代码爱编程

目录   进程概念 孤儿进程 僵尸进程 1、fork与pid 验证 2、 父进程和子进程文件共享  验证​ 3、fork()后的竞争 验证  代码如下 4、监视子进程 代码编写之wait 验证 代码编写之waitpid   进程概念         当一个进程创建子进程之后,它们俩就成为父子进程关系,父进程与子进程的