V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yodhcn
V2EX  ›  程序员

为什么微服务架构里网关都是用 JWT 鉴权,而不是用 Session 鉴权?不是也有基于 Redis 实现的分布式 Session 吗?

  •  
  •   yodhcn ·
    yodhcn · 2023-11-15 11:29:08 +08:00 · 4923 次点击
    这是一个创建于 366 天前的主题,其中的信息可能已经有所发展或是发生改变。
    33 条回复    2023-11-16 19:38:27 +08:00
    relsoul
        1
    relsoul  
       2023-11-15 11:40:37 +08:00
    没人回答来简单答答....

    jwt 多方便啊,不用中心态维护,直接做校签就行。(当然你也可以用 redis 来维护 jwt )

    只要微服务的配置中心的密钥一致,那么无论什么微服务都不用依赖 redis ,直接本地做校签,减少架构依赖性。不过某种意义上来说 jwt 也是一种 session ,去中心化的 session 。
    wu00
        2
    wu00  
       2023-11-15 11:47:26 +08:00   ❤️ 1
    即便是有中心化管理(踢人等)会话的需求,redis+jwt token 也比共享 session+cookie 简单好用;
    如果不需要会话管理,无状态的 jwt token 就更好用了,而 session 还是必须做中心共享。
    Chad0000
        3
    Chad0000  
       2023-11-15 11:53:43 +08:00
    JWT 主要是为了本地就可以鉴权,否则这么多服务都请求中心的 Session ,性能是个问题。
    sujin190
        4
    sujin190  
       2023-11-15 12:04:41 +08:00
    干掉 redis 可以省成本不好么。。虽然大型站要做风控并不能做到完全不在服务器保存数据,但是能省一点是一点吧

    其实也就是服务器保存还是客户端保存的问题,客户端存储中小型站少个依赖简单便宜性能好又无需考虑风控,再加上各种框架库支持完善又跨语言跨平台跨集群使用广自然了,生态好也是优势啊而且是大优势,但也没说 JWT 就是完美无敌的吧,中大型站嘛自然是啥都要,区分也就不大了
    Nazz
        5
    Nazz  
       2023-11-15 12:14:08 +08:00 via Android
    因为半桶水的人写了鉴权服务
    dddd1919
        6
    dddd1919  
       2023-11-15 12:32:51 +08:00   ❤️ 2
    不懂 JWT ,理解 JWT ,成为 Session
    见过的很多用 JWT 并搞不清楚使用场景,还要像 Session 一样做缓存加校验,只把它当 Session id 一样使用
    coderzhangsan
        7
    coderzhangsan  
       2023-11-15 12:42:49 +08:00   ❤️ 4
    慢慢的你就会明白,大部分都会回到服务端鉴权,最终就是不伦不类的 JWT ,因为总有些需求,必须让你在服务端做鉴权服务,譬如单点登录,踢人等等。
    yodhcn
        8
    yodhcn  
    OP
       2023-11-15 13:19:00 +08:00
    @wu00 #2
    - JWT 怎么做会话管理?
    - 如果 JWT 会话管理需要依赖 Redis ,与直接用 Redis 做 token 校验有什么区别?优势体现在哪里?

    能请老哥展开讲讲吗?不太了解 JWT
    murmur
        9
    murmur  
       2023-11-15 13:24:46 +08:00
    jwt 本质上和 session 没区别,一种实现形式而已,就那么多复杂的权限和用户信息你 token 想写多长?更别说现在安全要求强制踢下线的功能
    murmur
        10
    murmur  
       2023-11-15 13:25:50 +08:00
    @wu00 除非你不做数据权限,或者简单到行数据直接对应有权限的人,稍微复杂的权限都是得查表的,这权限可能还是实时变化
    gitrebase
        11
    gitrebase  
       2023-11-15 13:27:50 +08:00
    @dddd1919 老哥能讲讲吗,我现在用 JWT 就是在里面存一个 user id ,或者再存个 user role ,就不知道别的用法了
    kkk9
        12
    kkk9  
       2023-11-15 13:30:57 +08:00
    Niphor
        13
    Niphor  
       2023-11-15 13:42:10 +08:00
    想法是好的,JWT 随着需求变来变去,最终就变成了为了完成 KPI ,退化为一个 Id 而已(变成了 Session )
    Qjues
        14
    Qjues  
       2023-11-15 13:43:06 +08:00
    @yodhcn #8 楼 需要会话管理的,就不要用 jwt ,直接 token 就好了,之前公司就有团队新写的鉴权服务,又 jwt ,然后每次都再走一遍 redis token ,检查,不伦不类的。
    1. session+cookie
    2. jwt
    3. redis
    jwt+redis 个人认为真没啥意义。(当然在不同产品线上,可以有部分只用 jwt ,有部分加一层 redis 检查)
    cowcomic
        15
    cowcomic  
       2023-11-15 17:00:20 +08:00
    登录侧基本不用 jwt ,登录踢人,顺延登录时间等等这些东西单用 jwt 都不好弄,还得后台记录,跟 session 没啥区别,反而还要自己维护,包括多 jwt 之间的冲突,分布式 session 现在也很成熟,直接使用就行
    现在 jwt 基本就只用在开放 API 做认证以及开放页面组件会面临跨域的情况下,这些场景是能体现 jwt 简单方便的一面的
    afeiche
        16
    afeiche  
       2023-11-15 17:33:03 +08:00
    没有会话的话就做成那种带时间戳的 token ,有会话感觉还是用 session 靠谱
    Conantv2
        17
    Conantv2  
       2023-11-15 17:34:55 +08:00
    在部分场景 jwt 跟布隆过滤器作用类似,通过的不一定真的能通过,但是不通过的就一定不通过。

    比如回复评论,单一 token 模式每个请求你都得查后端,用 jwt 的话在边缘脚本就可以先验签,无效签名和 jwt 中没有权限的可以直接拒绝,剩下的请求才打到后端,虽然剩下的也不一定有效的,还是要查库,但是查库请求大量降低了。
    lambdaq
        18
    lambdaq  
       2023-11-15 17:40:04 +08:00
    如果你要问两者优劣,楼下老哥可以给你洋洋洒洒一大篇

    如果你要问为什么,那么一句话就可以结题了:因为培训班只教 jwt
    nothingistrue
        19
    nothingistrue  
       2023-11-15 17:42:39 +08:00
    先想想 Session 是什么,微服务之间能不能有 Session 。
    BeautifulSoap
        20
    BeautifulSoap  
       2023-11-15 17:46:31 +08:00
    jwt 等同于互联网古早时期直接在 cookie 里塞用户名/用户 id ,然后服务器获取 cookie 里的用户名/用户 id 后直接登录(当然用户名/id 相关字段是加密的)。它和 jwt 的区别也就 jwt 有效时间非常短,又有签名可以防篡改,除此之外缺点一模一样。比如因为非中心化,发出去的 cookie/jwt 你没法主动让其无效,只能干等着。生成 jwt 的密钥一旦泄露,攻击者就可以捏造任意的 jwt 登录任意账户而服务端没办法检验
    fcfangcc
        21
    fcfangcc  
       2023-11-15 17:50:31 +08:00
    @nothingistrue 外部请求在网关层就已经吧 session/cookie 转化成用户信息存在后续 rpc 的 context 中了,内部的微服务之间只需要从 context 拿需要的用户信息就行,为啥要去访问 session ?
    qW7bo2FbzbC0
        22
    qW7bo2FbzbC0  
       2023-11-15 17:54:25 +08:00
    楼上说的对,是这样的,内部信赖环境,服务之间互相用一用挺方便的。
    aogg
        23
    aogg  
       2023-11-15 17:56:52 +08:00
    jwt 也可以主动失效,根据 jwt 里的时间即可
    IvanLi127
        24
    IvanLi127  
       2023-11-15 18:20:55 +08:00 via Android
    能减少调用啊,jwt 直接本地就能验证,session 不得在线验证?
    mmdsun
        25
    mmdsun  
       2023-11-15 18:39:50 +08:00 via iPhone
    session 也能不需要 cookie ,Header 传值就行。
    比如:spring redis session 项目,而且集成也超级简单。

    jwt+redis 只能管理会话可以用黑名单,不然和 session 没区别了
    zoharSoul
        26
    zoharSoul  
       2023-11-15 18:43:12 +08:00
    你用 session app 咋办?
    dddd1919
        27
    dddd1919  
       2023-11-15 22:29:44 +08:00
    @gitrebase JWT 就是一个加解密的算法实现,可以不同服务使用同一套算法和配置完成去中心认证,另外按照约定可以带一节明文信息,这是优势。
    优势在具体使用场景,甚至更多场景下看就是不足,比如改密码要让已发放的 JWT token 失效,或者强制将 token 踢下线,这种 JWT 算法无法控制,如果加上逻辑层的控制比如黑名单这种,在多机环境下,那就跟 session 机制没有任何区别了。业务系统一般对会话都有些限制要求,出于可控性考虑,session 会更为通用
    aragakiyuii
        28
    aragakiyuii  
       2023-11-15 22:54:35 +08:00 via iPhone
    把它当成字符串用就没区别
    session 能干的 jwt 也能干,jwt 能干的 session 干不了,就看你想不想多写点生成 jwt 和解析 jwt 的代码了
    dyllen
        29
    dyllen  
       2023-11-16 10:23:53 +08:00
    @Conantv2 从这个角度用 jwt 和存储混合用还是有意义的
    kaneg
        30
    kaneg  
       2023-11-16 12:09:32 +08:00
    一般来说对于 web 网站,http session 用起来比较简单,但也存在几个问题:
    1 )因为是基于 cookie 的,在浏览器里不能跨域,不适应完全没有隶属关系的多域名场景
    2) 对业务数据有写操作的 API 要加 CSRF header 防攻击
    PVXLL
        31
    PVXLL  
       2023-11-16 13:02:05 +08:00 via iPhone
    很多菜鸡把 jwt 当 sessionkey 来使用脱裤子放屁
    justdoit123
        32
    justdoit123  
       2023-11-16 15:08:01 +08:00
    看到 2 楼喷 session+cookie 我就想笑。

    Web 场景下,你 jwt 放哪里?不还是得放在 http-only + secure 的 cookie 里?

    什么?你不放 cookie 里,你要放在 localStorage 里?注入的 js 攻击分分钟偷走你的宝贝 jwt 。
    llwwbb7
        33
    llwwbb7  
       364 天前
    jwt 是一个具体的实现
    session 是个什么玩意,为什么好像人人都知道?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2825 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 11:31 · PVG 19:31 · LAX 03:31 · JFK 06:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.