【问题标题】:Setting up jwt or oauth in web application在 Web 应用程序中设置 jwt 或 oauth
【发布时间】:2017-07-27 22:56:43
【问题描述】:

我正在使用 angular 4 构建一个新的 spa 应用程序,并且我已经开始寻找不同的选项来实现安全性。随着我深入研究,我发现每个机制都非常容易受到基本攻击。我想知道在不需要深入了解安全领域背景知识的情况下,在小型 Web 应用程序中实现安全性的最有价值的方法是什么。这是我的想法和问题:

  1. 使用会话,使用简单的 CSRF 可以很容易地窃取 cookie。
  2. 使用基于令牌的方法,我发现几乎没有选择和缺点。

    • 创建一个令牌并将过期时间保存在数据库中,对服务器的每个请求,服务器都会增加 X 时间的过期时间。 这种解决方案非常危险。如果恶意用户窃取了令牌,他可以很容易地让它永远活着。
    • OAuth2 - 使用带有 access_token 的 refresh_token。这是一个很好的服务器协议,可以将 refresh_token 保存在服务器端。问题是 access_token 和 refresh_token 都将保存在客户端的同一个地方。窃取 refresh_token 很容易,就像使用简单的 XSS 使用 access_token 一样。
    • 未过期的令牌 - 用户通过身份验证后,他将收到一个过期 X 分钟的令牌。到期后,用户将被导航到登录页面。从产品的角度来看,这很糟糕,但在我的非专业意见中,这是最容易实施和最安全的。
  3. 存储 - 在哪里保存令牌/sessionId?

    • 本地存储 - 使用简单的 xss 或有权访问计算机的人很容易窃取。
    • 会话存储 - 与上述相同,但生存时间更短。
    • cookie - 很容易被简单的 CSRF 或简单的 xss 窃取
    • cookie (Http-Only) - 不确定 CSRF 但仅在某些浏览器中阻止 javascript 访问(如果我理解正确的话)
  4. 我的建议(非常喜欢反馈) 我考虑在客户端使用某种对称加密。 当我从服务器获取令牌时,我将使用一些可访问的数据(如 browsertpye、操作等)对其进行加密......虽然加密算法将在客户端中,但 javascipt 被混淆了,这将增加一层黑客攻击的难度。

我们以低预算构建了一个 Web 应用程序,因此无法在这方面花费太多时间。有没有优雅的解决方案?

【问题讨论】:

标签: angular security xss csrf csrf-protection


【解决方案1】:

我们使用代币,它们很棒!你的恐惧与我的恐惧相同,但这里有几件事要记住。

  • 如果您在服务器上保存任何“状态”信息,那么使用令牌的意义就消失了。重点是简化和减少服务器上“身份验证/授权”系统的占用空间。令牌是答案,因为一旦服务器对其进行签名并发送它,服务器上就没有任何剩余,直到它必须验证传入请求。

  • 使用 HTTPS。这样,除非有人通过有效令牌获得对计算机的物理访问权,并且进一步知道他们在寻找什么以及如何提取它,否则有人重放令牌的可能性很低。这种特殊的恐惧是我们开发人员喜欢在合理概率范围之外吹出的一种恐惧。

  • 如果安全性如此重要,请让您的令牌在 24 小时后过期。不要担心重置它们的到期时间。大多数人并不关心重新登录系统,尤其是在间隔合理的情况下。

  • 您的令牌服务器应该内置某些安全杠杆。如果您怀疑已拥有多个令牌,则服务器应该能够重新启动,并在每次启动时生成它自己的令牌密码,这将使那里的任何令牌无效(如果你愿意的话,红色大按钮)。

  • 在令牌中保存尽可能少的信息,它不是移动存储。事实上,您的客户端甚至不应该能够解密令牌。

【讨论】:

    猜你喜欢
    • 2017-11-24
    • 2018-01-08
    • 2013-06-07
    • 1970-01-01
    • 2012-11-30
    • 2014-09-30
    • 2016-09-29
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多