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

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

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

    事情的起因: 之前一直跟安卓和 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 日志也不要打密码,你说的密码配置错了,连接的时候错误信息会提示呀
    xiadong1994
        22
    xiadong1994  
       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   ·   我们的愿景   ·   实用小工具   ·   1587 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:55 · PVG 00:55 · LAX 09:55 · JFK 12:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.