Angular 在web应用程序中设置jwt或oauth

Angular 在web应用程序中设置jwt或oauth,angular,security,xss,csrf,csrf-protection,Angular,Security,Xss,Csrf,Csrf Protection,我正在使用angular 4构建一个新的spa应用程序,我已经开始搜索实现安全性的不同选项。当我潜得更深时,我发现每一种机械都很容易受到基本攻击。我想知道在一个小型web应用程序中实现安全性的最有价值的方法是什么,而不需要深入了解安全领域的背景知识。以下是我的想法和问题: 使用会话,使用简单的CSRF很容易窃取cookie 使用基于令牌的方法,我发现几乎没有选择和缺点 创建一个令牌并将到期时间保存在数据库中,在每次请求服务器时,服务器将在X时间内增加到期时间。 这种解决办法非常危险。如果恶意用

我正在使用angular 4构建一个新的spa应用程序,我已经开始搜索实现安全性的不同选项。当我潜得更深时,我发现每一种机械都很容易受到基本攻击。我想知道在一个小型web应用程序中实现安全性的最有价值的方法是什么,而不需要深入了解安全领域的背景知识。以下是我的想法和问题:

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

    • 创建一个令牌并将到期时间保存在数据库中,在每次请求服务器时,服务器将在X时间内增加到期时间。 这种解决办法非常危险。如果恶意用户窃取令牌,他可以轻松地使其永远存活
    • OAuth2-将刷新令牌与访问令牌一起使用。这是一个很好的服务器协议,刷新令牌可以保存在服务器端。问题是访问令牌和刷新令牌将保存在客户端的同一位置。通过使用简单的XSS,可以很容易地窃取刷新令牌,就像访问令牌一样
    • 具有非消耗到期的令牌-用户将被授权后,他将收到一个到期时间为X分钟的令牌。过期后,用户将被导航到登录页面。从产品的角度来看,这很糟糕,但在我看来,这是最容易实现和最安全的,一点也不专业
  • 存储在何处保存令牌/sessionId

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


  • 我们用很低的预算构建一个web应用程序,并且不能在这方面花费太多的时间。有优雅的解决方案吗?

    我们使用代币,它们很棒!你的恐惧和我的恐惧一样,但这里有几件事要记住

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

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

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

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

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


    如何使用CSRF偷取饼干?请阅读并