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

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

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

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

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

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

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

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

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

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

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

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