当前位置: 首页 > 后端技术 > Node.js

简单的Node.js学习笔记(8)

时间:2023-04-03 11:48:24 Node.js

用于构建Web应用程序前后端的语言是JavaScript,具有跨HTTP通信的优点;不需要切换语言环境,一些知识不会因为语言环境的切换而丢失。会有一些额外的好处;数据(因为JSON)可以直接跨前后端使用;有些业务(比如模板渲染)可以自由选择前端或者后端,因为编程语言是一样的,所以切换成本低;1.基本功能对于一个web应用,在具体业务上,可能会有需求:请求方法判断;URL路径分析;URL查询字符串分析;饼干分析;基本认证表单数据分析任意格式文件上传处理;会话(session);1.1请求方法请求方法包括:GET;邮政;头;删除;放;连接;地址被解析成消息,路径和查询部分放在消息的第一行。基于路径进行业务处理最常见的应用是静态文件服务器,它根据路径在磁盘上搜索文件,然后响应给客户端。另一种常见的分发场景是根据路径选择控制器。默认路径是控制器和行为的组合,不需要配置额外的路由信息??。1.3查询字符串字符串将跟随路径并构成请求消息第一行的第二部分。在业务调用产生之前,中间件或框架会将查询字符串进行转换,挂载到对象上供业务使用。1.4Cookies简介Cookies的处理分为以下几个步骤:服务器向客户端发送cookies;服务器端的行为。主要针对以下选项:*路径;*ExpiresandMax-Age*HttpOnly*SecureCookie对性能的影响针对cookie设置过多造成带宽浪费的性能优化解决方案:如果在域名根节点设置cookie,则减小cookie的大小,几乎所有子路径下的请求都会带上这些cookie。静态组件使用不同的域名为不需要cookies的组件更改域名可以减少无效cookies的传输,突破浏览器下载线程的限制,但会增加域名转IP的DNS查询。减少DNS查询减少DNS查询和使用不同的域名似乎是一种冲突,但使用DNS缓存可以减轻这种副作用。1.5Session可以通过Cookie、浏览器和服务器来记录状态。然而,cookie并不完美。缺点是:尺寸偏大;前后端都可以修改cookies,数据容易被篡改和伪造。总之,cookie在保护敏感数据方面是无效的。为了解决cookie敏感数据的问题,Session应运而生。会话数据只保存在服务器端,不能被客户端修改。一定程度上保证了数据的安全性,不需要每次都在协议中传输数据。如何将各个客户端服务器的数据一一匹配:基于cookie实现用户与数据的映射;虽然不建议将所有数据都放在cookie中,但可以将密码放在cookie中。一旦密码被篡改,映射关系就会丢失,服务器上已有的数据将无法修改。session的有效期通常很短,一般设置为20分钟。如果20分钟内服务端和客户端没有交互,服务端就会删除数据。由于数据过期时间短,数据存储在服务器端,安全性比较高。密码是怎么产生的?服务端开启session后,会约定一个key值作为session的密码,这个值可以随意约定。服务器端一旦检查到用户请求的Cookie中没有携带这个值,就会为其生成一个值,这个值是独一无二的唯一值,并设置一个超时时间。该方案依赖于Cookie的实现。如果客户端禁止使用cookies,世界上大多数网站将无法登录等操作。通过查询字符串实现浏览器端和服务器端的数据对应;它的原理是检查请求的查询字符串,如果没有值,则先生成一个新的有值的URL。在HTTP请求头中使用ETag;Session与内存为了解决性能问题和Session数据不能跨进程共享的问题,一个常见的解决方案是将Session集中起来,将原本分散在多个进程中的数据转移到存储中的集中数据中。目前常用的工具有Redis、MEmcached等,通过这些高效的缓存,Node进程内部无需维护数据对象,垃圾回收和内存限制等问题也能轻松解决。使用第三方缓存来存储Session,在导致网络访问时会出现问题。从理论上讲,访问网络中的数据比访问本地磁盘中的数据要慢,涉及网络终端自身的握手、传输、磁盘I/O等。使用第三方缓存的原因:Node与缓存服务保持长期连接,而不是频繁的短连接。握手造成的延迟只影响初始化;缓存直接在内存中存储和访问数据;缓存服务通常与Node进程通信,在同一台机器或同一机房内比较,网速受影响较小;Session与SecuritySession安全主要是指如何让这个密码更加安全。一种方法是用私钥对密码进行加密签名,这使得伪造的成本更高。一种解决方案是使用客户端的一些唯一信息和密码作为原始值,然后进行签名,这样一旦攻击者不访问原始客户端,签名就会失败。这些唯一信息包括用户IP和用户代理(UserAgent)。XSS漏洞XSS的全称是跨站脚本(CrossSiteScripting),通常是网站开发人员决定哪些脚本可以在浏览器端执行。XSS形成的主要原因是用户的输入没有进行转义,而是直接执行。1.6缓存对于构建在HTTP之上的应用程序,其客户端不仅具有比普通桌面应用程序更轻便的升级和部署等特点,而且在跨平台、跨浏览器、跨设备方面具有独特的优势。传统客户端只需要在安装后的应用过程中传输数据,而Web应用还需要传输构成界面的组件(HTML、CSS、JavaScript)。为了提高性能,关于缓存的规则:在消息头添加Expires或者Cache-Control;配置电子标签;使Ajax可缓存;一般来说,POST、DELETE、PUT等行为请求操作一般不会做任何缓存,大部分缓存只适用于GET请求。简单的说,当本地没有文件时,浏览器会向服务器端请求内容,并将这部分内容放在本地的缓存目录中。第二次请求时,会检查本地文件,如果不能确定本地文件是否可以直接使用,就会发起请求。所谓条件请求,就是在普通的GET请求报文中附加一个If-Modified-Since字段。它会询问服务器是否有更新的版本,本地文件的最后修改时间。如果服务器没有更新的版本,它只是简单地响应一个304状态码,客户端使用本地版本。如果服务器端有新版本,则将新内容发送给客户端,客户端放弃本地版本。使用时间戳的条件请求的缺陷:文件的时间戳改变了,但内容不一定改变;时间戳只能精确到秒级,频繁更新的内容不会生效;HTTP1.1引入了ETag,利用时间戳缺陷解决了这个问题。ETag的全称是EntityTag,由服务器端生成,服务器端可以决定它的生成规则。如果哈希是从文件内容生成的,条件请求将不会因时间戳更改而浪费带宽。虽然条件请求在文件内容没有被修改的情况下可以节省带宽,但是还是会发起HTTP请求,这样客户端还是会花费一定的时间等待响应。最好的解决方案是让浏览器在服务器响应内容时显式缓存内存,甚至不发起条件请求。在响应中设置Expires或Cache-Control头,浏览器将根据更改后的值进行缓存。Expires是GMT格式的时间字符串。浏览器收到这个过期值后,本地只有缓存文件还存在,直到过期时间才会发起请求。但是没有Expires是浏览器和服务器的时间可能不一致,可能会导致文件提前过期,或者过期后文件没有被删除。Cache-Control可以避免浏览器和服务器时间不同步导致的不一致问题,只要按照类似倒计时的方式计算过期时间即可。Cache-Control的值还可以设置public、private、no-cache、no-store等选项,可以更精细地控制缓存。在浏览器中,如果Expires和Cache-Control同时存在并且同时被支持,max-age会覆盖Expires。清除缓存设置缓存可以达到节省带宽的目的,但是一旦设置了缓存,当服务端不小心更新了内容时,就无法通知客户端更新了。这就使得在使用缓存时需要设置版本号。幸运的是,浏览器会根据URL进行缓存。一般的更新机制是:每次发布,路径跟随web应用的版本号:http://love.bleaknight.top/?v=20200110每次发布,路径跟随文件内容的hash值:http://love.bleaknight.top/?hash=bleaknight1.7BasicauthenticationBasicauthentication是一种身份认证方式,允许在客户端和服务端进行请求时,实现用户名和密码。基本认证有太多缺点。虽然经过Base64加密后在网络中传输,但几乎是明文,非常危险。一般只在HTTPS的情况下使用。2、数据上传在业务中,需要接受的一些数据包括:表单提交、文件提交、JSON上传、XML上传等。2.1表单数据最常见的数据提交是通过web表单向服务器提交数据。2.2其他格式除了表单数据,常见的提交还有JSON和XML文件等,根据Content-Type中的值来判断,其中JSON类型的值为application/json,XML的值为application/xml。2.3附件上传除了常见的表单和特殊格式的内容提交外,还有一种独特的表单。特殊表单与普通表单的区别在于表单可以包含文件类型控件,表单属性enctype需要指定为multipart/form-data。2.4安全内存和CSRF相关的数据上传安全问题。内存仅限于解析表单、JSON和XML。采用的策略是先保存用户提交的所有数据,然后解析处理,最后传递给业务逻辑。当该策略存在潜在问题时,仅适用于数据量较小的提交请求。一旦数据量太大,内存就会被用完。这个问题的解决方法:限制上传内容的大小。一旦超过限制,停止接受数据并响应400状态码;通过流式分析,将数据流向磁盘,Node只保留文件路径等小数据;CSRFCSRF全称ItisCross-SIteRequestForgery(跨站请求伪造)。3.路由分析3.1文件路径