Angular 应用程序中的 API 令牌安全

Posted

技术标签:

【中文标题】Angular 应用程序中的 API 令牌安全【英文标题】:API Token Safety in Angular application 【发布时间】:2013-11-03 17:46:34 【问题描述】:

我正在构建一个带有 API 后端的 Angular 应用程序。综合一些建议,我构建了带有令牌身份验证风格的 API。流程大致如下:

    使用凭据发布到登录端点 验证凭据和授权,然后生成新令牌 将令牌返回给客户端 客户端通过 HTTP Basic 使用令牌访问 API 资源

这一切都很好。基于此令牌创建会话时会出现问题。我不认为我应该简单地将客户端上的令牌保存在 cookie 中,但我确实需要一个会话来在页面刷新等之间持续存在。我的 Angular 应用程序是无状态的,并且完全通过 API 调用填充。

我正在寻找有关在客户端上保留此令牌的建议。我觉得将令牌保存在 cookie 中是有危险的,因为 cookie 可能会被盗并仅用于作为其他人进行身份验证,但也许这是不正确的。

提前感谢您的帮助!

【问题讨论】:

这可能会帮助你***.com/q/20870386/2015318 【参考方案1】:

我识别用户的唯一已知方法是在客户端上使用一些令牌。 HTTP 是无状态的,无法知道哪个请求来自哪个用户(浏览器)。您无法通过他的 IP 地址识别用户(许多用户在路由器后面并共享连接)。您可以尝试浏览器指纹识别,它可以在某些浏览器上工作,但不能在所有浏览器上工作。

我建议使用 cookie 将这个令牌存储在客户端上。 它们会在每次请求时发送到服务器,您可以采取一些保护措施来防止它们被盗。

要保护此 cookie 免受中间人攻击,您需要使用通过 HTTPS 到服务器的加密连接。

在 cookie 上设置以下属性:

HTTPOnly: cookie 不能被 javascript 访问(XSS 保护)

安全:cookie 只会通过 https 发送

路径:cookie 将仅在指定路径上发送,例如/登录

我还会在 cookie 上定义一个过期日期,这样 cookie 在 2 天左右就会失效。

但你是对的。如果此令牌被盗,其他人可以作为该用户登录。

【讨论】:

【参考方案2】:

由于它是一个 Angular 应用程序,我假设所有经过身份验证的方法都只会提供给 ajax 请求(你可以告诉你的服务器只响应 ajax),在这种情况下,CORS 会帮助你。

完全安全的唯一方法是 HTTPS,但是这种方法可能比您想象的更安全。阅读 CORS 以获取更多信息,但本质上的想法是服务器将仅响应来自同一域提供的 html 页面的 ajax 请求。

通常会发送飞行前 OPTIONS 请求来验证这一点。浏览器在实际请求之前发送带有 Origin 标头(页面来源)的 OPTIONS 请求。如果源与接收它的服务器的域匹配,则允许后续请求。否则,违反同源政策,将被拒绝。

这可以防止有人嗅出令牌并从您的服务器未提供服务的页面发送带有令牌的请求(例如在黑客本地计算机上运行的东西)。

如果您进行信用卡交易或任何超级安全的事情,您应该使用 HTTPS。

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

【讨论】:

HTTPS 从一开始就计划好了。我很欣赏关于 CORS 的信息;我将实施,然后继续。谢谢!

以上是关于Angular 应用程序中的 API 令牌安全的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 应用程序中存储身份验证令牌

客户端应用 jwt 令牌解码和验证安全

Angular 中的不记名令牌

通过 Angular 4 将 JWT 令牌附加到 api 请求

JavaScript AJAX 调用中的安全 REST API 令牌

如何存储 Angular 前端使用的 OAuth1 令牌