大佬们好, JWT 如何防止多端登录 ?

2024-03-15 15:09:02 +08:00
 junwind

如题,现在登录,我使用了 JWT 机制,但是怎么防止一个用户,在多个设备上登录呢?

9911 次点击
所在节点    程序员
55 条回复
sherryqueen
2024-03-16 11:52:53 +08:00
jwt 本身是无状态的~. 不过你真想做, 就走了 cookie-session 那套了. 需要后端来维护 jwt 的状态了. 脱离了 jwt 本身的意义.. 一般推荐就是将 jwt 的过期时间调低~
xylophone21
2024-03-16 12:05:00 +08:00
你如何定义多端登录?至少在上面的讨论中看到过两种定义
1.用第三方的客户端多端登录,别说 jwt ,即使是 session ,你也拦不住对方多端交换 sessionid/token ,然后把这些塞到 HTTP 头里。除非你每个接口都刷新,但这样万一失败一次,登录就被踢了,体验恐怕很难做好。
2.用你的客户端,浏览器多端登录。那把客户端 Id 塞到 JWT 不就可以了
xylophone21
2024-03-16 12:27:54 +08:00
不好意思,写到一半想岔了,目标是防止多端登录,写着写着想成了如何实现多端登录。
第一种情况不变,第二种情况下实际上就变成了第二个端登录时,如何吊销第一个端的 JWT ?好了标准答案来了,标准的 JWT 不支持提前吊销。那怎么办?当然是非标准的 JWT ,比如前面提到的把 JWT 存到 Redis ,以及如果你更多的搜一下可以找到的优化方案--只存吊销列表的布隆等
ns09005264
2024-03-16 12:40:40 +08:00
我觉得,jwt 最大的意义是自带信息。

生成 jwt token 的时候除了必要的用户信息外,还可以加上登录时的设备信息,比如 ip 、user-agent 或其他识别信息等。这样 jwt token 里就包含设备信息了。
后续验证 jwt token 时,看它的请求头里和 jwt token 包含的信息是否对应得上,对不上就是多端使用 jwt token 了

比如该用户在 PC 浏览器上登录了,服务器为此生成了 jwt token ,这个 token 中包含的 user-agent 是 pc 的。
后面该用户把 jwt token 复制到 Android 浏览器上用来使用,但是请求头中的 user-agent 和 jwt token 里的对应不上,那么就是异端登录了。
yannxia
2024-03-16 12:43:23 +08:00
原来怎么做,现在就怎么做,Session 分了一个 ID ,JWT 你也可以。没什么区别
ns09005264
2024-03-16 12:56:51 +08:00
https://gateway.pinata.cloud/ipfs/QmWv2NmD5iLVTsSo3QkEsGnHKxtQqMoeZZTs76ohGz1aHC

图里这个 jwt token 是在 linux 下 firefox 中登录时生成的,如果用户把这个 token 拿到 windows 上的 chrome 去用,只需要获取请求头中的 user-agent 就可以判断它是异端登录。整个过程依旧是无状态的,根本不需要在服务器的什么地方维护用户的登录和设备信息。
Lexgni
2024-03-16 13:34:08 +08:00
建议别用 jwt
FYFX
2024-03-16 13:36:11 +08:00
@ns09005264 #46
依赖 ua 就不太靠谱吧
hafuhafu
2024-03-16 13:47:59 +08:00
还是要在服务端维护状态进行判断。JWT 本身是无状态的,并不代表它一定要用在完全无状态的场景,可以当成本身就是一个编码过的字符串,里面有信息而已,完全可以继续用。
JaguarJack
2024-03-16 13:52:01 +08:00
@angel001ma 😂兄弟别误人子弟,这叫单端登录,单点其实是全端登录
ns09005264
2024-03-16 14:00:55 +08:00
@FYFX 只是用 user-agnet 举个例子,不想那么严格的时候可以根据 user-agent 来判断,只要别在验证不通过时明确告知原因就能阻挡一部分非法请求。想严格一点可以用浏览器指纹或设备 id 之类的。总之这是多设备识别的时间,有状态的 sessionID 能做到的,无状态的 jwt token 也能做到。
skull
2024-03-16 18:02:59 +08:00
@angel001ma 原来你是这么字面理解的啊
Plutooo
2024-03-17 00:57:36 +08:00
看到 11 楼笑出声
Zy143L
2024-03-18 00:39:26 +08:00
是想设计成挤号还是禁止多登陆呢
挤号的话就存 JWT 判断提交的是否和库里面的一样就行了
yrzs
2024-03-20 09:41:44 +08:00
@zhongjun96 确实没意义 但是强行改 jwt 这样最方便

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1023997

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX