我为Dart前端构建了无状态身份验证系统,并发现构建一个实际上无法保证的无状态身份验证系统非常棘手。
堆栈如下:Dart应用程序使用Jackson在JSON和Java对象之间来回转换,向Spring MVC后端执行JSON POST。在投入生产时,一切都将落后于SSL。
场景1:用户登录,我在Java端保持会话 - 这不是无状态的,并且在负载平衡后端时会导致问题。
场景2:点击登录按钮后,Dart会向Authentication控制器执行POST,验证控制器验证凭据并传回一个令牌(可能是一堆连接在一起的UUID)。令牌返回到前端 - 这个令牌与用户名一起必须与每个请求一起传递。 dart应用程序现在需要在某处存储此令牌,因为Dart应用程序编译为JavaScript,cookie似乎不是一个选项(JavaScript无法访问cookie?)。我想到了HTML5本地存储,但是从我所读过的内容来看,如果有任何形式的XSS漏洞可用,很容易劫持该令牌(而且我猜测注入JavaScript的浏览器插件和工具栏进入页面也可以访问此令牌)。
场景3:就像在场景2中一样,我从Spring MVC后端传回一个令牌,但不是将其存储在HTML5 localstorage中,而是保留一个JavaScript变量并在打开一个新窗口时传递它。 同样的问题在这里适用,因为它在javascript变量中,任何类型的XSS漏洞或浏览器插件都可以抓住该令牌并劫持会话。
所以对于无状态"会话"来说,HTML5 localstorage是最方便的,但它并不安全。有没有办法保护它,还是有另一种方法可以让我在浏览器中进行无状态身份验证?
答案 0 :(得分:2)
我在信息安全方面得到了一个相当不错的答案,建议使用带有HttpOnly和安全标志的cookie:
我不得不切换到servlet3以允许设置HttpOnly标志:
Set http-only on cookies created in Spring MVC Controller
在Dart方面,我不得不从BrowserClient切换,因为它不允许跨域cookie:
答案 1 :(得分:1)
我想到这个问题,我只会在会话/本地存储中保存令牌。所有其他数据可以在一种用户后台控制器中,可以通过令牌加载所需的数据(如用户profil)。
没有ssl,劫持的想法很糟糕。您可以尝试使用包含(浏览器/操作系统/插件数据......)的哈希作为控件,但这将是伪的。我想你需要ssl。