鉴权的4种基本方法

article/2025/9/19 7:19:42
一、基于服务器常出现的问题

Seesions: 每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。
可扩展性: 由于sessions存放在服务器内存中,伴随而来的是可扩展性问题。当我们想要增加服务器来解决负载问题时,session里的关键性信息会限制我们的扩展。
CORS(跨域资源共享): 当我们扩展应用程序,让数据能够从不同设备上访问时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个域的资源时(移动端访问我们的API服务器),可能会出现禁止请求的情况。
CSRF(跨站请求伪造): 用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。

二、常用鉴权方式
  • HTTPBasicAuthentication(HTTP基本认证);
  • session-cookie;
  • Token验证(包括JWT,SSO);
  • OAuth(开放授权).
2.1 HTTPBasicAuthentication(HTTP基本认证)

浏览器会弹出一个登录验证的对话框

1.浏览器第一次向服务器发送http请求,服务器响应回401 Unauthozied状态码,在ResponseHeader”WWW-Authenticate”添加信息;
在这里插入图片描述

2.浏览器接收到401Unauthozied后,弹出登录验证的对话框获取用户输入的信息,并使用BASE64编码,放在ResponseHeader的Authorization中发送给服务器;
在这里插入图片描述

3.服务器将Authorizationheader中的信息取出,进行验证,如果验证通过,将根据请求,发送资源给客户端。

2.2 session-cookie

利用服务器的session和浏览器的cookie来实现前后端认证的,在服务器创建的session集合,将同一个客户端的请求都维护在各自的session中,每当服务器接收到浏览器的cookie请求时,会在session集合中查询对应的s_id,如果有就确认身份成功。
在这里插入图片描述

缺点

  • 服务器内存消耗大:用户每做一次应用认证,应用就会在服务端做一次记录,以方便用户下次请求时使用,随着认证用
  • 户的增加,服务器的消耗就会越大;
  • 易受到CSRF攻击:基于cookie的一种跨站伪造攻击,基于cookie来进行识别用户的话,用户本身就携带了值,cookie被截获,用户就很容易被伪造;
  • 扩展不好:当增加为多台服务器时,会涉及到session共享的问题,因此不利于服务器的扩展。
2.3 Token认证(常用)

Token验证也叫令牌,是一种无状态身份验证方式,不用将用户信息存在服务器或Session中去除了服务器内耗问题;当用户第一次登录时,服务器生成一个token并返回客户端,除用户端将保存的token失效或者删除之外,在接下来的请求时,只要带着这个令牌请求数据即可。
在这里插入图片描述

实现步骤:
1.用户通过用户名和密码发送请求;
2.程序验证;
3.程序返回一个签名的token 给客户端;
4.客户端储存token,并且每次请求都会附带它;
5.服务端验证token并返回数据。

优点
1.无状态、可扩展
在客户端存储的token是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载均衡服务器能够将用户的请求传递到任何一台服务器上,因为服务器与用户信息没有关联。当用户量大时,可能会造成一些拥堵。使用token完美解决了此问题。

2.安全性
能够防止CSRF(跨站请求伪造)攻击。Token是有时效的,一段时间之后用户需要重新验证。无需等到token自动失效,token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效。

3.可扩展性
使用Tokens能够与其它应用共享权限。例如,能将一个博客帐号和自己的QQ号关联起来。当通过一个第三方平台登录QQ时,我们可以将一个博客发到QQ平台中。
使用token,可以给第三方应用程序提供自定义的权限限制。当用户想让一个第三方应用程序访问它们的数据时,我们可以通过建立自己的API,给出具有特殊权限的tokens。

4.多平台与跨域
解决CORS(跨域资源共享)问题。当应用和服务不断扩大,需要通过多种不同平台或其他应用来接入我们的服务时。可从CDN提供服务。在为我们的应用程序做 Access-Control-Allow-Origin: * 的配置之后,就可以消除CORS带来的问题。只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。

缺点:
占带宽: 正常情况下token要比session_id更大,需要消耗更多流量,挤占更多带宽.(不过几乎可以忽略);
性能问题: 相比于session-cookie来说,token需要服务端花费更多的时间和性能来对token进行解密验证.其实Token相比于session-cookie来说就是一个"时间换空间"的方案。

2.4 OAuth(开放授权)(流行)

