angularjs - 使用 AngularJS 进行身份验证、使用 REST Api WS 进行 session 管理和安全问题

标签 angularjs rest authentication cookies angularjs-authentication

我开始使用 angularJS 开发一个网络应用程序,但我不确定一切是否都安全(客户端和服务器端)。 安全性基于单个登录页面,如果凭据检查正常,我的服务器会发回具有自定义时间有效性的唯一 token 。所有其他 REST api 都可以通过此 token 访问。 应用程序(客户端)浏览到我的入口点例如:https://www.example.com/home.html用户插入凭据并接收回唯一的 token 。这个唯一的 token 通过 AES 或其他安全技术存储在服务器数据库中,它不是以明文格式存储的。

从现在开始,我的 AngluarJS 应用程序将使用此 token 对所有公开的 REST Api 进行身份验证。

我正在考虑将 token 临时存储在自定义 http cookie 中;基本上,当服务器验证凭据时,它会发回一个新的 cookie Ex。

app-token : AIXOLQRYIlWTXOLQRYI3XOLQXOLQRYIRYIFD0T

cookie 具有 secureHTTP Only标志已设置。 Http协议(protocol)直接管理新的cookie并存储它。连续的请求将呈现带有新参数的cookie,而不需要使用javascript对其进行管理和存储;在每次请求时,服务器都会使 token 无效并生成一个新 token 并将其发送回客户端 --> 使用单个 token 防止重放攻击。

当客户端从任何 REST Api 收到 HTTP 状态 401 未经授权响应时, Angular Controller 会清除所有 cookie 并将用户重定向到登录页面。

我是否应该考虑其他方面?将 token 存储在新的 cookie 中还是本地存储中更好? 关于如何生成独特的强 token 有什么建议吗?

编辑(改进):

  • 我决定使用 HMAC-SHA256 作为 session token 生成器,有效期为 20 分钟。我生成一个随机 32 字节 GUID,附加一个时间戳并通过提供 40 字节 key 来计算 HASH-SHA256。由于 token 有效性非常低,因此几乎不可能获得冲突。
  • Cookie 将具有 domain and path属性以提高安全性。
  • 不允许多次登录。

最佳答案

如果您通过 https 与服务器通信,则不会遇到重放攻击的问题。

我的建议是利用服务器的安全技术。例如,JavaEE 具有开箱即用的登录机制、基于 Angular 色的声明性资源保护(您的 REST 端点)等。这些都通过一组 cookie 进行管理,您不必关心存储和存储到期。查看您的服务器/框架已经为您提供了什么。

如果您计划向更广泛的受众(并非专门针对您所服务的基于浏览器的 UI)或其他类型的客户端(例如移动应用程序)公开您的 API,请考虑采用 OAuth。

在我的脑海中,Angular 具有以下安全功能(当它们弹出时会添加更多功能):

CSRF/XSRF 攻击

Angular 支持 CSRF 的开箱即用机制保护。查看 $http docs 。需要服务器端支持。

内容安全政策

Angular 有一种表达式求值模式,它与 CSP 时强制执行的更严格的 JavaScript 运行时兼容。已启用。查看 ng-csp docs .

严格上下文转义

使用 Angular 的新 $sce 功能 (1.2+) 来强化 UI,防止 XSS 攻击等。虽然不太方便,但更安全。查看文档 here .

关于angularjs - 使用 AngularJS 进行身份验证、使用 REST Api WS 进行 session 管理和安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20870386/

相关文章:

javascript - 如何过滤 Angular ng-repeat 以使用日期范围?

javascript - 如何使用其他函数传递查询参数

ruby - Ruby 中的 REST 客户端示例

java - Spring-Security-OAuth2 中的 grant_type

javascript - 通过 JavaScript 形式登录 HTTP 客户端到 ElasticSearch (readonlyrest)

javascript - 在 AngularJS 中将带有行跳转的字符串转换为 li

javascript - 通过服务获取数据

java - 启动 HTTP 服务器时未找到 Jersey ResourceConfig

php - 如何为成员(member)登录网站创建 'Super Administrative'密码

django - 显示 auth_message 的