基于散列片段的安全性如何工作?

我正在学习OAuth 2.0,无法在隐式授权流程中获得保护访问令牌的方式。 规范中有一些论文和一些有争议的SO答案看起来相互矛盾。 有人可以清除它吗? 来自SO答案和规范的引用令我感到困惑:

  • (来自spec)用于将访问令牌传递给客户端的重定向URI。 访问令牌可能暴露给资源所有者或具有对资源所有者的用户代理的访问的其他应用程序。
  • (来自规范)访问令牌凭证(以及任何机密访问令牌属性)务必在传输和存储中保密,并且只能在授权服务器,访问令牌有效的资源服务器和客户端之间共享访问令牌被发布。 访问令牌凭证只能使用TLS传输。
  • (来自已接受和已提出的答案)在隐式流中,访问令牌作为散列片段传递,只有浏览器才知道散列片段。 浏览器会将散列片段直接传递到目标网页/客户端网页的重定向URI(散列片段不是HTTP请求的一部分),因此您必须使用Javascript读取散列片段。 哈希片段不能被中间服务器/路由器拦截(这很重要)。
  • 我的问题:

    P1表示通过重定向URI和P2传递给客户端的令牌表示传递通道必须是TLS-ed。 但是P3说散列片段没有发送到网络 。 访问令牌如果由于散列片段而未发送,它如何到达客户端? 无论如何,它必须由网络发出是不是? 或者使用重定向URI发送令牌会产生一些不带网络优惠的魔法?

    唯一可能的解释 - 在引擎盖下浏览器只发送网址的非哈希部分,并在加载新页面后,插入哈希片段并将其提供给JS。 如果我是对的,我仍然不明白为什么我们不简单地发送具有可靠,安全的HTTPS通道作为响应参数的令牌?


    OAuth提供程序使用HTTP响应重定向将访问权限发送回OAuth使用者:

    HTTP/1.1 302 Found
    Location: https://consumer.org/redirect_uri#access_token=1111-2222-3333-4444
    

    请注意访问令牌是如何通过网络发送的,作为OAuth提供程序的HTTP响应的一部分,除了使用者之外,还应该使用HTTPS。

    然后,您的浏览器将对消费者端点执行一个新的HTTP GET请求:

    GET /redirect_uri HTTP/1.1
    Host: consumer.org
    

    请注意访问令牌如何不通过网络发送给使用者。 consumer.org的服务器将不会收到此HTTP请求中的令牌。 相反,从https://consumer.org/redirect_uri返回的网页将包含能够并将从url片段读取访问令牌的JavaScript。

    因此,您需要信任您从consumer.org(通过使用HTTPS)收到的JavaScript代码,因为如果攻击者可以注入代码,它也可以间接获取访问令牌(并将其发送到任何地方)。

    来自消费者的HTTP响应示例:

    200 OK
    Content-Type: text/html
    
    <html><head><script> 
        alert(window.location.hash) 
    </script>
    </head><body></body></html>
    
    链接地址: http://www.djcxy.com/p/47985.html

    上一篇: How exactly hash fragment based security works?

    下一篇: On a high level, how does OAuth 2 work?