搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
小惠珠哦
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
信息系统项目管理师 -- 目录_信息系统项目管理师目录
2
WIN2K3&WINXP系统服务详解_aelookupsvc是什么服务
3
编辑任何东西_editanything使用
4
vue 使用axios发送请求或带参数的请求_axios同时传递请求体和参数
5
递归--八皇后问题_用递归求解八(n)皇后问题。说明:在8*8格的国际象棋上(图6-1)摆放八个皇后,使其不
6
Maven本地仓库安装jar包_maven install
7
mysql 多表查询 优化_MySql多表查询优化
8
Pycharm 通过 SVN 直接管理控制代码,原来这么方便又高级!_pycharm svn管理
9
如何成为AI时代下的10倍程序员
10
利用MongoDB构建现代支付系统|附《利用AI在支付领域的优势》报告下载_mongodb支付
当前位置:
article
> 正文
【前端指南】session和token_前端获取session
作者:小惠珠哦 | 2024-07-20 12:56:37
赞
踩
前端获取session
文章目录
session和token
cookie
session
工作机制
session痛点
token
token组成部分
token总结
cookie与token的简单总结
cookie有哪些局限性?
token的缺点?
一个误解
CSRF攻击
总结
session和token
cookie
http请求是无状态的,第一次和服务器连接并登陆成功后,第二次请求服务器仍然不知道当前请求的用户
cookie出现就是解决了这个问题
第一次登陆后服务器返回一些数据cookie给浏览器,然后浏览器保存在本地
当用户第二次返回请求时,就会把上次请求存储的cookie数据自动携带给服务器
如果关闭浏览器cookie失效,则cookie就是保存在内存中
如果关闭浏览器cookie不失效,则cookie保存在磁盘中
但随着数据信息越来越多,每次请求的cookie也越来越大,对每个请求来说都是一个很大的负担
session
与cookie作用有点类似,都是为了存储用户相关的信息,不同的是
cookie存储在本地浏览器,session存储在服务器
存储在服务器的数据会更加安全,不容易被窃取,但是存储在服务器又有一定的弊端,会占用服务器的资源
工作机制
用户登录,server会为用户生成一个session,为其分配唯一的sessionId,是与某个用户绑定的,根据此sessionid可以查询到他到底是哪个用户,然后将此sessionid通过cookie传给浏览器
之后浏览器的每次请求只要在cookie里面带上sessionid = xxx这一个键值对即可,server根据sessionid找到它对应的用户后,把传过来的shangpinid保存到server中对应用户的信息即可
cookie存储在client,session保存在server,sessionid需要借助cookie的传递才有意义
session痛点
上述情况能正常工作是因为我们假设了server是单机工作,但实际在生产上,为了保证高可用,一般服务期至少需要两台机器,通过负载均衡的方式来决定到底是该打到那台机器上
客户端请求后,有负载均衡器,如Nginx来决定到底打到哪台机器
假设登录请求打到了 A 机器,A 机器生成了 session 并在 cookie 里添加 sessionId 返回给了浏览器,那么问题来了:下次添加购物车时如果请求打到了 B 或者 C,由于 session 是在 A 机器生成的,此时的 B,C 是找不到 session 的,那么就会发生无法添加购物车的错误,就得重新登录了,此时请问该怎么办。主要有以下三种方式
session复制
A请求生成的session后复制到其余机器,这样每台机器都有一份session,这样无论那台机器提供服务,session都能找到不会出现问题
缺点
同样一份session保存了很多份,数据冗余
节点多的话,这样节点增多复制造成的性能消耗也会很大
session粘连
让每个客户端请求只打到一台机器上,比如浏览器登录请求打到A机器后,后续所有的添加处理请求也打到A机器上,Nginx的sticky模块可以支持这种方式,支持按ip或cookie粘连等,若ip粘连:
upstream tomcats {
ip_hash;
server 10.1.1.107:88;
server 10.1.1.132:80;
}
Nginx以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡服务器。在性能上,Nginx占用很少的系统资源,能支持更多的并发连接,达到更高的访问效率;在功能上,Nginx是优秀的代理服务器和负载均衡服务器;在安装配置上,Nginx安装简单、配置灵活
Nginx支持热部署,启动速度特别快,还可以在不间断服务的情况下对软件版本或配置进行升级,即使运行数月也无需重新启动
在微服务的体系之下,Nginx正在被越来越多的项目采用作为网关来使用,配合Lua做限流、熔断等控制
这样每个client请求到达Nginx后,只要他的ip不变,根据ip hash算出来的值会达到固定的机器上,也就不存在session找不到的问题了,当然不难看出这种方式缺点也很明显
缺点:对应机器不能工作
session共享
将session保存在Redis,memcached等中间件中,请求到来时,各个机器去这些中间件中取一下session即可
缺点
每个请求都要去Redis取一下session,多了一次内部连接,消耗了一点性能,另外为了保证Redis的高可用性,必须做集群,让然对于大公司来说,Redis集群基本都会部署,所以该方案是大公司的首选
token
session的存储是需要空间的,session的传输一般都是通过cookie来传输,或url重写的方式
token在服务器时可以不用存储用户信息的,token传递的方式也不限于cookie传递,token也可以保存起来
首先请求防输入自己的用户名,密码,然后server据此声称token,客户端拿到token后会保存到本地,之后想server请求是在请求头商带上此token
token 只存储在浏览器中,服务端却没有存储,这样的话我随便搞个 token 传给 server 也行?
server 会有一套校验机制,校验这个 token 是否合法
怎么不像 session 那样根据 sessionId 找到 userid 呢,这样的话怎么知道是哪个用户?
token 本身携带 uid 信息
token组成部分
header:指定了签名算法
payload:指定用户id,过期时间等非敏感数据
signature:签名,server根据header直到他改用哪种签名算法,再用密钥根据签名算法对head+payload生成签名
以上,一个token就生成了
当server收到浏览器传过来的token时,会首先取出token中的header+payload,根据密钥生成签名,然后再与token中的签名比较
与token中的签名比对,如果成功则说明签名是合法的,即token是合法的
payload中存有userId
对已拿到token后直接在payload中就可以获取到userId,避免了向session那样要从Redis去取的开销
token总结
只要server保证密钥不泄露,那么生成的token就是安全的,因为如果伪造token的话在签名验证环节是无法通过的,就此即可判定token非法
这种方式有效避免了token必须存在在server的弊端,实现了分布式存储
注意
token一旦由server生成,他就是有效的,直到过期,无法让token失效
除非在server为token设立一个黑名单,在教研token前先过一遍此黑名单,如果在黑名单里则此token失效
但若向上述做法,就意味着黑名单必须保存在server,这又回到session模式
所以一般做法是:当客户端登出要让token失效时,直接在本地转移token计科,下次登录重新生成token
token一般放在header的Authorization自定义头里面,不是放在cookie中,这主要是为了解决跨域不能共享cookie的问题
cookie与token的简单总结
cookie有哪些局限性?
cookie跨站是不能共享的,这样的话要实现多应用多系统的单点登录SSO,使用cookie来做需要的话就很困难->要用比较复杂的trick来实现
SSO单点登录,是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统
要用token来实现SSO会非常简单,只要在header中的authorize字段-或其他自定义,加上token即可完成所有跨域站点的认证
在移动端原生请求是没有cookie之说的,而sessionid依赖于cookie,sessionid就不能用cookie来传了
如果使用token的话,由于它是随着header的authorize传过来的,就不存在此问题
即token天生就支持移动平台,可扩展性好
token具有存储实现简单,扩展性好的特点
token的缺点?
token太长
token是header,payload编码后的样式,一般要比sessionid长很多,很有可能超出cookie的大小限制(cookie一般都是有大小限制的,如4kb)
若果在token中存储的信息越长,那么token本身也会很长
这样的话,由于每次请求都会带上token,对请求来说是个不小的负担
不太安全
token存在浏览器的local storage里,这样会造成安全隐患,因为local storage这类本地存储是可以被JS直接读取的
另外,token一旦生产就无法让其实小,必须要等其过期才行
这样,如果服务端检测到了一个安全威胁也无法使相关的token失效
token更适合一次性的命令认证,设置一个比较短的有效期
一个误解
cookie相比token更不安全,比如CSRF攻击
CSRF攻击
攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过得网站并运行一些操作,由于浏览器曾经认证过(cookie里带来sessionid等身份认证的信息),被访问的用户会认为是真正的用户操作而去运行
- CSRF攻击的根本原因在于:对于同样域名的每个请求来说,他的cookie都会被自动带上,这个是浏览器的机制决定的
使用token确实会避免CSRF的问题,但由于token存在local storage,他会被JS,读取,从存储角度来看来不安全
实际上防护CSRF攻击的正确方式是用CSRF token
从存储角度来看都不安全,都有暴露风险,所以我们所说的安全更多是强调传输中的安全,可以用HTTPS协议来传输,这样的话请求头都能被加密,保证了传输中的安全
cookie和token比较本身就不合理,一个是存储方式,一个是验证方式
总结
session和token本质上是没有区别的,都是对用户身份的认证机制,知识他们实现的校验机制不同而已
一个保存在server,通过在Redis等中间件获取来校验
一个保存在client,通知签名校验的方式来验证
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/小惠珠哦/article/detail/856969
推荐阅读
article
阿里云验证码功能对接,使用临时凭证时遇到的坑,报错
code
:
400, Specified head...
最近因为项目需要,使用了阿里云的验证码产品:https
:
//help.
aliyun
.
com
/zh/captcha/之前研...
赞
踩
article
Gitee码云 remote: Incorrect
username
or
password
( a...
本文介绍了Git中遇到的用户名或密码错误问题,由于自动保存的误操作,分享了禁用自动保存、使用gitconfig更改凭证助...
赞
踩
article
SecureCRT
日志
记录
的
7个经典
配置
记录
与14个
环境变量
(%Y-%M-%D_%H_%S_sess...
每次更换电脑、主机或者环境都需要
配置
一遍
SecureCRT
的
参数。感觉就最近十年都已经设置过上百次了。其实设置没什么特别...
赞
踩
article
【每日
一
题
,
冲刺秋招(4)】—— 前端js考点之
cookie
、
session
和
storage
_js ...
请你描述
一
下
cookie
s
,
session
Storage 和
local
Storage 的区别?解答:
题
目二:场景需求...
赞
踩
article
Redis
领航
分布式
:Java实现高效
Session
管理_
java
redis
session
...
通过本文的介绍,我们深入探讨了
Redis
实现
分布式
Session
登录的相关细节。通过合理的会话数据存储结构和管理...
赞
踩
article
2021
关于
github
账户提交需要
使用
token
的
使用
说明_
add
gitlab
account
...
一 操作1.1 问题描述md,
2021
年8月13号,向
github
上提交代码,提示:1.2 动机是?我们描述了我们的动机...
赞
踩
article
Spring
Boot中使用
WebSocket
【第一部分】_
cannot
invoke
"jaka...
简介所谓
WebSocket
, 类似于Socket,它的作用是可以让Web应用中的客户端和服务端建立全双工通信。在基于Sp...
赞
踩
article
6.4.1.2 UE-
request
ed PDU
session
establishment
pro...
目录6.4.1.2 UE-
request
ed PDU
session
establishment
procedure
i...
赞
踩
article
GitHub
访问
令牌(
GitHub
Access
Token
)生成...
GitHub
访问
令牌(
GitHub
Access
Token
)是用于认证和授权
GitHub
API
访问
的凭证。它可以代替...
赞
踩
article
git
报错: Access
to
ken
is
expired
fatal
: unable
to
ac...
打开控制面板-用户帐户-凭据管理器,选择Windows凭据,然后找到名为
git
:
https
://
git
ee.com的凭据...
赞
踩
article
【
GitL
a
b
】-HTTP B
a
sic: Access denied.remote:You must...
本文简要说明
GitL
a
b
配置
a
ccess
Token以及双因子认证(Two-f
a
ct
or
a
u
the
ntic
a
tion)_...
赞
踩
article
大
模型
学习笔记七
:
LLM
应用
_
llm
session
...
1)管理一个
LLM
应用
的全生命周期,需要用到以下工具
:
1、调试 Prompt 的 Playground2、测试/验证...
赞
踩
article
链游
中
的
代币
(
Token
)或
加密
货币
(
Cryptocurrency
)是如何产生和使用
的
?_
代币
创建规...
这些收益可以是游戏内
的
资产奖励,也可以是
代币
价格
的
上涨带来
的
资本增值。在一些
链游
中,
代币
持有者可以参与游戏
的
治理过程,如...
赞
踩
article
前端
浏览器
之
Cookie
,
Session
,
LocalStorage
,
Session
Storage,J...
文章目录
Cookie
LocalStorage
Session
Storage
Cookie
、
LocalStorage
、Sess...
赞
踩
article
Cookie
、
Session
、
Token
那点事儿和前后
端
分离之
JWT
用户
认证
...
(两篇文章转自:https://www.jianshu.com/p/bd1be47a16c1;https://www.j...
赞
踩
article
详细讲解
Cookie
、
Session
、
JWT
令牌
技术
_
令牌
验证和
cookie
...
这篇文章将带你彻底理解会话跟踪方案的三种
技术
,分别是
Cookie
、
Session
、
令牌
技术
,揭示它们的原理以及对各个
技术
...
赞
踩
article
前端鉴权:
cookie
、
session
、
token
、jwt、单点登录_
一个
浏览器
只能带
一个
token
...
HTTP 是无状态的,为了维持前后端请求,前端存储标记
cookie
是一种完善的标记方式,是大多数状态管理方案的基石。s...
赞
踩
article
后端之路——
登录
校验前言(
Cookie
\
Session
\
JWT
令牌)_没有
这个
parseclai...
Servlet是用java编写的应用在服务器端的程序;对于它的定义,“广义上”是一个个很大的【类】,“狭义上”是【接口】...
赞
踩
article
前端学习记录(二):
session
,
localStorage
,
session
Storage,cook...
session
,
localStorage
,
session
Storage,
cookies
众所周知,对于一个应用程序来说,不...
赞
踩
article
前端
鉴权
:
cookie
、
session
和
token
3种
机制
,以及 jwt 和 单点登_
前端
se...
Token 是在服务端产生的。如果
前端
使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token ...
赞
踩
相关标签
阿里云
云计算
.net
gitee
服务器
运维
前端
java
分布式
redis
session
websocket
stomp
网络协议
github
git
gitlab
access token
2FA
双因子认证
学习
笔记
区块链
人工智能