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

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

相关文章

浅析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

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

hdu3006状态dp

给你n个集合。集合中均为数字且数字的范围在[1,m]内。m<=14。现在问用这些集合能组成多少个集合自己本身也算。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.Inp

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

qml states 状态

states 状态 在QML中,states用于定义对象在不同状态下的属性变化。每个状态可以包含一组属性设置,当状态改变时,这些属性设置会被应用到对象上。 import QtQuick 2.15import QtQuick.Controls 2.15// 定义应用程序的主窗口ApplicationWindow {visible: true // 使窗口可见width: 640 /