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

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

  •  
  •   Zach369 · 112 天前 · 3548 次点击
    这是一个创建于 112 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

    即使 debug 日志也不要打密码,你说的密码配置错了,连接的时候错误信息会提示呀
        22
    xiadong1994   112 天前
    @tachikomachann jwt 有 exp 的 claim 啊
        23
    skiy   112 天前 via Android
    jwt 就没啥安全性可言。之前了解过。还不如直接用 token
        24
    fengpan567   111 天前
    为什么要保证?都拿到了你的 token 或者 cookie 了,说明安全问题已经出现了
        25
    Perolong   111 天前 via Android
    因为一般一个 token 只是能拿到当前用户的权限,并不是 admin 级别的啊,你自己的 token 是删不了其他用户的东西的,如果可以,说明后台偷懒了
        26
    HarryQu   111 天前 via Android   ♥ 1
    设备生产一个 唯一的 device id, 登录的时候 存储 device id。
    同时验证 token 和 deviceid。
        27
    Leigg   111 天前 via Android
    尝试过 jwt,认为不是一个适用于登录登出场景的方案,用户修改密码,注销登陆都不好解决,或者说都需要数据库来辅助实现,倒不如直接使用 token。有 redis 的辅助,可以很方便实现在线用户数统计,用户实际在线时长统计。所以啊,jwt 还是更适用于一次性的数据传输。
        28
    iamdj   111 天前 via Android
    额 按道理说调用后台的话 先解析 token 获取比如说用户名 然后根据用户名再查这个用户有没有权限类似的 怎么就会调用所有接口呢。
        29
    print1024   111 天前
    jwt 只是为了方便系统间交互,并不安全,想安全那就要在网络传输方面下功夫
        30
    dosmlp   111 天前
    用 https 防劫持,至于端的安全你是无能为力的
        31
    Vegetable   111 天前
    你凭什么能拿到别人的 token?
        32
    nikandaoleshenme   111 天前
    1 楼回答已经结贴了,sf 发的帖,又跑这来了
        33
    unco020511   111 天前
    别人拿到你的 token 也没用,你接口如果有签名校验,怎么攻击你,参考支付宝和微信的接口
        34
    tachikomachann   111 天前
    @xiadong1994 #22 jwt 的 exp 没法实现服务端主动失效吧?比如用户登出后注销所有会话,用户改密码了,用户被禁用了。
        35
    yule111222   111 天前
    后端也不是有一个 token 就能访问所有服务的呀。。。没有权限控制?
        36
    luozic   111 天前
    token 有啥?没有 RABC 的锅找 token 背?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1460 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 23:52 · PVG 07:52 · LAX 15:52 · JFK 18:52
    ♥ Do have faith in what you're doing.