我正在为 Dart 前端构建一个无状态身份验证系统,并发现构建一个实际上安全的无状态身份验证系统非常棘手。
堆栈如下: Dart 应用程序将 JSON POST 发送到 Spring MVC 后端,使用 Jackson 在 JSON 和 Java 对象之间来回转换。当 SSL 投入生产时,一切都将落后于 SSL。
场景 1:用户登录,我在 Java 端保持一个 session - 这不是无状态的,并且会在后端负载平衡时出现问题。
场景 2:点击登录按钮后,Dart 向身份验证 Controller 发送 POST,该 Controller 验证凭据并传回一个 token (可能是一堆串联在一起的 UUID)。 token 返回到前端 - 这个 token 与用户名相结合,然后必须与每个请求一起传递。 dart 应用程序现在需要将此 token 存储在某处,因为 Dart 应用程序编译为 JavaScript,cookie 似乎不是一种选择(JavaScript 无法访问 cookie?)。想到了 HTML5 localstorage,但根据我的阅读,如果存在任何形式的 XSS 漏洞,劫持该 token 非常容易(而且我猜测将 JavaScript 注入(inject)页面的浏览器插件和工具栏也可以访问此 token )。
场景 3:就像在场景 2 中一样,我从 Spring MVC 后端传回了一个 token ,但我没有将它存储在 HTML5 本地存储中,而是保存在一个 JavaScript 变量中,并在打开新窗口时将其传递。
同样的问题也适用于此,因为它位于 javascript 变量中,任何类型的 XSS 漏洞或浏览器插件都可以获取该 token 并劫持 session 。
所以对于无状态的“ session ”来说,HTML5 localstorage 是最方便的,但它并不安全。有没有办法保护它,或者是否有另一种方法可以让我在浏览器中进行无状态身份验证?
最佳答案
我在 Information Security 上得到了一个相当不错的答案,它建议使用带有 HttpOnly 和 Secure 标志的 cookie:
https://security.stackexchange.com/questions/84860/how-to-build-a-secure-stateless-authentication-system-for-a-client-side-javascri/84861#84861
我不得不切换到 servlet3 以允许设置 HttpOnly 标志:
Set http-only on cookies created in Spring MVC Controller
在 Dart 方面,我不得不从 BrowserClient 切换,因为它不允许跨域 cookie:
Dart BrowserClient POST not including my cookies
关于html - 如何为客户端 dart 应用程序构建安全的无状态身份验证系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29331222/