我在这里有一个两部分的问题。
我有一个访问特权 REST 端点的 javascript webapp。我想防止 CSRF。
目前,我构建了一个登录系统,它返回一个包含加密有效负载(加密然后 MAC)的登录 cookie。我有理由确信 cookie 的内容不会在我不知情的情况下被篡改或伪造。
我知道使用所说的 cookie 来保护我的端点容易受到 CSRF 的攻击,因为 cookie 是由浏览器随任何请求自动提交的。我还认为不鼓励使用双重提交 Cookie 模式,因为它需要将 cookie HTTPOnly 值设置为 False,这会增加某些攻击的风险。
我想做的是将 auth cookie(用于在中期保持登录)设置为 HTTPOnly 和 Secure。然后,我希望 javascript 客户端向令牌端点发出 XHR GET 请求,在该端点可以验证 cookie,并且可以直接发回短期令牌(其中包含指向我存储在数据库中的信息的句柄)到客户端,没有用户代理重定向。然后,javascript 客户端将使用短期令牌来授权对我的 REST 端点的调用。
我的第一个问题是,这个流程有什么明显的缺陷吗?这似乎是对 REST 同步器令牌模式的合理改编,但我想知道是否存在严重缺陷,或者该过程是否有其他最佳实践。
我已经考虑实施 OAuth 2.0 隐式授予流程,但我希望存在 auth cookie,以便我可以在适当的时间内保持登录。
第二个问题是:如果我设置 withCredentials=True,浏览器会使用我的 XHR 将 HTTPOnly cookie 提交到令牌端点吗?我知道 HTTPOnly 限制了 javascript 读取 cookie 的能力,但是 cookie 标记是否会在请求中对客户端不可见?
我已经搜索了谷歌的答案,而我的 google-fu 让我失望了。我能找到的只有大量关于阅读 HTTPOnly cookie 但不提交它们的文章。
提前感谢您的任何帮助或建议!