当前位置: 首页 > 科技观察

说说前后端分离和认证选项

时间:2023-03-21 01:33:08 科技观察

几年前,“前后端分离”在web开发领域很流行,现在逐渐成为一种事实上的标准。但究竟什么是前端分离呢?为什么要分开前后端?什么是前后端分离?为什么要分离前后端?前后端分离更多的是一种架构概念。在传统的Web架构中,比如经典的MVC,会分为数据层、逻辑层、视图层。这个视图层就是我们所说的前端,映射到代码层,也就是html、js、css等代码文件。数据层和逻辑层是比较后端的部分,比如我们的.java、.go、.py等文件。这些文件将在一个项目中,不会单独开发、测试和部署。在前后端分离的架构中,前后端是分离的,在不同的项目中。前端有专门的前端开发人员进行开发和测试,后端有后端开发人员进行开发和测试,他们通过API进行交互。前后端分离有几个好处:1/前后端人员解耦,让前后端交给更擅长的人,细化了工种,可以更专业。前端人员关心用户体验、UI设计、交互渲染;后端人员更关注业务逻辑、性能保证、安全等,在项目进度上,前后端可以并行开发,互不影响,加快了项目整体进度。2/解耦前后端代码。后端只需要提供API服务,不再与静态文件进行交互。后端可以使用更复杂的分布式和微服务架构,提供更好的性能和稳定性保障。同时,除了PC端,前端在移动端也可以使用同一套后端服务。看到这里,广泛使用前后端分离也就可以理解了。大家需要注意的是,并不是所有的项目都需要前后端分离。比如大型项目,开发人员很多,分工明确。在这种团队配置下,采用前后端分离的方式,可以提高工作效率,提高系统质量。但是,当团队规模较小,分工不明确时,采用前后端分离的架构只会增加开发成本和系统复杂度。前后端分离是一个很好的架构思路,但是要看具体的业务和人员情况,不要盲从。前后端分离常用的认证方式在前后端分离中,前后端的交互是通过API进行的,所以认证是必不可少的。前后端分离常用的认证方式有:Session-CookieToken认证OAuth(开放授权)Session-Cookie方式Session-Cookie方式是我们开发web应用时最常用的认证方式。它的认证过程一般如下:1/用户浏览器向服务器发起认证请求,将用户名和密码发送给服务器。2/服务器对用户名和密码进行认证,如果通过则创建会话对话,并在会话中保存用户信息。Session信息可以保存在服务器文件、共享外部存储、数据库等,供下次请求时查询和校验使用。3/服务器会把session的唯一ID返回给用户的浏览器,保存在cookie中。4/当用户请求其他页面时,浏览器会自动携带用户的cookie并发起接口请求。服务端收到请求后,会从cookie中解析出sessionID,根据sessionID查询登录和保存的session。如果存在,则表示该用户已登录并被允许。这种方式是MVC架构中最常用的认证方案,也可以用于前后端分离。几乎所有的Web框架都默认集成了Session-Cookie认证方式,并且对于Session-Cookie方式的安全性和稳定性都有成熟的解决方案。当前端代码使用后端Web框架作为Web容器驱动时,Session-Cookie方案可以作为首选认证方案。Token方式Token方式是一种常用的认证方式,适用于不同的系统交互和前后端架构。Token方式的认证过程如下:1/用户使用用户名和密码登录,将用户名和密码发送给服务器。2/服务器验证用户名和密码,如果它们正确,则颁发令牌并将其返回给用户。3/用户收到token后,存储起来,web服务一般是localStrage或者cookie。4/用户请求其他资源页面时,会携带token,一般放在header或parameter中发送给服务器。5/服务器收到token后,对token进行校验,判断用户的正确性。JWT(JSONWebToken)是最常用的token认证方式,已经成为token认证的标准事实。JWT方式将Token进行分段,这样可以保留少量的数据,同时也加入了签名校验,保证了token的安全性。网上关于JWT的资料很多,这里不再赘述。不明白的可以参考以下资料:JSONWebToken入门教程JWT官网OAuth方法OAuth(OpenAuthorization)是一种开放标准,允许用户授权第三方网站访问其存储在自己的用户信息服务器。我们常见的QQ、微信等第三方登录都是Auth认证方式。OAuth协议有两个版本,1.0和2.0。与1.0版本相比,2.0版本的整个授权验证过程更简单、更安全,也是目前最重要的用户认证授权方式。OAuth更像是一种授权机制。数据的拥有者告诉系统,他同意授权第三方应用程序进入系统并获取数据。系统因此生成一个短期访问令牌(token),用于代替密码供第三方应用程序使用。在一个纯粹的前后端分离系统中,OAuth并不是一种常用的方式,更多的是用在不同系统之间的授权交互中。对比和思考不常用的OAuth,这里比较一下前两种常用的认证方式JWTAuth和Session-CookieAuth,谁是前后端分离认证的最佳实践。从以下几个方向进行分析比较。可扩展性Session-Cookie是一种有状态的服务,它在服务器端保存会话信息。当服务器扩展时,需要考虑session共享的问题。这个问题已经有成熟的解决方案,可以使用session复制、共享、持久化等方式解决,大部分分布式web框架都有集成处理方案。JWT验证方式是无状态服务,服务端可以随意扩缩容。Session-Cookie方法是基于cookie的,即必须是浏览器或者支持cookie的浏览器封装的框架,不能在纯移动端使用。JWT则不同,它不依赖Cookie,只要能存到本地即可。安全性Web开发中两个常见的安全问题是XSS(跨站点脚本)和CRSF(跨站点请求伪造)。前者通过向用户认证网站注入脚本来执行恶意脚本代码。后者利用浏览器访问后台的机制自动携带cookies伪造跨站请求。XSS只要我们对注入端进行过滤和逃逸就可以解决,而CRSF是我们的重点。在Session-Cookie认证方式中,由于SessionID保存在Cookie中,容易引起CRSF攻击。大多数WEB框架中都有集成的解决方案,比如Django的csrftoken、Beego的xsrfToken等。使用Session-Cookie方案时,建议开启web框架的csrf功能。JWT认证,可以将Token存放在Cookie或者localstorage中。推荐有localstorage,这样可以完全避免CRSF攻击。另外JWT还有几个安全问题需要注意:1/JWT是明文编码JWT的编码是明文Base64的编码,可以被反编译。使用JWT传输信息时,不要放置重要敏感信息,最好使用https。2/JWT泄漏问题解决JWT泄漏问题是一个权衡的问题。一共有三种处理方式,从轻到重,根据你业务的重要程度,酌情选择:把JWT的过期时间设置的很短,就算泄露了也没关系。服务端设计JWT黑名单机制,将泄露的Token加入黑名单。保存发布的JWT。当JWT泄露后,直接作废。PerformanceSession-Cookie方案,因为后端服务保存的是session信息,在认证的时候需要查询,认证量大的时候非常耗资源。JWT可以将信息放入token中,只需要验证解码,使用签名来验证token,相对会提高效率。从以上三个方面,我们分析了Session-Cookie和JWT方式的优缺点,以及一些解决问题的方法。相信每个人都会有自己内心的选择。不管在什么商业场景下,谈技术都是耍流氓。不同的业务场景,不同的架构设计,适用的认证方式也不同。这是根据我自己的经验总结的。可以参考什么情况下应该使用哪种认证方式。Session-Cookie认证方案适用场景:项目只有web端;项目人员配置少,前后端开发都会涉及;项目前后端分离不完全,前端使用后端web框架作为服务容器启动;使用JWT认证方案情况:项目人员配备充足,分工明确;项目除了网页端外,还有移动端;临时授权要求;纯后端系统之间的交互。本文围绕前后端分离的话题,总结分享前后端分离时的认证方案。这些只是通用的解决方案。在具体的业务场景中,有很多非典型的扩展验证方案也很优秀。