当前位置: 首页 > 知识库问答 >
问题:

后端 - token需要放在redis吗?

别开诚
2023-11-10

新人学习token鉴权有个疑惑,token本身有加密的用户信息,并保存在客户端.如果token只存在客户端,感觉并不够安全,且无法主动退出登录(无法主动过期).

听说一般token都存在redis里,那本质上就是在服务端也保存了token,可以通过token-userId的形式存储.如果是这样的话,token本身的意义是什么,token根据就不需要携带用户信息

似乎可以在客户端创建一个随机clientId,然后携带在header上,调用登录接口后, 后端以clientId-userId的形式将clientId存在redis里.这种方式似乎更简洁, 携带的数据量更少也更安全

共有4个答案

柳珂
2023-11-10

1、token本身可以带用户信息也可以不带啊,服务端发放token的时候无非就是返回一个字符串,里面要包含什么内容是服务端定义好的,但是一般必须的有超时时间和其他可以公开的信息,比如jwt本身就是明文的,要么你就放可以公开的信息,要么就放加密过的信息
2、token在发放的时候需要对请求token的用户进行身份校验,然后客户端带着token去请求服务端的其他资源,起到的就是一个鉴权的作用,但是要不要在收到客户端的token时再次根据token里的用户信息进行校验(因为可能token里根本没有用户信息)这是不一定的,服务端完全可以只看token对不对得上而不必管是哪个用户发起的就放行资源
3、放Redis纯粹只是出于减轻服务器压力,减少响应时间考虑而已,放哪里其实都可以
4、token是肯定要放在服务端的,要不然没法鉴权

秦博延
2023-11-10

不一定要放在redis里面,只不过这种方式现在用的人多,比较普及。

最简单的情况,你可以把token数据放在程序内存里面,但是有问题,一个是内存占用的问题,二是程序有多个实例的情况下不方便共享数据,三是不能持久化数据重启后会丢数据。

也可以把token直接放在数据库里,用户基数比较多的情况下,每个请求都查询一次数据库,数据库压力还是有点大的。

所以现在比较流行把token放在redis里面缓存一下,查询效率会比较高,上面几个问题都能一次解决。


token本身可以不用携带用户信息,使用一个随机Key就可以作为token发送给客户端,客户端后面的请求,服务端只要在后台记录这个token和用户的绑定关系,就能获取到用户的信息,就能达到鉴权的目的。生成随机token的时候,降低重复的概率,在token里面加个userid等信息也是可以的。

洪飞扬
2023-11-10

因为一旦token生成后,就无法修改信息,但是实际业务有个场景比如说token过期时间是30天,该用户因为某些操作遭到封禁,我现在需要踢出用户,但是token已经下发了没办法收回与修改,这时候token存在redis就有用了,正常权限验证除了解析token是否合法,还得判断token是否在redis里,至于redis里面存个userId也好,存个数值1也好,只要有这个key就行了,你要是想踢出这用户,删除这个key就行

养焱
2023-11-10

梳理下你的问题:

  1. token是否只需要存在客户端。
    token需要存储在服务器端。客户端存token是因为服务器端要鉴权,所以获取到token后要存下来。如果服务器端校验这个token已经失效,客户端需要跳转到登录页面。客户端可以通过退出登录失效token。
    完整流程:用户登录 - 登录成功 - 服务器颁发token - 用户带着token使用系统 - token失效/用户退出登录 - 整个流程再来一遍
  2. token的意义是什么。
    token用来判断用户的登录态,token必须跟用户绑定。
  3. 是否客户端颁发类似token的东西
    这个token必须是服务器端颁发的,并且只能是在用户名密码校验成功以后颁发。客户端给自己颁发岂不是监守自盗了。
 类似资料:
  • 今天,我们从为前端应用程序购买了EV ssl证书,一切正常。但是由于我们在后端没有ssl证书,这是否意味着我们从前端传递到后端的数据将是未加密的? 前端和后端服务器都需要ssl证书吗? 我们的后端只有服务器向我们的前端应用程序请求,没有其他客户端连接到我们的后端?那么,可以为后端使用自签名或廉价的SSL证书吗? 还是从购买另一个ssl证书?(有点贵) 我已经讨论了几个堆栈溢出问题,似乎建议在两个服

  • 在前后端分离的项目中,如果客户端携带的token被其他人获得了,其他人使用该token请求得到该用户的数据。有什么方法可以解决这个问题吗? 目前想到的是:在token中携带登录时的设备IP,同时采用对token进行签名避免篡改,在请求数据的时候验证IP是否一致,不一致则返回重新登录。

  • 本文向大家介绍VMware vSphere所需要开放的端口清单,包括了VMware vSphere所需要开放的端口清单的使用技巧和注意事项,需要的朋友参考一下     80 vCenter Server需要端口80用于直接HTTP连接。端口80会将请求重定向到HTTPS端口443。如果意外使用了http://server而不是https://server,此端口将非常有用。     389 此端口

  • 问题内容: 我想我对使用Redis的所有命令都有很好的了解,但是我很难确定使用它的最佳方法。我正在设计一个客户通知系统,当他们的任何电路出现警报时,都会通过他们的首选方法(电子邮件,SNMP,Syslog)通知他们。 这样,我得到一个设备名称和一个端口。我需要将其与一个客户相关联,然后将该客户与一种交付方式相关联。使用关系数据库时,看起来可能像这样: (大大简化了示例)。 我可以看到如何使用列表哈

  • 今天我试着从Obj-C出发,去Swift,我正在阅读文档。我试图用Swift创建一个简单的IBOutlet,但它总是给我这些错误。 必需的init(coder-aDecoder:NSCoder){fatalError(“init(coder:)尚未实现”)} 这段代码会不断弹出: 但当我添加一个!马克,它运行时没有像这样的错误 同样的事情也发生在iBaction上。。。

  • 这是我对Rest模板的配置,