用户认证中的有状态和无状态

2024-09-06 23:12
文章标签 认证 用户 状态

本文主要是介绍用户认证中的有状态和无状态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

        我们在系统设计的时候,用户的认证是最基本也是最重要的功能了。我们常见的方案,就是将用户的认证信息保存到 session 里面。由于近年来微服务的快速兴起,一种 JWT 的认证方式出现在了大众的眼中。在单体服务的时代,很多系统设计的都是有状态的服务。随着微服务的出现,大多数系统设计的时候,都开始考虑无状态服务了。那它们的唯一区别,就是服务端是否会保存客户端的信息。简而言之,服务端保存了客户端的信息的这种状态的服务,就被称为有状态的服务,反之,就是无状态服务了

1.有状态

        有状态常见的模型就是 cookie - session 模型,这里就以 cookie - seesion 为例来说明有状态服务。

用户认证过程

        1、客户端向服务端发起请求。
        2、在第一次客户端发起请求的时候,服务端会创建一个 Key 为 session-id 的值,并保存在服务端同时写入到客户端的 cookie 中。
        3、之后客户端的每次请求,都会将 cookie 信息发送给服务端,服务端会根据 cookie 进行判断。

优点

        1、客户端的信息都保存在服务端,如果将客户端的认证信息删除,那么只需要将对应的 session 信息删除即可。

缺点

        1、当用户量特别大的时候,服务端需要保存大量的 session 信息,会耗费大量的资源。
        2、如果在服务端集群的情况下,session 的信息不能共享。
        3、cookie 有同源策略和跨域限制,部分业务场景下 cookie 不能传递。
        4、有些浏览器不支持 cookie 或禁用 cookie,部分手机浏览器不支持 cookie。

应用场景

        如果以集群式的方式部署多台服务,可以使用以下策略:

        1、配置负载均衡的路由策略为 hash 一致性算法,这种方式如何某个服务停了,那么会重新分配到新的机器,就又需要重新登录认证。(这种方式不推荐使用)
        2、分布式 session 方式,这种方式可以将 session 保存到 redis 或者数据库中,提供给多个服务使用,实现 session 的集中管理。

        如果有多个服务需要共享登录认证信息,可以使用 SSO 单点服务。

2.无状态

        无状态的认证,服务端在验证客户端发送过来的请求信息之后,服务端根据一定的算法生成一个 Token 令牌返回给客户端。
        客户端之后的每次请求都需要携带 Token 令牌,服务端接收到 Token 令牌之后进行校验,验证通过之后提取令牌中信息来识别用户。

无状态用户认证过程

        1、客户端执行登录操作,发送账号密码等信息。
        2、服务端校验客户端的用户信息,根据对应的用户信息和服务端密钥生成 Token 令牌,然后返回给客户端。
        3、客户端在收到 Token 令牌之后,将其保存到本地的 LocalStorage。
        4、以后的每次客户端发起请求时,都携带 Token 令牌。
        5、服务端收到 Token 令牌之后,验证 Token 令牌的有效性和时效性,之后根据密钥解密参数信息。

优点

        1、服务端不需要保留客户端的任何信息,每次只需要通过特定的算法进行校验,节省了大量的存储空间。
        2、方便水平扩容,不需要 SSO 服务,只要保证新的服务采用同样的验证算法,就可以获得对应的信息。

缺点

        1、当客户端的 Token 令牌被盗用,或者需要手动封禁某个用户的时候,无法对 Token 令牌进行操作,需要等到 Token 令牌失效。
        2、如果在服务端维护一个 Token 令牌和用户的关系,又违背了无状态服务设计的理念。

应用场景

        1、生成的 Token 令牌中携带用户的常用信息,不携带用户的敏感信息,例如:密码、手机号等,这些信息可以通过 BASE 64 解析处理。
        2、要处理服务端主动禁用某个 Token 令牌,可以使用黑名单机制,每次请求前都判断当前 Token 令牌是否已经被写入黑名单。
        3、Token 令牌中信息处理基本信息之外,还需要携带,例如:签发时间、有效时间、刷新 Token 令牌等字段,用来处理 Token 令牌刷新过期时间。

3.总结

        在实际的系统设计中,需要充分理解需求,合理的使用技术,不同的技术方案适用不同的场景,技术存在即合理。

        1、目前大部分的互联网的产品中使用 JWT 的认证方式居多。
        2、在一些企业内部的管理系统中采用 cookie - session 的居多。

这篇关于用户认证中的有状态和无状态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143383

相关文章

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

java如何通过Kerberos认证方式连接hive

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过... 目录Java实现Kerberos认证主要方法依赖示例续期连接hive遇到的问题分析解决方式扩展思考总

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu