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

渣渣写了一篇关于 Web 前后端之间认证技术的文章

  •  1
     
  •   Kilerd · 2018-02-23 12:22:07 +08:00 · 2088 次点击
    这是一个创建于 2470 天前的主题,其中的信息可能已经有所发展或是发生改变。

    嗯,这本来是写给我那个刚刚入门后端的同学看的,所以文风不会很严谨,用的是比较通俗的文字来大概讲清楚几种技术的流程

    技术面涉及 Cookies Session Token JWT

    有兴趣的可以去看看 浅谈 WEB 用户验证的几种方式

    如有错误,欢迎指出,谢谢

    (顺便帮博客拉点人气

    11 条回复    2018-02-23 23:28:53 +08:00
    xmsz
        1
    xmsz  
       2018-02-23 13:51:05 +08:00
    不是
    什么是『 Web 前后端 之间 认证』???
    470326964
        2
    470326964  
       2018-02-23 13:59:59 +08:00
    点个赞
    loy6491
        3
    loy6491  
       2018-02-23 14:12:52 +08:00 via iPhone
    以为会讲 csrf
    Kilerd
        4
    Kilerd  
    OP
       2018-02-23 14:16:24 +08:00
    @loy6491 csrf 这个其实不难吧。
    RqPS6rhmP3Nyn3Tm
        5
    RqPS6rhmP3Nyn3Tm  
       2018-02-23 15:12:49 +08:00 via iPhone
    我一般用 token 和 hmac 就差不多了。
    主要是懒
    KuroNekoFan
        6
    KuroNekoFan  
       2018-02-23 15:30:16 +08:00
    不错
    chairuosen
        7
    chairuosen  
       2018-02-23 15:33:29 +08:00
    其实本质都是 token,不同形式的 token,不同内容的 token 而已
    hxsf
        8
    hxsf  
       2018-02-23 15:35:59 +08:00   ❤️ 1
    1.
    >> HTTPS 无法加密 URL 内容。新版提案在促进这个过程
    HTTPS 无法对中间人保密“访问的站点”(即中间人知道你访问了哪个域名 or ip ),但中间人看不到具体路径。

    2.
    >> 前后端分离时 :并且前端采用 axios 来构建一个 HTTP 连接时,不会自动加上 Cookies,所以 Cookies 在前后端分离中并不能使用。

    不自动带 cookie 是因为 cors 的原因,这锅 axios 不背。合理的 cors 策略可以自动带 cookie 的。

    3.
    >> Session 是依赖 Cookies 存在的,所以在前后端分离中自然不能使用。

    sessionID 不放 cookie,让前端每次放 header 里可以不?
    sessionID 就是个 token
    session 是个后端技术,cookie 是个前端技术,两者通常一起被使用。并不是谁归属于谁。

    4.
    >> 简单来说,JWT 是 Token 的具体且应用广泛的实现。
    >> 上文讲到 Token 可以理解成为用户自己实现的 Session,那么 JWT 在某种程度上可以理解为自己实现的 Cookies
    这两句是不是矛盾了?

    jwt 你也可以只在 payload 里存个 id 啊。

    5. session 最常见的不是 文件 + 内存 么。。。
    Kilerd
        9
    Kilerd  
    OP
       2018-02-23 22:33:17 +08:00
    @hxsf 是否感谢认真阅读

    1. 认识不足,多谢指出(没太认真去读 HTTPS 的相关内容

    2. 因为通常在使用 axios 的时候,不会使用同一个 session 来访问,所以默认是不会带上 Cookies 的(也可能我不是职业前端,对 axios 认识不足。

    3. 对于 session 来说,业界普遍都是采取在 cookies 中存 session-id,从而达到对用户透明。这是在传统的非分离式开发的情况。当然了你都把他放在 header 里面了,还叫 session,我也没有办法。 而且在文中,我对 session 的评价是
    「 Session 是在 Cookies 发展中为了解决 Cookies 某些弊端而产生的技术,但是本质上还是 Cookies 的使用。」 和 「 Session 是依赖 Cookies 存在的,所以在前后端分离中自然不能使用。」 我并没有说过 Session 是属于 Cookies 的一部分。 可是事实上 Session 确实是利用了 Cookies Max-age 来做到「关闭浏览器失效」的功能

    4.「上文讲到 Token 可以理解成为用户自己实现的 Session,那么 JWT 在某种程度上可以理解为自己实现的 Cookies 」 这点,我认为类似的方向指的是「 Token 和 Session 通常是在 Client 端储存 ID,而 cookies 和 JWT 在 ID 的前提上还可以储存 非敏感信息」。会不会是你理解出错了,也可能是我文笔不好

    5. 可能是我描述不太妥当,我想表示的意思是,session 如果按可访问性来讲的话,可以分为两类: 一为只能自己访问(应用内储存),二为跨应用访问(文件,Redis 等内存类数据库)

    感谢你的纠正。
    如果是因为我文章描述有误导致你理解出错,我表示十分抱歉
    hxsf
        10
    hxsf  
       2018-02-23 23:04:52 +08:00
    @Kilerd #9 可能我对 cookie & session 的描述不太清楚。

    2. axios 在浏览器中使用会使用 xhr 来进行请求(在 node 环境中会使用 node 的 http 库),xhr (不管你用 jq 还是啥,这些库发起的异步请求最后都是采用 浏览器的 xhr 或 fetch 接口来进行的。)(包括 fetch 也是)会根据 同源策略来自动附加同域的 cookies,对于跨域请求,则不会带 cookie,需要前端显式设置传递 cookies 并且 后端也显式允许传递 cookies 才会传递 cookies。

    3. 这可能是每个人对 cookie & session 界定的不同而导致的。
    session 是个概念。由于 HTTP 协议是无状态的,但很多情况是需要状态的,也就是 会话管理( session )。
    session 的实现方案有很多种(比如 url 里带唯一标识)。一开始大家都各搞各的,93 年网景发明了 cookie 也就是 浏览器端的状态管理机制( rfc-2109 也定义了 cookie )
    可以说 cookie 是 session (会话管理) 的一种客户端实现。
    Kilerd
        11
    Kilerd  
    OP
       2018-02-23 23:28:53 +08:00
    @hxsf 那实际上 2 上面我的理解也是这样。

    如果是同域就会把 cookies 带上,不同域或者出现非普通访问的时候就需要显式传递 cookies

    可能是我在写文章的时候,一脑子都想到了「前后端分离」的情况去了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2884 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:13 · PVG 23:13 · LAX 07:13 · JFK 10:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.