浏览器身份验证

最后更新: 2022-07-12 14:43:24 +0800 +0800
原文以英文撰写。您正在阅读AI翻译版本。

浏览器身份验证将应用程序请求分配给用户或工作负载身份。应用程序必须定义凭据的存放位置、 哪些请求携带凭据、浏览器如何限制这些凭据,以及服务器如何使其失效。

对于具有同站点后端的浏览器应用程序,Cookie 中的不透明会话标识符可以使凭据不暴露给 JavaScript。将会话状态存储在服务器端,在身份验证后以及权限变更后轮换标识符,并在注销 或一段时间不活动后使其过期。

设置 Secure、HttpOnly 和适当的 SameSite 值。Secure 要求使用 HTTPS,HttpOnly 阻止 JavaScript 访问,SameSite 则降低跨站请求伪造的暴露风险。SameSite 不能替代 CSRF 防御:会改变状态的 Cookie 身份验证端点应验证 CSRF 令牌,或要求使用应用程序明确 信任的源。

OAuth 2.0 和 OpenID Connect #

OAuth 2.0 将授权委托给授权服务器;它本身并不规范用户身份验证。OpenID Connect 增加了 身份层和 ID 令牌。基于浏览器的公共客户端应使用带 PKCE 的 Authorization Code,并验证 state、使用 OpenID Connect 时的 nonce、精确的重定向 URI、issuer、audience、expiry 和 signature。

不要将访问令牌放入可能进入日志、引用来源和浏览器历史记录的 URL 查询字符串或片段中。 Backend-for-Frontend 可以将令牌保留在服务器端,并向浏览器公开应用程序会话 Cookie。

SAML #

SAML 在身份提供商和服务提供商之间交换带签名的 XML 断言。应根据已配置的元数据验证断言 签名,并验证 issuer、audience、recipient、时间条件以及请求关联关系。XML 签名验证必须 使用受维护的库和经过强化的解析器;手写 XML 或签名处理是不安全的。

Bearer 令牌 #

JWT 是一种令牌格式,而不是会话协议。资源服务器必须验证签名或获取可信的内省结果,然后 验证 issuer、audience、expiry、not-before 时间以及任何授权声明。将未过期的 Bearer 令牌 视为凭据:使用较短的访问令牌有效期、基于范围的授权、密钥轮换,以及符合应用程序风险 状况的撤销设计。

未经验证,不要使用令牌内容作出授权决策。加密令牌并不会消除验证声明的必要性。

评论

在 GitHub 上阅读或评论(发表评论需要登录)