【发布时间】:2017-05-21 03:42:39
【问题描述】:
自定义应用程序特定的、与安全相关的 HTTP 标头是否违反了关注点分离,这是否被认为是一种不好的做法?我意识到使用自定义标头来控制服务会将客户端与服务实现紧密耦合。或者在这种情况下,控制安全框架的行为。我计划使用自定义标头的上下文如下:
我们正在使用基于令牌的身份验证,其中令牌具有固定的生命周期,并且每次经过身份验证的客户端调用 Web API 时都会发出新令牌。 SPA 客户端可以在两种情况下使用 AJAX 调用服务器
- 用户操作(导航和提交)
- 自动刷新(当前视图以固定间隔重新获取数据)
现在,如果用户让页面保持打开状态,则会话永不过期,因为每次自动提取都会生成新令牌。 不知何故,我们需要在服务器端区分用户操作和自动刷新,并仅为用户操作颁发新令牌。
我意识到基于 Websocket 的刷新将是一种解决方案,但由于具体问题,我们决定坚持使用定时 AJAX 调用。另一种解决方案是将令牌刷新作为单独的端点提供,但这从客户端的角度来看会违反 DRY 原则,并且使用 Spring Security 进行设置会更加麻烦。
唯一剩下的选择是将用户/自动信息嵌入到请求本身中,使用标头在这里似乎是一个可行的选择。某些标头的存在会阻止令牌刷新。只需几行代码即可轻松实现。
我只担心,如果这将客户端与服务实现过度耦合。从技术上讲,它不是将客户端与服务耦合,而是将前面的安全过滤器耦合,从而在用户界面中泄露安全问题。理想情况下,安全性内容应该对用户界面透明,因此可以在不了解任何安全性的情况下对新客户端进行编码(尤其是在使用 cookie 时)。
另一方面,这种解决方案不是破坏性的或变异的。这是一个可选功能。通过客户端使用它,安全性得到了增强,但在任何一种情况下都不会降低(从服务器的角度来看,实际上是这样)。现在的问题是,使用可选标头来增强安全性违反了哪些原则,在这种情况下它是一个有效的解决方案吗?
在我的选择中,应该透明地最大化安全性,但我不知道在这种情况下如何不泄露客户端的安全问题。
【问题讨论】:
标签: ajax rest security authentication design-patterns