Файлы cookie HttpOnly против заголовков авторизации для передачи JWT

#node.js #express #cookies #jwt

#node.js #экспресс #файлы cookie #jwt

Вопрос:

итак, я немного запутался в правильном способе передачи авторизации JWT, я знаю, что общий подход заключается в том, что вы можете использовать заголовок авторизации для его проверки, что-то вроде этого:

 const verifyToken = (req, res, next) => {
  const authHeader = req.headers.token;
  if (authHeader) {
    const token = authHeader.split(" ")[1];
    jwt.verify(token, process.env.JWT_KEY, (err, user) => {
      if (err) {
        res.status(403).json("Token is not valid!");
      }
      req.user = user;
      next();
    });
  } else {
    res.status(401).json("You're not authenticated");
  }
};
 

Однако, если я использовал cookie для хранения своего токена JWT после входа в систему, например:

 res.cookie("accessToken", accessToken, { httpOnly: true });
res.cookie("refreshToken", refreshToken, { httpOnly: true });
 

Означает ли это, что я могу игнорировать указанный выше authHeader и использовать непосредственно из файла cookie для проверки моего токена? Что-то вроде:

 const verifyToken = (req, res, next) => {
  //USING TOKEN FROM COOKIES
  const accessToken = req.cookies.accessToken;
  const refreshToken = req.cookies.refreshToken;
  if (accessToken amp;amp; refreshToken) {
    jwt.verify(accessToken, process.env.JWT_KEY, (err, user) => {
      if (err) {
        res.status(403).json("Token is not valid!");
      }
      req.user = user;
      next();
    });
  } else {
    res.status(401).json("You're not authenticated");
  }
};
 

Спасибо за любые разъяснения

Ответ №1:

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

Простая установка HttpOnly также является плохой практикой, вы также должны установить атрибут Secure и SameSite для файлов cookie, чтобы сделать их более безопасными. Еще лучше зашифровать их, прежде чем хранить внутри файла cookie.

Лучшим подходом может быть рассмотрение шаблона BFF, как описано здесь

Комментарии:

1. Привет, как насчет того, чтобы я сохранил accessToken в памяти, чтобы клиент мог установить его в качестве заголовка авторизации и сохранить refreshToken в файле cookie HttpOnly, поэтому, хотя мой accessToken открыт, он недолговечен, это лучший подход? Потому что я не могу найти какую-либо реализацию для шаблона BFF в коде, спасибо

2. Проблема в том, что если вы используете стандартный поставщик авторизации OpenID Connect / OAuth, то вам нужно вызвать его, используя токен обновления в запросе API, поэтому ваш JavaScript по-прежнему должен иметь доступ к обоим токенам. Если вы все еще хотите использовать токены в браузере, рассмотрите возможность использования библиотеки, подобной github.com/openid/AppAuth-JS