知识卡片
前端持有令牌几乎不可能被安全保护
内容
OAuth2 客户端分公开客户端(存不住秘密,比如手机 App、单页应用)和机密客户端(能安全存秘密,通常是后端服务)两类,机密客户端在[[OIDC授权码流程的中间步骤]]里向授权服务器换令牌时还要额外验证自己的身份(共享密钥),这是公开客户端做不到的一层保护。判断该让谁当客户端的经验法则:移动/桌面原生应用自己就是公开客户端;但网页前端(SPA)即便看起来是独立运行的应用,也不该自己当客户端去持有令牌——不管把令牌藏在 cookie、localStorage 还是 sessionStorage 里,从安全角度讲几乎不可能真正保护好浏览器里的令牌,业界公认的最佳实践是让一个后端服务(backend-for-frontend)代替前端去完成整个认证流程、持有令牌,前端和这个后端之间只用一枚会话 cookie 打交道,就像传统单体应用的登录方式一样。发散:这条最佳实践本质是把”谁最有能力保护敏感数据”这个问题的答案,凌驾在”架构上谁更方便持有数据”之上——前端在技术上确实可以持有令牌,但浏览器天生是个不安全的执行环境,”能做”和”该做”在这里是两回事。
参考来源
《Cloud Native Spring in Action》第11章《Security: Authentication and SPA》