将socket.io套接字存储在服务器对象中安全吗



这可能是一个愚蠢的问题,但我正在尽可能简单地解释它。

因此,我一直在使用axios将数据从服务器检索到我的react应用程序(redux(由于我在应用程序中经常使用socket.io,我想我也可以使用它进行身份验证,所以我不必同时使用axios和socket.io。我一直在使用PassportJS进行身份验证,但我无法理解我在npm上发现的socket.io护照包是如何工作的。

我正在使用这个socket.io-redux中间件来激发socket.io事件上的reducers。有了这一点,我可以调度操作,然后将其发送到服务器,并从服务器启动我想要的减速器,以更改状态。

这是我的商店.js

import { createStore, applyMiddleware, compose } from "redux";
import thunk from "redux-thunk";
import rootReducer from "./reducers";
import { composeWithDevTools } from 'redux-devtools-extension';
import createSocketIoMiddleware from 'redux-socket.io';
import io from 'socket.io-client';
const socket = io('http://localhost:5000');
const socketIoMiddleware = createSocketIoMiddleware(socket, "io/");

const initialState = {};
const middleware = [thunk, socketIoMiddleware];
const store = createStore(
rootReducer,
initialState,
composeWithDevTools(
applyMiddleware(...middleware)
)
);
// store.dispatch({type:'server/hello', data:'Hello!'});
export default store

使用这种方法,在连接到网站时为每个客户端创建一个套接字。我还在服务器端创建了一个Store类,使用类似的登录/注销方法(这些方法跟踪客户端和和它们相关联的用户(:

class Store
{
constructor(){
this.loggedInUsers = [];
}
loginUser(userID, socketID){
console.log('login', userID, socket.id);

const index = this.loggedInUsers.find(u => u.socketID !== socket.id && u.userID === userID);
if(index >= 0){
this.logoutUser(this.loggedInUsers[index].socketID);
}

this.loggedInUsers = [
...this.loggedInUsers, 
{
userID: userID,
socketID: socket.id,
}
];
}
logoutUser(socketID){
console.log('logout', socketID);
const index = this.loggedInUsers.find(u => u.socketID === socketID);
if(index >= 0){
this.loggedInUsers = [...this.loggedInUsers.slice(0, index), ...this.loggedInUsers.slice(index+1)];
}
}
}
module.exports.store = new Store();

登录时,一个socket.io事件被发送到服务器,然后成功登录时,套接字被存储在一个loggedInUsers对象中,该对象包含用户ID和与其关联的套接字,然后启动一个reducer将已验证的状态存储在我的存储中。注销时,具有给定套接字的用户将从对象中删除。

现在我想知道这样做是否安全。

我在以前的一个项目中做了完全相同的事情,将每个用户的mongo和socket id-s保存在一个数组中。

这样想,其中一个对象需要多少内存,大约50字节?60?因此,从技术上讲,假设最大使用量为500 MB,内存中可以有大约1000万个这样的内存。在32位和64位系统之间,节点的最大内存限制从700MB到1.4GB不等,因此对于1000万个套接字实例(这与1000万同时使用的用户不同,因为用户可以打开多个选项卡,并且每个选项卡/实例都创建一个套接字(,您应该是安全的,因为节点本身被认为不用于密集操作。

现在这些都是限制,最终,你仍然可以通过使用一些Redis或Memcache来达到介于内存和存储速度之间的速度,从而超越这个限制。由于我不知道你的情况,我认为如果你正确地清理了注销的用户,你在泄漏方面是非常安全的。

相关内容

  • 没有找到相关文章

最新更新