web应用程序的身份验证
身份验证是大多数网站的基本要求。 但是,有许多机制可以实现身份验证,并且它们并不是很可互换的。 根据业务需求,开发人员需要为其应用程序选择最合适的身份验证方法。 除非人们很好地了解机制之间的差异,否则这可能不是一件容易的事。
在这篇简短的文章中,我想回顾一下实现身份验证的4种流行机制。 还要进行比较和考虑,以选择最合适的方法。
背景
在标准Java Web应用程序中,通常有两种元数据包含在请求,会话和身份验证中。 会话信息有助于使HTTP协议具有状态,而身份验证信息有助于识别用户。
通常,有一个标头包含身份验证信息,另一个标头包含会话信息,或者一个标头包含两者。 请求也可以仅具有两个之一。
首次将HTTP作为无状态协议引入时,正式的身份验证机制是基本访问身份验证。 使用此身份验证方法,每个请求都必须包含包含加密的用户名和密码的标头。 显然,基本身份验证仅适用于安全通道。
尽管如此,许多人还是会觉得基本身份验证太不安全了。 令人惊讶的是,基本身份验证要求客户端进行加密,而不是对密码进行哈希处理。 更糟糕的是,每个请求中都包含加密的密码。 因此,如果黑客设法拦截单个请求,则显示用户密码。
为了加强认证机制,引入了摘要访问认证。 使用新的身份验证方法,客户端将发送用户名,密码,领域和服务器随机数的组合的哈希值。 当领域是固定的时,随机数可以由服务器随机生成。 摘要身份验证的后续修改允许客户端也添加其随机数。 请注意,摘要身份验证在请求中发送用户名,随机数和领域的纯值。 这是一个例子
授权: 摘要用户名=“ some_user”,领域=“ Some Realm”,随机数=“ MTQyNjE1MDE5Njc0MjoxZjdkYjIzZjI0YjZjNDNDExMzU2OTk3MWIyNWQzYmYwNg ==”,uri =” c = 3,c = 3,c = c3c3ec = c3c3ec = c3ec = c3ec = c3c3ec = c3c3e3c6e3c6e3c6e3c6e3c6e3c6e3c6e3c3e3c6e3c3e3c6e6c3e3c6e6c3e3c6e3c6e3c6e3c6e3c6e1c3c6e1c3f1c6f3c6f1c1f1c6f3c6f6c6f6c6f6c6c6c6c6c6c6c66要52f6c5c6c6c6c6c6c5中中中中中=“ c61b667053c03c31”
在以上请求中,响应值是用户名,密码,领域,服务器随机数和客户端随机数的哈希值组合。 服务器计算自己的响应,如果响应匹配,则对用户进行身份验证。
摘要式身份验证几乎不可能通过拦截请求来弄清密码,并且还有助于防止重放攻击。 为此,应定期更改服务器随机数。 因此,在服务器随机数过期后重新发送请求将失败。
大多数读者可能会注意到这两种方法不再流行。 浏览器支持基于HTTP的身份验证机制,可能无法为用户提供漂亮的登录表单。 更糟糕的是,除非用户关闭浏览器或选项卡,否则它不提供注销的简便方法。 因此,基于会话的登录是当今首选的身份验证机制。 基本身份验证和摘要身份验证仍在使用,但主要用于不需要维护会话的B2B通信。
当HTTP为有状态时,基于会话的登录适用。 为此,在每个请求中都嵌入了一个会话cookie(通常将其命名为JSESSIONID)。 服务器将为其创建的每个会话创建一个会话存储。 当请求到达时,服务器将尝试在用户会话中查找用户配置文件。 如果用户配置文件不可用,则会向用户显示一个登录表单。 认证成功后,服务器会将用户配置文件存储到会话存储中。
此方法效果很好,但是如果将Web应用程序部署在群集环境中,则需要粘性负载平衡器。 否则,如果会话是由其他服务器生成的,则服务器将无法识别该会话。
对于云应用程序,最好使用包含用户信息的cookie构建客户端会话。 此会话cookie用签名保护。 为了避免频繁读取数据库,我们可以使用公共密钥来签名所有会话,而不是使用密码。
比较方式
了解每种机制之后,让我们比较一下:
特征 | 基本认证 | 摘要式身份验证 | 服务器端会话 | 客户端会话 |
支持会议 | 没有 | 没有 | 是 | 是 |
登出 | 关闭浏览器 | 关闭浏览器 | 杀死会议 | 杀死会议 |
支持集群 | 是 | 是 | 需要粘性LB | 是 |
防止重播攻击 | 没有 | 是 | 可选(会话超时) | 最佳(在会话签名中包括时间戳) |
客户计算 | 贱 | 贱 | 零 | 零 |
服务器计算 | 贱 | 贱 | 零 | 贱 |
客户端存储 | 用户名密码 | 用户名密码 | 会话cookie | 会话cookie |
服务器存储 | 零 | 零 | 会话存储 | 零 |
握手 | 不需要 | 至少2个要求 | 至少2个要求 | 至少2个要求 |
网络开销 | 短头 | 长头 | 短头 | 长头 |
结论
您可以看到上面的比较,然后自己做出选择。 对我而言,基本身份验证和摘要式身份验证似乎是构建B2B身份验证的更好选择。 但是,它们不太适合面向客户的应用程序。
在基本身份验证和摘要身份验证之间进行选择仅取决于您的频道的安全性。 在大多数情况下,使用摘要身份验证来保护我们的应用程序是值得的,因为网络,握手和计算开销不是很多。
对于面向客户的UI,我希望客户端会话胜于服务器端会话,因为它们可以更好地扩展。 您总是可以投入新的服务器来分担工作量。 对于服务器端会话,除非您可以克隆会话存储,否则其他服务器只能服务新会话,而不能服务现有会话。
客户端会话的问题是在会话cookie中公开了用户信息。 因此,您只能在会话中放入原始值,而不能放入机密值。 如果您可以承受该限制,那么客户端会话无疑是更好的选择。
翻译自: https://www.javacodegeeks.com/2015/03/authentication-mechanisms-for-web-applications.html
web应用程序的身份验证