JSON Web Token 如何保证 token 的安全性? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Zach369
V2EX    程序员

JSON Web Token 如何保证 token 的安全性?

  •  
  •   Zach369 2019-08-22 16:22:16 +08:00 8044 次点击
    这是一个创建于 2245 天前的主题,其中的信息可能已经有所发展或是发生改变。

    事情的起因: 之前一直跟安卓和 ios 做 api,使用 jwt 的形式进行交互。

    今天突发奇想,如何保证 token 的安全性那。假如我拿到 token 就可以调用服务器端的任何接口。这是多么的可怕。

    目前为上线的项目都是 https。

    求解??? 
    36 条回复    2019-08-23 15:53:30 +08:00
    oott123
        1
    oott123  
       2019-08-22 16:30:55 +08:00   17
    假如我拿到你的帐号密码,我可以登录你的帐号,这是多么的可怕。
    miaomiao0323
        2
    miaomiao0323  
       2019-08-22 16:34:16 +08:00
    token 不要放在 get 的参数里,容易通过 referer 泄漏。
    XRR
        3
    XRR  
       2019-08-22 16:34:20 +08:00
    token 劫持,可以校验登陆的 ip 和调用接口时的 ip,如果有不同就要求用户重新登陆
    diferent
        4
    diferent  
       2019-08-22 16:42:47 +08:00   1
    @XRR 移动端怎么办. 高铁,开发换基站. 家里移动网络和 WIFI 互换. 互联网场景没有哪家会这么严格的. 除非是银行金融 APP
    baiyi
        5
    baiyi  
       2019-08-22 16:47:27 +08:00   1
    @XRR #3 这样用户体验太差了,不建议这么做

    有 https 防中间人就够了,你没有办法保证用户不会丢失 token,就像你没有办法保证用户不会将密码告诉别人一样

    不过可以做一些措施保证用户丢失 token 后,你能尽量减少损失,或者通知用户。比如说刷新 token,判断常用 ip 等方法
    baiyi
        6
    baiyi  
       2019-08-22 16:48:39 +08:00
    @baiyi #5 常用 ip -> 常用地址
    jorneyr
        7
    jorneyr  
       2019-08-22 16:48:59 +08:00   1
    你拿到 cookie 一样可以调用服务器端的任何接口,所以 token 和 cookie 没有本质区别。
    codeyuyu
        8
    codeyuyu  
       2019-08-22 17:00:32 +08:00
    所以 安全性强的不会用 jwt,因为无状态和吊销无法两全
    AreYou0k
        9
    AreYou0k  
       2019-08-22 17:02:10 +08:00   1
    建议用脑电波登录
    arrow8899
        10
    arrow8899  
       2019-08-22 17:12:44 +08:00
    汗。。。只要你用了 HTTPS,双向证书校验,数据库密码加密 + hash,日志脱敏,那么别人基本不可能获取到用户的 token,除非用户主动把密码告诉别人,这种你可以参考支付宝的风控技术。
    maichael
        11
    maichael  
       2019-08-22 17:18:50 +08:00
    你不防中间人,你用啥鉴权都有这问题呀。
    chinvo
        12
    chinvo  
       2019-08-22 17:19:12 +08:00 via iPhone
    如果你认为你担心的问题 https 不能解决,那么你所担心的就是反机器人问题
    guokeke
        13
    guokeke  
       2019-08-22 17:36:31 +08:00
    登录的时候手机二次验证 :>
    flyingghost
        14
    flyingghost  
       2019-08-22 17:50:03 +08:00
    假如我拿到你的手机,我可以查看修改你的所有数据,这是多么的可怕!
    所以说我们应该抛弃手机吗?
    既然很难有什么技术是“绝对安全”的,我们就需要唾弃所有那些有漏洞的技术方案吗?

    安全从来都是有限制有范围的相对安全。请在明确定义安全防护能力的前提下选择技术方案。
    如果你需要考虑 token 失密问题,那就给方案打补丁(比如缩短 token 有效期)或者换方案(比如双端证书)。
    如果你需要考虑密码失密问题,那就上指纹上虹膜。
    如果你需要考虑手机丢失问题。。。
    如果你需要考虑用户已叛国成为间谍问题。。。

    你可以无限制的加高安全壁垒,相应的你需要付出相应的成本。
    lurenw
        15
    lurenw  
       2019-08-22 17:56:14 +08:00
    token 不保证安全, 保证安全的是 HTTPS
    tachikomachann
        16
    tachikomachann  
       2019-08-22 17:58:38 +08:00 via Android
    jwt 有别于其他方式的安全问题在于,不依赖服务端保存 token 的话,无法实现某个 jwt 主动失效(非过期失效)。
    所以要么缩短每个 jwt 的有效期,要么还是要服务端再存一份。
    Mutoo
        17
    Mutoo  
       2019-08-22 19:50:35 +08:00
    1) Rule-Based Access Control: 将接口权限分散,各 token 执有的权限不尽相同,切不可一个 token 拥有所有权限。
    2) 对不同的权限设置合理的过期时间。
    3) 传输 token 时使用 https 并把 token 放在 request header 的 auth 字段。保证 token 不被中间人获取,不进入日志系统。
    areless
        18
    areless  
       2019-08-22 20:51:18 +08:00 via Android
    jwt 有鬼 ip 客户端特征,就用字符串混淆了一下便是现代 api 的通用方案了(笑)。公网只能判断客户端特征。内网绑定 mac 固化 arp,靠网络技术而非编程技巧了
    Varobjs
        19
    Varobjs  
       2019-08-22 22:19:54 +08:00 via Android
    @arrow8899 请教一下,日志脱敏很有必要吗?日志不是给开发调试看的吗,难道不是越详细越好?举个例子,数据库连接失败,密码都错配置了,如果脱敏那就看不到有效信息了
    1762628386
        20
    1762628386  
       2019-08-22 22:21:45 +08:00
    别把 token 当会话使用,一个功能一个 token
    iyaozhen
        21
    iyaozhen  
       2019-08-23 00:12:48 +08:00
    @Varobjs 日志不是越详细越好呀 打出关键信息就行,何为关键,就需要一些经验了,多查几次线上问题就知道了

    即使 debug 日志也不要打密码,你说的密码配置错了,连接的时候错误信息会提示呀
    trn4
        22
    trn4  
       2019-08-23 02:25:33 +08:00
    @tachikomachann jwt 有 exp 的 claim 啊
    skiy
        23
    skiy  
       2019-08-23 07:22:06 +08:00 via Android
    jwt 就没啥安全性可言。之前了解过。还不如直接用 token
    fengpan567
        24
    fengpan567  
       2019-08-23 08:25:43 +08:00
    为什么要保证?都拿到了你的 token 或者 cookie 了,说明安全问题已经出现了
    Perolong
        25
    Perolong  
       2019-08-23 08:33:53 +08:00 via Android
    因为一般一个 token 只是能拿到当前用户的权限,并不是 admin 级别的啊,你自己的 token 是删不了其他用户的东西的,如果可以,说明后台偷懒了
    HarryQu
        26
    HarryQu  
       2019-08-23 08:47:38 +08:00 via Android   1
    设备生产一个 唯一的 device id, 登录的时候 存储 device id。
    同时验证 token 和 deviceid。
    Leigg
        27
    Leigg  
       2019-08-23 09:23:04 +08:00 via Android
    尝试过 jwt,认为不是一个适用于登录登出场景的方案,用户修改密码,注销登陆都不好解决,或者说都需要数据库来辅助实现,倒不如直接使用 token。有 redis 的辅助,可以很方便实现在线用户数统计,用户实际在线时长统计。所以啊,jwt 还是更适用于一次性的数据传输。
    iamdj
        28
    iamdj  
       2019-08-23 09:34:33 +08:00 via Android
    额 按道理说调用后台的话 先解析 token 获取比如说用户名 然后根据用户名再查这个用户有没有权限类似的 怎么就会调用所有接口呢。
    print1024
        29
    print1024  
       2019-08-23 10:21:24 +08:00
    jwt 只是为了方便系统间交互,并不安全,想安全那就要在网络传输方面下功夫
    dosmlp
        30
    dosmlp  
       2019-08-23 10:32:47 +08:00
    用 https 防劫持,至于端的安全你是无能为力的
    Vegetable
        31
    Vegetable  
       2019-08-23 10:34:42 +08:00
    你凭什么能拿到别人的 token?
    nikandaoleshenme
        32
    nikandaoleshenme  
       2019-08-23 10:42:02 +08:00
    1 楼回答已经结贴了,sf 发的帖,又跑这来了
    unco020511
        33
    unco020511  
       2019-08-23 11:01:05 +08:00
    别人拿到你的 token 也没用,你接口如果有签名校验,怎么攻击你,参考支付宝和微信的接口
    tachikomachann
        34
    tachikomachann  
       2019-08-23 11:09:57 +08:00
    @xiadong1994 #22 jwt 的 exp 没法实现服务端主动失效吧?比如用户登出后注销所有会话,用户改密码了,用户被禁用了。
    yule111222
        35
    yule111222  
       2019-08-23 11:11:56 +08:00
    后端也不是有一个 token 就能访问所有服务的呀。。。没有权限控制?
    luozic
        36
    luozic  
       2019-08-23 15:53:30 +08:00
    token 有啥?没有 RABC 的锅找 token 背?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     983 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 22:36 PVG 06:36 LAX 15:36 JFK 18:36
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86