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

单节点单服务前后端分离网站鉴权的最佳实践是什么?

  •  
  •   rv54ntjwfm3ug8 · 2022-03-17 12:10:24 +08:00 via iPhone · 2176 次点击
    这是一个创建于 987 天前的主题,其中的信息可能已经有所发展或是发生改变。
    传统 Session&Cookies 的话感觉 API 传 CSRF Token 防跨站攻击不太方便。JWT 存 localStorage 的话搜了下有人说用户改密码的时候比较难作废 Token ,安全性不如传统 Session 。大家的网站用哪种鉴权方式?
    13 条回复    2022-03-18 11:53:04 +08:00
    wunonglin
        1
    wunonglin  
       2022-03-17 12:16:27 +08:00
    Token != JWT

    session 存 localStorage ,用的时候带到 header ,后端从 header 取,去 redis 验证,成功返回内容,失败返回 401 或 403
    xiaopc
        2
    xiaopc  
       2022-03-17 12:39:28 +08:00
    CSRF Token 可以在前端统一拦截请求添加
    JWT 一般是无状态的;对于改密,可以在 JWT 里加上密码 hash ,请求时验证,这样就变成(某种意义上)有状态的 JWT 了
    LocalStorage 也可以存 Session ,JWT 也可以存 Cookies
    最终选什么方案要看目的是什么
    CEBBCAT
        3
    CEBBCAT  
       2022-03-17 12:50:49 +08:00
    @xiaopc “可以在 JWT 里加上密码 hash”

    前两天正好看到一个问答,说,因为 JWT 的非加密性质,将(即使是 hash 后的)用户信息包含在 payload 中是危险的,因为攻击可以以离线的方式进行

    Ref https://security.stackexchange.com/a/229873
    dzdh
        4
    dzdh  
       2022-03-17 13:25:42 +08:00
    @CEBBCAT HS512 拿当前 HASH 后的密码做密钥
    CEBBCAT
        5
    CEBBCAT  
       2022-03-17 14:03:00 +08:00
    @dzdh 不安全
    xiaopc
        6
    xiaopc  
       2022-03-17 14:03:28 +08:00 via iPhone
    @CEBBCAT …照这么说,服务端也不应该存密码 hash ,因为万一被入侵就「可以以离线的方式进行」爆破密码咯?
    不要听风就是雨,真有爆破疑虑那 JWT 签名密钥还能爆破呢
    实在不放心就用密码最后更新时间咯
    hongfs
        7
    hongfs  
       2022-03-17 15:16:30 +08:00
    JWT 是不需要经过数据库验证的,所以单点登录、踢出是不太方便的。

    我们业务是生成随机 token 然后存 Redis 去验证。
    dzdh
        8
    dzdh  
       2022-03-17 15:16:30 +08:00
    @CEBBCAT 那脑机登录吧
    CEBBCAT
        9
    CEBBCAT  
       2022-03-17 22:43:39 +08:00
    @xiaopc 怎么上来就呛声?吃了炮药?服务端目前业内推荐的密码存储方式是存加盐 hash ,这样将强迫攻击者为每个用户进行一轮穷举。说回 JWT ,一是 JWT 支持非对称加密,二是可以使用加盐的思路防止攻击者查表直接逆向

    希望你已经阅读了别人随附的参考链接
    CEBBCAT
        10
    CEBBCAT  
       2022-03-17 22:46:26 +08:00
    @dzdh “恼羞成怒”
    xuanbg
        11
    xuanbg  
       2022-03-18 07:01:36 +08:00
    JWT 的适用场景是只需要对用户身份做简单验证。因为 Token 本身携带了用户信息,且验证是通过密钥而非数据库进行,所以这种无状态的特性在分布式系统上面用起来就很方便。譬如一个服务端成百上千、用户数非常庞大的 APP ,JWT 这种机制就最好不过了。
    但是,JWT 这种优点也是其最大的缺点。你要是搞一个后台管理系统,有上千项权限需要配置,那 JWT 就是你的噩梦。你必须搞一个保存在服务端的有状态的 Token ,来达成对 Token 的状态的实时管理。
    xiaopc
        12
    xiaopc  
       2022-03-18 11:41:49 +08:00 via iPhone
    @CEBBCAT 当然读了,你读了吗
    CEBBCAT
        13
    CEBBCAT  
       2022-03-18 11:53:04 +08:00 via iPhone
    @xiaopc 那请你讲讲对于我提出的安全疑虑你是如何见招拆招的?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5419 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 85ms · UTC 05:50 · PVG 13:50 · LAX 21:50 · JFK 00:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.