V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
whx20202
V2EX  ›  问与答

请教一下 JWT 在前后端分离下的实现

  •  
  •   whx20202 · 2018-01-28 12:14:05 +08:00 · 4542 次点击
    这是一个创建于 2476 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近做一个简单的网站,需要登录功能,打算使用 JWT。

    昨天看了好多相关资料,对其数据结构大致了解了一下。 有个网站说 JWT 存储在浏览器本地,有 localstorage 和 cookie 两种方式,cookie 如果设置 http-only 更加安全。

    那我就打算采用 cookie + http-only 了。

    问题是由于某种原因,我的网站是完全前后端分离的,这里指的是一个模板都不能渲染,全部 jquery 异步接口。

    现在问题是: 我如果登录首页,这是个静态页面,只有 js 能干活。而 cookie 又是 http-only 的,我怎么知道:

    1. 我是谁?(类比百度首页右上角有自己的 ID )
    2. 如果不访问后台异步接口的话,纯 js 怎么知道自己的 JWT 有没有过期?

    还往各位不吝赐教

    10 条回复    2018-01-28 23:26:55 +08:00
    vx2e
        1
    vx2e  
       2018-01-28 12:24:52 +08:00
    前后端分离 通信异步请求数据的时候把 cookie 传给服务端就可以了啊 具体怎么带 cookie 资料很多 搜一下就有
    htfy96
        2
    htfy96  
       2018-01-28 12:47:37 +08:00   ❤️ 1
    1. 请求一下 GET /user/me
    2. 定期 renew token
    hcymk2
        3
    hcymk2  
       2018-01-28 12:56:52 +08:00
    JWT 用 cookie 又是 http-only 意义就不大了, 因为 JWT 不只是一个 token,里面还含有其他信息,用来本地缓存。
    hanzichi
        4
    hanzichi  
       2018-01-28 13:40:07 +08:00
    说一下我的理解,可能有误

    token 主要是为了防 csrf 攻击,如果是 cookie 存的话,不是防不了了么。。
    sunjourney
        5
    sunjourney  
       2018-01-28 13:42:13 +08:00   ❤️ 1
    http-only,你的 cookie 只能是提供给后端做校验了。可以 request http://api.xx.com/auth 拿到我是谁,权限有啥,前端就不直接碰 JWT 了。
    fqwerl
        6
    fqwerl  
       2018-01-28 14:56:10 +08:00 via Android
    通常使用 JWT 的目的之一就是不想使用 cookie/session 机制(安全问题,后端扩展问题等),cookie 越来越不受欢迎了,最好还是把 jwt 放内存或者 local storage 里
    whx20202
        7
    whx20202  
    OP
       2018-01-28 14:59:56 +08:00
    @fqwerl 有些教程说,JWT 的目的有两个:
    1. 如果后端是多个 web 服务器,传统的 session 就不好使了,得加一层 redis,所以采用 JWT
    2. 违背 RESTful 风格
    第一个我理解,第二个是不是跟你说的原因一样?能简单解释下吗?
    hcymk2
        8
    hcymk2  
       2018-01-28 16:36:39 +08:00
    JWT 的安全成本更高,当 JWT 保存在 Local Storage 时,更容易被 xss,而且要想根除 xss 的威胁要前后端都要做大量细致的工作。而 JWT 放在 cookie ( http-only )中的话,这样其实和传统的 cookie/session 机制基本没有什么区别。
    nl101531
        9
    nl101531  
       2018-01-28 20:21:34 +08:00 via Android
    请求 user/me,拿到信息后放 sessionStorge 中。jwt 只用来认证。

    另外顺便问下 jwt 多密钥怎么搞?
    ivydom
        10
    ivydom  
       2018-01-28 23:26:55 +08:00 via iPhone   ❤️ 1
    https://github.com/Authing/authing 最近做了个云端用户认证系统 使用了 jwt 楼主可以参考
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1021 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:41 · PVG 03:41 · LAX 11:41 · JFK 14:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.