node开发与前端开发的区别
node后端开发的关注点
- 要关心内存是否泄漏
- 关心cpu和内存的占用,这些资源在服务端是稀缺资源
- 关心网站服务端的稳定性和安全性(因为你的接口是暴露在外网上的)
校验用户采用cookie的问题
1.不安全,开发者可以通过js盗取并设置来伪装其他用户登录账户操作数据
cookie(document.cookie="键=新值")
可以通过在服务端的
cookie设置时添加httpOnly来增加cookie操作权限,来规定该cookie只允许服务端来操作.如:
res.setHeader('Set-Cookie',`username=${data.username};path=/;httpOnly;expires=${getCookieExpires()}`))
2.用户的敏感信息暴露到外网上(用户名有可能是手机号,qq号等 ,理论上也是安全,隐私问题)
3.由于cookie的大小限制,如果传输信息量过大,则cookie可能不适用,并会造成流量浪费
session的产生
1.针对cookie的问题,产生了session的解决方案
2.session的本意是指,我们通过在cookie中设置一个经过加密算法生成的字符串作为用户标识(也叫userId),然后在后台根据userId,对应出正常的用户名和其他敏感信息,敏感信息在用户登录成功后保存到对应的内存中
//解析session
const SESSION_DATA = {}
let needCookie = false
let userId = req.cookie.userid
if (userId) {
if (!SESSION_DATA[userId]) {
SESSION_DATA[userId] = {}
}
} else {
needCookie = true
userId = `${Date.now()}_${Math.random()}`
SESSION_DATA[userId] = {}
}
req.session = SESSION_DATA[userId]
//设置cookie并返回
if (needCookie) {
res.setHeader('Set-Cookie', `userid=${userId};path=/;httpOnly;expires=${getCookieExpires()}`)
}
res.end(
JSON.stringify(data)
)
目前这种方案的缺点
1.实现:目前这种session的数据是直接 存储在js的对象中的,数据放在了node.js进程的内存中
2.缺点:
<1>进程内存是有限的,如果访问量过大,那么就会造成内存使用暴增,容易发生内存泄漏,造成进程奔溃,服务挂机
<2>正式上线后项目运行的是多进程,进程间的内存是无法共享的(项目大了之后,可能是集群部署这是多机器的,也无法共享数据)
针对session的问题----redis
1.特点
webserver最常用的数据库 ,数据存储在内存中
2.优点
相比于 mysql,访问速度快(硬盘和内存的访问速度不是一个数量级的)
3.缺点
成本昂贵,可存储的数据量小(内存的硬伤)
redis解决方案为什么适用session?
<1>session 访问频繁,对性能要求极高
<2>session可以不考虑断电数据丢失的问题
<3>session数据量不会太大
redis解决方案为什么不适用网站数据?
<1>操作频率不是太高
<2>断电不能丢失,必须保留
<3>数据量太大,内存成本太高
和前端联调
<1>登录功能依赖cookie,所以必须使用浏览器来联调
<2>cookie是跨域不共享的,所以前端和后端必须是同域的才能访问
<3>可以使用nginx代理,实现接口联调
nginx介绍
<1>高性能的web服务器,开源免费
<2>一般用于做静态服务\负载均衡
<3>反向代理