MST
星途 面试题库

面试题:Node.js HTTP服务跨域安全优化及复杂场景处理

在Node.js的HTTP服务中,假设存在多个不同域的前端应用需要访问该服务,同时要保证安全性。请设计一套全面的跨域解决方案,涵盖CORS配置优化、防止跨域伪造请求(CSRF)等安全措施,并且要考虑到在高并发场景下如何保证性能不受太大影响。请详细描述设计思路和关键代码实现。
15.4万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

1. CORS 配置优化

设计思路

  • 允许的源管理:使用白名单机制,明确允许哪些前端应用的域可以访问服务,避免开放过于宽松的访问权限。
  • HTTP 方法和头信息:根据实际需求,允许必要的 HTTP 方法(如 GET、POST、PUT、DELETE 等)以及前端可能会发送的自定义头信息。
  • 预检请求处理:对于复杂请求(如非简单请求,涉及自定义头或不同 HTTP 方法),优化预检请求的缓存,减少不必要的重复预检。

关键代码实现

使用 express 框架为例:

const express = require('express');
const app = express();
const cors = require('cors');

// 配置 CORS 白名单
const whitelist = ['http://frontend1.com', 'http://frontend2.com'];
const corsOptions = {
  origin: function (origin, callback) {
    if (whitelist.indexOf(origin)!== -1 ||!origin) {
      callback(null, true);
    } else {
      callback(new Error('Not allowed by CORS'));
    }
  },
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization'],
  preflightContinue: false,
  optionsSuccessStatus: 204
};

app.use(cors(corsOptions));

// 其他路由和中间件
app.get('/', (req, res) => {
  res.send('Hello World!');
});

const port = 3000;
app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

2. 防止跨域伪造请求(CSRF)

设计思路

  • CSRF Token 生成与验证:为每个用户会话生成一个唯一的 CSRF Token,在用户登录或会话开始时创建,并存储在服务器端(如 session 中)。前端在每次请求时携带该 Token,服务器进行验证。
  • Token 存储与传输:Token 可以存储在 cookie 中,并通过自定义头信息传输到服务器,避免在 URL 中暴露。
  • Token 有效期管理:设置合理的 Token 有效期,过期后要求用户重新获取新的 Token。

关键代码实现

同样以 express 为例,结合 express-session 来管理会话:

const express = require('express');
const session = require('express-session');
const csrf = require('csurf');

const app = express();
app.use(session({
  secret: 'your-secret-key',
  resave: false,
  saveUninitialized: true
}));

const csrfProtection = csrf({ cookie: true });

// 生成 CSRF Token 并传递给前端
app.get('/csrf-token', csrfProtection, (req, res) => {
  res.json({ csrfToken: req.csrfToken() });
});

// 需要验证 CSRF Token 的路由
app.post('/protected', csrfProtection, (req, res) => {
  res.send('CSRF Token 验证成功');
});

const port = 3000;
app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

3. 高并发场景下性能优化

设计思路

  • 缓存策略:对于 CORS 预检请求,设置合理的缓存机制,如使用 Cache-Control 头信息,减少重复的预检请求处理。
  • 异步处理:在处理 CSRF Token 验证等操作时,尽量使用异步函数和非阻塞 I/O 操作,避免高并发时的阻塞。
  • 负载均衡:在高并发场景下,引入负载均衡器(如 Nginx),将请求均匀分配到多个服务器实例上,减轻单个服务器的压力。

关键代码实现(缓存 CORS 预检请求示例)

cors 配置中添加缓存相关设置:

const corsOptions = {
  origin: function (origin, callback) {
    if (whitelist.indexOf(origin)!== -1 ||!origin) {
      callback(null, true);
    } else {
      callback(new Error('Not allowed by CORS'));
    }
  },
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization'],
  preflightContinue: false,
  optionsSuccessStatus: 204,
  // 缓存预检请求 1 小时
  maxAge: 3600 
};

通过以上设计思路和关键代码实现,可以在 Node.js 的 HTTP 服务中实现一套全面的跨域解决方案,同时兼顾安全性和高并发场景下的性能。