如何建立一个安全的无状态的认证系统的客户端应用程序镖(How to build a secure s

2019-10-22 10:07发布

我建立一个无状态的认证系统为DART前端和发现,这是相当棘手打造一个无状态的认证系统,该系统实际上是安全的。

堆栈如下:省道应用程序中使用杰克逊来回JSON和Java对象之间的转换,做JSON POST到一个Spring MVC的后端。 一切都将在后面SSL时投产。

方案1:用户登录时,我保持一个会话在Java端 - 这不是无状态的,会造成问题,当负载平衡的后端。

方案2:在命中的登录按钮,POST被达特做验证控制器,其验证凭证和传递回令牌(它可以是一串串联在一起的UUID)。 令牌回来给前端 - 此令牌的用户名组合届时将有与每个请求一起传递。 DoubleClick应用程序现在需要在一些地方保存此令牌,因为DoubleClick应用程序编译成JavaScript,饼干似乎不是一个选项(JavaScript不能访问饼干?)。 HTML5的localStorage想到的,但是从我读过,这是很容易劫持该令牌,如果任何形式的XSS漏洞的可用(和我猜的浏览器插件和工具栏的JavaScript注入到页面也可以访问此令牌)。

方案3:就像在方案2​​中,我得到传回从Spring MVC后端令牌,但不是将其存储在HTML5本地存储,我保持在一个JavaScript变量,如果打开一个新的窗口,通过它。 同样的问题也适用于这里,因为它是一个JavaScript变量中,任何种类的XSS漏洞或浏览器插件可以捉住该令牌并劫持了会议。

因此,它似乎是一个无状态的“会话”,也就是HTML5 LocalStorage是最方便的,但它并不安全。 有没有一种办法,以确保它还是有另一种方式,让我无国籍身份验证的浏览器?

Answer 1:

我得到的信息安全一个相当不错的答案,建议使用cookie的HttpOnly和安全标志正在对它们设置:

https://security.stackexchange.com/questions/84860/how-to-build-a-secure-stateless-authentication-system-for-a-client-side-javascri/84861#84861

我不得不切换到servlet3允许设置的HttpOnly标志:

HTTP设置仅在Spring MVC的控制器创建的cookie

在省道边,我不得不从BrowserClient切换,因为它不允许跨域的cookie:

达特BrowserClient POST不包括我的饼干



Answer 2:

我想这个问题,我会只保存在会话/本地存储的令牌。 所有其他数据可以在一个类型的用户背景控制器,它可以由令牌(如用户PROFIL)负载所需的数据。

劫持认为这是不好不使用SSL。 你可以尝试像包括(在数据浏览器/操作系统/插件...)作为一种控制研究的哈希但这是假。 我认为你需要SSL。



文章来源: How to build a secure stateless authentication system for a client-side dart application