/ 什么是认证和授权?如何设计一个权限认证框架? /
认证和授权是安全验证中的两个重要概念。认证是确认身份的过程,用于建立双方之间的信任关系。只有在认证成功的情况下,双方才可以进行后续的授权操作。授权则是在认证的基础上,确定用户或系统对资源的访问权限。
在设计一个权限认证框架时,可以考虑以下原则:资源、角色和主体。
资源:定义系统中的各种功能、数据或服务,例如页面、API 接口等。
角色:角色是对用户或系统进行逻辑分组的一种方式。一个主体(用户或系统)可以拥有一个或多个角色。每个角色可以被赋予不同的权限,即可以访问哪些资源。
主体:主体是指进行认证和授权的实体,可以是用户、系统或第三方应用程序。
在开发中,可以采用前端页面按钮权限控制和后台统一权限控制的方式来确保安全访问。前端页面按钮权限控制可以根据用户角色或权限配置显示或隐藏页面上的按钮,以限制用户的操作。后台统一权限控制可以通过中间件或拦截器来验证用户的认证信息和权限,确保用户只能访问其被授权的资源。
/ Cookie 和 Session 有什么区别?如果没有 Cookie,Session 还能进行身份验证吗? /
Cookie 和 Session 是用于进行身份验证和状态管理的两种机制,在实现上有一些区别。
Cookie 是由服务器在响应中生成并存储在客户端的一种小型文本文件。它可以包含一些状态信息,例如用户身份标识、过期时间等。每次客户端发送请求时,会自动携带相应的 Cookie 数据,以便服务器进行身份验证和状态管理。
Session 是在服务器端创建和管理的一种数据结构,用于存储每个用户的会话信息。服务器在接收到客户端请求后,为每个会话生成一个唯一的 session id,并将其发送给客户端保存。客户端在后续的请求中会携带该 session id,服务器根据 id 查找对应的会话信息,进行身份验证和状态管理。
由于 Session 的实现依赖于 Cookie 来传递 session id,如果没有 Cookie,无法将会话信息与请求进行关联,从而无法进行有效的身份验证。
在分布式部署的情况下,可以采取一些解决方案来处理 Session 的信息保存问题。常见的解决方案包括:
调整负载均衡策略:通过配置负载均衡器,将特定的客户端请求固定发送到某个服务器上,以确保会话信息的一致性。但是当该服务器宕机或故障时,会话信息将丢失。
Session 复制:在集群中的服务器之间复制会话信息,以保持一致性。但是在高并发环境下,如果复制过程未完成,就接收到了新的请求,会影响性能和一致性。
Session 共享:使用第三方工具(如 Redis)将会话信息存储在共享的缓存中,每个服务器都可以访问和更新该缓存,以实现会话信息在集群中的共享和同步。
/ 什么是 CSRF 攻击?如何防止? /
CSRF(Cross-Site Request Forgery)攻击是一种利用受害者在已经认证的状态下执行非意愿操作的攻击方式。攻击者通过诱使受害者访问恶意网站或点击恶意链接,来执行未经授权的操作,例如修改密码、进行转账等,简单来说就是,由于 cookie 是在浏览器共享的,所以一旦设置了 cookie,那么当你打开另一个 tab 页的时候,也会携带过去,那么其他站点就可以使用 cookie 进行攻击,具体如下:
比如:当你在浏览器中打开银行 A 的网页并成功登录后,你想要进行转账操作。你使用 GET 请求访问了一个 URL:https://www.banka.com/transfer?account=111&amount=1000。这个请求包含了转账所需的账户和金额信息 https://www.banka.com/transfer?account=111&amount=1000。这个请求包含了转账所需的账户和金额信息 。
然而,同时你在另一个浏览器标签中打开了一个恶意网页,这个网页中包含了一个类似的 URL:https://www.banka.com/transfer?account=111&amount=10000。由于你在之前登录银行 A 的网页时,浏览器会自动发送之前的 Cookie 信息,恶意网页中的请求也会带有相同的 Cookie。
https://www.banka.com/transfer?account=111&amount=10000
由于你在之前登录银行 A 的网页时,浏览器会自动发送之前的 Cookie 信息,恶意网页中的请求也会带有相同的 Cookie 。
当你点击恶意网页中的链接时,银行 A 的服务器会收到这个请求,并且由于存在有效的 Cookie,会误认为这是一个合法的请求,从而执行了转账操作,将 10000 的金额从你的账户中转出。
为了防止 CSRF 攻击,可以采取以下措施:
验证请求来源:在服务器端对请求进行验证,确保请求来自合法的来源。可以通过检查请求头中的 Referer 字段或使用自定义的 Token 进行验证。
使用 CSRF 令牌(Token):在每个表单或敏感操作的请求中,包含一个随机生成的 CSRF 令牌。服务器在接收到请求时,验证令牌的有效性,确保请求是合法的。
限制敏感操作的权限:确保只有授权的用户才能进行敏感操作。这可以通过身份验证和授权机制来实现。
使用验证码:在某些敏感操作中,要求用户输入验证码,以提高安全性。验证码可以有效防止自动化攻击。
设置 Cookie 属性:将 Cookie 设置为 httponly 属性,防止 JavaScript 脚本获取和修改 Cookie 的值,减少攻击者的可能性。
定期更新令牌:为了增加攻击者破解令牌的难度,可以定期更新令牌,使其失效。
/ 总结 /
总的来说,认证和授权是构建安全系统的重要组成部分。通过合理设计权限认证框架,我们可以确保只有合法用户能够访问和执行相应的操作。在处理用户身份认证时,Cookie 和 Session 是常用的机制,但在分布式部署时需要注意 Session 的保存和共享问题。此外,为了防止 CSRF 攻击,我们可以采取一些措施,如使用 CSRF 令牌和验证请求来源。
原文始发于微信公众号(灵墨AI探索室):(上)深入探讨安全验证:OAuth2.0、Cookie与Session、JWT令牌、SSO与开放授权平台设计
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/208636.html