OAuth 就是一种授权机制。用来授权第三方应用,获取用户数据。通过数据的所有者授权第三方应用进入系统,系统从而产生一个临时的令牌,代替密码,授权第三方应用使用权限。
优点
可控姓: 保证了令牌既可以让第三方应用获得权限,同时又随时可控,不会危及系统安全;
方便性: 只要知道了令牌,就能进入系统;
重要性: 系统一般不会再次确认身份,所以令牌必须保密,泄漏令牌与泄漏密码的后果是一样的,这也是为什么令牌的有效期,一般都设置得很短的原因。

三、鉴权方式的区别
3.1 Token与session的区别

登录状态: 使用Token,服务端不需要保存状态。里面本身就保存着用户的登陆状态,Token不需要借助cookie的;
时效性: session-cookie的sessionid是在登陆的时候生成的而且在登出时一直不变的,在一定程度上安全就会低,而 token是可以在一段时间内动态改变的;
可扩展性: 服务端并不保存token 信息,所以token具有更好的扩展性。

3.2 令牌(token)与密码-OAuth(password)

时效性: 令牌是短期的,到期会自动失效,用户自己无法修改。密码一般长期有效,用户不修改,就不会发生变化;
可控性: 令牌可以被数据所有者撤销,会立即失效,密码一般不允许被撤销;
权限范围: 令牌有权限范围(scope),对于网络服务来说,只读令牌就比读写令牌更安全。密码一般是完整权限。


http://chatgpt.dhexx.cn/article/UdtgbQKE.shtml

相关文章

什么是鉴权?一篇文章带你了解postman的多种方式

目录 一、什么是鉴权? 二、postman鉴权方式 一、什么是鉴权? 鉴权也就是身份认证,就是验证您是否有权限从服务器访问或操作相关数据。发送请求时,通常必须包含相应的检验参数以确保请求具有访问权限并返回所需数据。通俗的讲就…

10 分钟带你了解鉴权那些事

前言: 鉴权是自动化测试路上的拦路虎,相信大部分同学都深有体会,今天我们就讲一讲这个鉴权到底是怎么回事。 一、什么是鉴权,为什么要鉴权 鉴权:是指是指验证用户是否拥有访问系统的权利。为什么要鉴权:…

常见的鉴权方式简述

一、什么是鉴权,为什么要鉴权 鉴权:是指验证用户是否有访问系统的权利。 为什么要鉴权 :对用户进行鉴权,防止非法用户占用网络资源,非法用户接入网络,被骗取关键信息 二、鉴权方式 Basic Auth basic au…

笔记——什么是鉴权

前言 鉴权是自动化测试路上的拦路虎;故以此记录鉴权到底是怎么回事。 一、什么是鉴权,为什么要鉴权 鉴权:是指验证用户是否有访问系统的权利。为什么要鉴权 :对用户进行鉴权,防止非法用户占用网络资源,非…

ftok()函数解析

ftok 消息队列、信号灯、共享内存常用在Linux服务端编程的进程间通信环境中。而此三类编程函数在实际项目中都是用System V IPC函数实现的。System V IPC函数名称和说明如下表15-1所示。 表15-1 System V IPC函数 消息队列 信号灯 共享内存区 头文件 <sys/msg.h> …

ftok()函数的使用

在上一篇文章中&#xff0c;Mayuyu讲述了共享内存的原理以及使用方法。在创建共享内存之前&#xff0c;必须指定一个ID值&#xff0c;而这个ID值通常是通过现在要讲的ftok()函数得到。ftok()函数原型如下 其中参数fname是指定的文件名&#xff0c;这个文件必须是存在的而且可以…

linux ftok函数的使用

ftok API #include <sys/types.h> #include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id); ftok根据路径名&#xff0c;提取文件信息&#xff0c;再根据这些文件信息及project ID合成key&#xff0c;该路径可以随便设置。该路径是必须存在的&#x…

ftok与fork

ftok函数编辑 系统建立IPC通讯 &#xff08; 消息队列、 信号量和 共享内存&#xff09; 时必须指定一个ID值。通常情况下&#xff0c;该id值通过ftok函数得到。 2ftok原型编辑 头文件 #include < sys/types.h> #include <sys/ipc.h> 函数原型&#xff1a; key_t f…

Linux下的ftok()函数

