【开发】session和token的使用

目录

前言

正篇

session

分布式session

token

双token

浅聊一下,适合初学者~

这篇纯理论,比较长,慢慢看 > . <

需要有一点点redis的基础,比如知道redis是键值对数据库哦~

前言

先简单介绍一下cookie

cookie在客户端上,用于保存服务端发送的数据。服务端通过set-cookie将数据存到客户端。

然后往下吧

正篇

session和token都是使用在鉴权场景下。

当你要访问系统中的某些资源时,就需要登录才能进行访问。

如果你已经是在登录状态了,那你就有权限进行访问。

大家都知道通过账号密码进行登录,所以账号密码输入正确,逻辑上你就有权限进行访问系统了。但是当你再发送一次请求时,由于http是无状态的协议,不会标识你的登录状态,那怎么证明你已经登录过了呢?

这时候就需要服务端在你完成登录后,给客户端发一个凭证,等下次访问时,客户端携带上这个凭证,服务端队凭证校验过后,没问题,就给你访问相应的资源。

这个凭证是有过期时间的,不知道大家有没有注意到,当你很长一段时间没有使用某个网站时,你就需要重新登录呢?那是因为如果凭证长期有效,容易被别人盗取,从而通过这个凭证获取你在网站上的个人信息,是一个安全性的考虑。

上文提到的凭证,有两种形式。

一种就是session

session

当你输入账号密码经过校验成功后,服务端会开辟一个空间session(容器),用来存储你的个人信息,然后返回给客户端一个sessionId存储在cookie中。当客户端下次发送请求时,会携带上这个cookie。

服务端通过获取cookie,也就是传来的sessionId去获取用户信息,如果用户信息存在,则放行,可以访问其他资源,如果没有获取到,就拒绝请求,或者跳转到登录页面。

分布式session

那在分布式场景下,有多台服务器,用户的请求会被负载均衡到多台服务器上,那就可能出现这种情况,登录时,访问的是服务器A,所以用户信息存在服务器A上,而请求资源时访问的是服务器B,显然,用从服务器A上获取到的sessionId来获取用户的信息是获取不到的。

那该怎么解决呢?

一个常见的思路就是把所有的session放到一个服务器上进行存储,每次要校验时,从这个服务器去获取用户信息,获取到了,那就放行。

这就是分布式session的实现。

通常这个服务器是redis,key是sessionId,value就是用户的信息。

鉴权流程就变成了这样:

用户由于没凭证(sessionId),所以系统重定向到了登录页面。输入账号密码校验完之后,服务端A随机生成一串字符作为sessionId,然后将sessionId作为key,用户信息作为value存储到redis中,返回给客户端sessionId。

用户访问某个资源,请求到了服务器B。在请求中获取到sessionId后,从redis去获取对应的用户信息,获取到则放行。

另一种凭证就是token了。

token

token本身携带用户数据,还包括了该token的过期时间。当你登录之后,服务端会根据加密算法,将用户数据和其他信息加密后生成一个token(就是一串字符),发送给客户端(也是存在cookie中,cookie比较好用,服务端在set-cookie时,可以指定cookie的域和路径。当客户端发送请求时,如果请求的域是cookie被指定的域,并且请求路径中包含cookie被指定的路径,这个http请求就会自动携带上这个cookie)

下次发送请求时,携带上这个token,服务端获取到token后,根据加密算法进行解密,获取用户数据进行校验。如果正确则放行,这个就不会有session的分布式问题,因为数据是在token上的,只要服务端能进行解密校验就行了~

token的实现有很多种,常见的有JWT(Json Web Token),可以了解一下

对于安全性要求高的系统,token的时效就会短,但这样会影响用户的体验,时不时就要你重新登录就很烦。

所以就有了双token的方案。

双token

一个refresh token

一个access token

refresh token的生命周期较长,用于刷新access token。access token生命周期较短。当refresh token过期了,那用户就需要重新登录了。

用户第一次登录时,生成一个refresh token,一个access token返回给客户端。

用户登录成功在发送请求时,携带上access token,服务端获取后,解密出信息,然后校验用户信息,并且查看token是否过期。都没问题则放行。

如果access token过期了,就将refresh token进行解密,看是否过期,如果没过期,则重新生成一个access token。

如果连refresh token都过期了,那就要用户重新登录了~

ok,今天的分享就到这里啦

开发入门中,欢迎指教~

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
A:在Web开发中,cookie、sessiontoken都用于身份认证和保持用户状态,但它们的实现方式和具体用途不同。 1. cookie(HTTP cookie):是一种在客户端保存数据的机制,当用户访问网站时,服务器可以把需要保存的数据通过Set-Cookie响应头发送给客户端,浏览器会自动把这些数据保存在本地,之后每次请求时会把这些数据通过Cookie请求头发送给服务器。cookie本质上是一组键值对,可以保存一些用户登录状态、偏好设置等信息。 2. session:与cookie类似,也是一种保持用户状态的机制,但它的实现方式不同。session是在服务器端创建的,客户端通过一个session ID与服务端进行交互,服务端维护着session数据。通常情况下,session ID会保存在cookie或者URL参数中。Session通过在服务器端保存用户登录状态可以提高安全性,因为Cookie可能被第三方截获。 3. tokentoken是一种在客户端和服务端之间传递认证信息的机制,一般是由服务端签发的,包含了一些认证信息和有效期等内容。客户端在登录成功后,服务端会返回一个token给客户端,在后续的请求中,客户端需要携带该token才能进行认证。token可以放在请求头、Cookie、URL参数等位置,具有跨域、跨平台等优势。相比于使用session使用token能够将负载更多地分散到客户端。 总结:cookie是在客户端保存数据、session是在服务器端保存会话状态、token是一种通过客户端和服务器之间交互的证明身份机制。而且,它们在功能和使用方式上都存在着不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱好怪奇的奈斯

你是我更新的最大动力~么么哒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值