Express-sessions возвращает ошибку 400 с набором файлов cookie сеанса с большими файлами cookie и только на AWS Fargate - PullRequest
0 голосов
/ 30 апреля 2019

Мой веб-сайт представляет собой приложение expressjs, которое упаковывается в образ докера и работает в AWS Fargate за ALB.Пользователи с большим количеством файлов cookie в домене (~ 7 КБ) сталкиваются с ошибкой 400 HTTP.Однако, если пользователь удаляет свои куки, проблема решается, по крайней мере, в течение нескольких дней, пока удаленные куки не будут переустановлены.Я являюсь одним поддоменом в этом домене, и у меня нет политического влияния для уменьшения количества файлов cookie или способа установки файлов cookie;Я работаю в большой компании.

Я устранил причину ошибки в ALB.Метрика CloudWatch, HTTPCode_ELB_4XX_Count равна 0, тогда как HTTPCode_Target_4XX_Count резко возрастает, когда я тестирую эту ошибку.

Моя диагностическая установка выглядит следующим образом: В моей учетной записи AWS для подготовки к производству я установил для среды DEBUG значение * на контейнере.Я также сократил проверку работоспособности целевой группы каждые 5 минут (для уменьшения трепетания) и уменьшил количество задач до 1 (для централизации журналов в одном потоке cwlog).Expressjs должен регистрировать любые входящие запросы, которые он направляет, с подробным описанием, аналогичным странице отладки Expressjs , однако абсолютно ничего не выводится в журнале.Это как если бы запрос не доходил до expressjs.Я подумал, может быть, я испортил настройку, но тестирование в режиме инкогнито приводит к выводу многих отладочных операторов.

Используя Postman, я скопировал заголовок cookie из Chrome CDT;Я продолжаю получать тот же результат 400 с заголовком Connection: close, включенным в ответ.Я использую модуль express-sessions, и если я удаляю cookie сеанса (connect.sid), запрос работает.Если я удаляю все куки, кроме connect.sid (сохраняя старое значение), запрос работает.Если я отправляю все файлы cookie, но обновляю connect.sid до значения, возвращаемого Set-Cookie, запрос работает.

Если я пробую те же тесты локально, используя docker-compose, я не смогу воспроизвести ошибку 400ответ на вопрос.Образы докера одинаковы как в docker-compose, так и в fargate.Оба используют postgres через модуль connect-pg-simple в качестве хранилища сеансов.Таким образом, потенциально может быть что-то в сетевом стеке AWS или среде выполнения AWS Fargate.

Соответствующие зависимости в package.json:

    "connect-pg-simple": "^5.0.0",
    "express": "^4.16.4",
    "express-session": "^1.11.1",
    "helmet": "^3.15.0",
    "method-override": "^3.0.0",
    "morgan": "^1.9.1",
    "pg": "^7.6.1",

Вот некоторые выдержки из моего кода.Я включил другие установочные библиотеки, на случай, если они конфликтуют, хотя пропустил паспорт.

const express = require('express');
const compression = require('compression');
const helmet = require('helmet');
const methodOverride = require('method-override');
const pg = require('pg');
const session = require('express-session');
const pgSession = require('connect-pg-simple')(session);
const sessionStore = new pgSession({
    pool: new pg.Pool()
  });

const app = express();
app.use(methodOverride());
app.use(compression());
app.use(helmet({
  // helmet settings omitted
}));
app.enable('trust proxy');    // Process X-Forwarded-* headers
app.use(session({
  cookie: {
    httpOnly: true,
    secure: true
  },
  name: 'connect.sid',
  resave: false,
  saveUninitialized: true,
  secret: 'some secret here',
  store: sessionStore
}));
// rest of the code

Я был бы рад получить любые советы, указатели, предложения, уточняющие вопросы.Потратив на это несколько часов, я мог бы использовать новую перспективу.

1 Ответ

0 голосов
/ 30 апреля 2019

Посредством разговора, который я имел в отчете об ошибке Я вошел в систему с помощью модуля экспресс-сессии, я нашел ответ. В ноябре 2018 максимальная длина заголовка http была уменьшена с 80 КБ до 8 КБ для обращения к CVE. Это затронуло все поддерживаемые версии nodejs (v6, v8, v10). Для тех, кто сталкивается с подобными проблемами, обновите до последней микро-версии nodejs, которая вводит флаг - max-http-header-size . Для nodejs v10 это было введено в v10.15 .

...