linux ftok&#xff08;&#xff09;函数 - 清清飞扬 - 博客园 (cnblogs.com) 系统建立IPC通讯&#xff08;如消息队列、共享内存时&#xff09;必须指定一个ID值。通常情况下&#xff0c;该id值通过ftok函数得到。 ftok原型如下&#xff1a; key_t ftok( char * fname, int i…

Linux中ftok函数介绍

函数原型&#xff1a; *key_t ftok(const char fname, int id); 功能&#xff1a;系统建立IPC通讯&#xff08;如消息队列&#xff0c;共享内存时&#xff09;必须指定一个ID值。通常情况下&#xff0c;该id值通过ftok函数得到 返回值&#xff1a;成功返回一个key_t值&#xf…

linux ftok()

系统建立IPC通讯&#xff08;如消息队列、共享内存时&#xff09;必须指定一个ID值。通常情况下&#xff0c;该id值通过ftok函数得到。 ftok原型如下&#xff1a; C代码 key_t ftok( char * fname, int id) key_t ftok( char * fname, int id) fname就时你指定的文件名&a…

Linux中ftok函数详解

在ipc通信中 system V 模式的ipc通信中都需要一个key值来生成对应的ID&#xff0c;那么key是如何生成的呢&#xff1f; 通过函数ftok生成 #include <sys/types.h>#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);参数&#xff1a; pathname: …

ftok说明

文章一&#xff1a; ftok函数 系统建立IPC通讯&#xff08;消息队列、信号量和共享内存&#xff09;时必须指定一个ID值。通常情况下&#xff0c;该id值通过ftok函数得到。 ftok原型 头文件&#xff1a; #include <sys/types.h> #include <sys/ipc.h> 如下&…

ftok()函数深度解析

关于ftok函数&#xff0c;先不去了解它的作用来先说说为什么要用它&#xff0c;共享内存&#xff0c;消息队列&#xff0c;信号量它们三个都是找一个中间介质&#xff0c;来进行通信的&#xff0c;这种介质多的是。就是怎么区分出来&#xff0c;就像唯一一个身份证来区分人一样…

linux进程间通信--消息队列相关函数(ftok)详解

ftok 消息队列、信号灯、共享内存常用在Linux服务端编程的进程间通信环境中。而此三类编程函数在实际项目中都是用System V IPC函数实现的。System V IPC函数名称和说明如下表15-1所示。 表15-1 System V IPC函数 消息队列 信号灯 共享内存区 头文件 <sys/msg.h> &l…

19-逆波兰表达式求值(栈)

逆波兰表达式求值 1.题目描述2. 思路3.代码实现3.1 c实现 4. 复杂度分析 1.题目描述 LeetCode题目链接 逆波兰表达式由波兰的逻辑学家卢卡西维兹提出。逆波兰表达式的特点是&#xff1a;没有括号&#xff0c;运算符总是放在和它相关的操作数之后。因此&#xff0c;逆波兰表达式…

逆波兰表达式求值

二元运算符的表达式定义为&#xff1a;(操作数) (运算符) (操作数) &#xff0c;其中操作数也可以为表达式。 在计算机中&#xff0c;根据运算符所在的不同位置来命名&#xff0c;表达式可以有如下三种不同的表示方法&#xff1a; 记表达式为&#xff1a;Exp S1 OP S2&a…

逆波兰表达式 c++

题目&#xff1a; 逆波兰表达式定义&#xff1a;1&#xff09;一个数是一个逆波兰表达式值为该数 2&#xff09;运算符 逆波兰表达式 逆波兰表达式 是其表达式&#xff0c;只有两个逆波兰表达式的值运算的结果 思路&#xff1a;用递归解决递归形式问题。 #include <iostr…

波兰表达式和逆波兰表达式

波兰表达式和逆波兰表达式 今天zxy的实验内容是关于逆波兰表达式的计算&#xff0c;刚好最近在做关于数据结构的习题&#xff0c;于是想着对波兰表达式和逆波兰表达式的转化和运算分别进行一个学习&#xff0c;于是写了这篇博客(有错的地方欢迎大家指出。) 常见的运算表达式&…

逆波兰表达式,走一波

逆波兰表达式又叫后缀表达式&#xff0c;中学时候学的那种表达式叫中缀表达式。 例如&#xff0c;5(63)3-1 &#xff0c; 3(4(21)2)-3 例子中的这两个式子&#xff0c;就是中缀表达式。下面这两个就是后缀表达式&#xff1a; 56331- &#xff0c; 342123- 中缀…