我认为以上所有答案都是错误的。@Andy 可能回答了你的问题,尽管太含糊了。问题在于 (a) 您假设您的用户是威胁媒介(利用 cookie 获得未经授权的访问) (b) 您希望使用 cookie 作为身份验证机制的一部分。碰巧的是,您实际上想要实现的是一种零信任安全,这种模型表明在任何情况下都不应信任任何用户(起初这很难理解)。
本质上,这意味着您可以使用 cookie,但这些应该只是会话 cookie。英国学术机构的 Shibbeloth 和其他类似设计确实使用了会话 cookie、第三方身份验证(在该机构)和数据库主导的会话身份验证(与其他两者相比)的组合。事实上,它通常也会检查机构的用户权限(即,如果您正在学习计算机科学,则不需要医学图书馆等)。
因此,使用持久性 cookie 是您的问题,这绝对是禁忌。您似乎已经了解使用持久性 cookie 的风险,即它可能被盗(通常以明文形式)。因此,在最坏的情况下使用非持久会话 cookie。
在我看来,如果您要使用这种身份验证方法,您应该做的是定期撤销 cookie 并要求用户再次登录。正如我所解释的,Shibbeloth 在设计上是多因素的,因为它会将您的证书与您的大学持有的证书进行比较。更好的设计不仅会比较用户信息,而且需要多个凭证(例如,短信、电子邮件或网上银行中的秘密答案)。
实际上,大多数基于 Web 的应用程序都可以从无状态中受益匪浅(取决于应用程序和您的用户/系统要求)。因此,您几乎可以完全通过使用会话 cookie 直到该浏览器窗口关闭/时间过去或使用加密的客户端用户存储(更好的解决方案)。
在其他用户所说的其他缓解措施中,例如指纹浏览器和监控使用模式,您可以采用许多策略。您还可以使用 IP 白名单、反 DDoS、定期凭证翻转等。这些是互补的,但不是自己的解决方案。
您绝对不能做的是,为了改善用户体验而降低安全性和软件缺陷的优先级(顺便说一句,它们是同一回事)。如果你这样做,有一天你可能要为一场数据保护灾难负责(并可能入狱和/或损失很多钱)。
要完全实现您正在寻找的内容,请使用不需要安装的 Web 应用程序(可能基于 javascript)。应该对该应用程序进行编程以完全实现您的 API 并为用户完成所有繁重的工作。理想情况下,它应该对该 API 执行基于角色的访问控制 (RBAC)(因此确定您提到的不同用户组)。显然,RBAC 需要在服务器端实现。没有理由您的 API 不能直接提供或链接到此并存储直接发布的令牌,或通过其他渠道(例如基于文本消息的令牌 w)。
我希望这能给你一些关于你的设计的思考。