繁体   English   中英

自定义安全HTTP标头是否违反关注点分离

[英]Does custom security HTTP headers violate separation of concerns

自定义应用程序特定的,与安全性相关的HTTP标头是否违反关注点分离,是否被认为是不好的做法? 我意识到使用自定义标头控制服务将使客户端与服务实现 紧密耦合 或者在这种情况下,要控制安全框架的行为。 我计划使用自定义标头的上下文如下:

我们使用的是基于令牌的身份验证,其中令牌具有固定的生存期,并且每次经过身份验证的客户端调用Web API都会发出新的令牌。 SPA客户端可以在两种情况下使用AJAX调用服务器

  • 用户操作(导航和提交)
  • 自动刷新(当前视图以固定间隔重新获取数据)

现在,如果用户使页面保持打开状态,则会话将永不过期,因为将为每个自动提取生成新令牌。 某种程度上,我们需要将用户操作与服务器端的自动刷新区分开来,并仅针对用户操作发出新令牌

我意识到基于Websocket的刷新将是一种解决方案,但是由于特定的原因,我们决定坚持使用定时AJAX调用。 另一个解决方案是提供令牌刷新作为单独的端点,但是从客户端的角度来看这将违反DRY原则,并且使用Spring Security进行设置会更加麻烦。

剩下的唯一选择是将用户/自动信息嵌入请求本身,在这里使用标头似乎是一个可行的选择。 某些标头的存在将阻止令牌刷新。 只需几行代码即可轻松实现。

我只担心,如果这会使客户端与服务实现之间的耦合过多。 从技术上讲,它不将客户端与服务耦合,而是将前面的安全过滤器耦合,从而泄漏用户界面中的安全问题。 理想情况下,安全性对用户界面应该是透明的,因此可以在不了解任何安全性的情况下对新客户端进行编码(尤其是在使用cookie时)。

另一方面,此解决方案不是破坏性的或突变的。 这是一项可选功能。 通过客户端利用它,安全性得到了增强,但是在任何一种情况下都不会降低安全性(从服务器的角度看,就是这样)。 现在的问题是,违反了使用可选标头来增强安全性的原则,这在这种情况下是否有效?

在我的选择中,应该透明地最大化安全性,但是在这种情况下,我看不出如何在客户端中不泄漏安全性问题。

听起来您好像在这里使用自己的自定义自定义令牌身份验证解决方案。 这不是一个好主意。

我将花一点时间解释为什么您不想做您打算提出的事情,然后再说什么是更好的选择。

首先-您要在此处解决的问题是,您不希望用户在打开标签页后永远保持登录状态。 您需要解决此问题的原因是因为现在,您正在根据用户的“每个请求”分配一个新的访问令牌。

解决上述问题的正确方法是使用两种令牌。

具有很短寿命(例如:1小时)的访问令牌和具有更长寿命(例如:24小时)的刷新令牌。

应该工作的方式是:

  • 当用户首次对您的服务进行身份验证时,将生成Access和Refresh令牌及其相应的超时。
  • 这些令牌都设置在客户端JS无法访问的HTTP cookie中。
  • 从现在开始,每次用户的浏览器向您的服务发出请求时,您都会从Cookie中解析出访问令牌,检查其是否有效,然后允许该请求。
  • 如果访问令牌不再有效(如果它已过期),则将从cookie中解析出刷新令牌,并查看其是否有效。
  • 如果刷新令牌有效,则将生成一个具有1小时寿命的NEW Access令牌,并使用新的on覆盖旧的Access令牌cookie。
  • 如果刷新令牌无效,则只需将301重定向返回到应用程序的登录页面,从而迫使用户再次手动进行重新认证。

这种流程有很多好处:

  • 最大会话长度是技术性的(刷新令牌的持续时间+访问令牌的持续时间)-aka:在此示例中为25小时。
  • 访问令牌的寿命很短,这意味着如果令牌遭到某种程度的破坏,攻击者就不能长时间使用它来冒充用户。

上面的流程的好处是,它是一个Web授权标准: OAuth2

OAuth2密码授予流程完全符合您的描述。 它生成两种类型的令牌,处理“刷新”令牌,以安全,符合标准的方式从头到尾处理整个事情。

我强烈建议您做的是在服务器和客户端上都实现OAuth2库,它将为您解决这些需求。

现在-关于令牌,当今大多数OAuth2实现都会将令牌生成为JSON Web令牌 这些是经过加密签名的令牌,可提供许多安全优势。

无论如何:我希望这会有所帮助! 我用Python,Node和Go编写了几种流行的身份验证库-因此,这来自于我在过去几年中使用这些协议的直接经验。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM