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

2022-03-17 12:10:24 +08:00
 rv54ntjwfm3ug8
传统 Session&Cookies 的话感觉 API 传 CSRF Token 防跨站攻击不太方便。JWT 存 localStorage 的话搜了下有人说用户改密码的时候比较难作废 Token ,安全性不如传统 Session 。大家的网站用哪种鉴权方式?
2159 次点击
所在节点    程序员
13 条回复
wunonglin
2022-03-17 12:16:27 +08:00
Token != JWT

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

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

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

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

希望你已经阅读了别人随附的参考链接
CEBBCAT
2022-03-17 22:46:26 +08:00
@dzdh “恼羞成怒”
xuanbg
2022-03-18 07:01:36 +08:00
JWT 的适用场景是只需要对用户身份做简单验证。因为 Token 本身携带了用户信息,且验证是通过密钥而非数据库进行,所以这种无状态的特性在分布式系统上面用起来就很方便。譬如一个服务端成百上千、用户数非常庞大的 APP ,JWT 这种机制就最好不过了。
但是,JWT 这种优点也是其最大的缺点。你要是搞一个后台管理系统,有上千项权限需要配置,那 JWT 就是你的噩梦。你必须搞一个保存在服务端的有状态的 Token ,来达成对 Token 的状态的实时管理。
xiaopc
2022-03-18 11:41:49 +08:00
@CEBBCAT 当然读了,你读了吗
CEBBCAT
2022-03-18 11:53:04 +08:00
@xiaopc 那请你讲讲对于我提出的安全疑虑你是如何见招拆招的?

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

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

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

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

© 2021 V2EX