безопасность сеанса веб-приложений против токена - PullRequest
1 голос
/ 21 октября 2019

Справочная информация:
Я занимаюсь разработкой веб-приложения, планируется использовать spring-mvc и Spring Security. Я планирую использовать аутентификацию на основе форм, где Spring Security аутентифицирует учетные данные и устанавливает сеанс JSESSIONID, чтобы последующие запросы аутентифицировались на основе файла cookie, присутствующего в заголовке запроса.

Мое понимание :

  • Запросы веб-приложений должны иметь состояние. Это состояние может быть достигнуто с помощью сеанса.

  • Чисто аутентификация на основе сеанса уязвима для атак CSRF. Поскольку пружинная защита обеспечивает защиту CSRF, я не нашел никаких дыр в петлях безопасности, использующих защиту session + CSRF.

  • токены доступа используются только для предоставления доступа к API, которые были открыты длясторонние приложения.

Мой вопрос:
Но когда я вижу много вопросов на этом сайте, люди используют аутентификацию на основе токенов (OAuth2 / JWT) для веб-приложения. Но я верил, что токены используются только для предоставления доступа к API.

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

  1. Когда нам нужно перейти на аутентификацию на основе токенов в веб-приложении .

  2. Что касается безопасности, какой из них хорош? Session + CSRF или token аутентификация на основе .

Я запутался со случаями использования токена и сеанса.

РЕДАКТИРОВАТЬ:

Из комментария Момо

Чаще всего зависит от ваших клиентов .
Например, для мобильных клиентов (например, JSON полезная нагрузка более HTTP) такой вещи, как Session, не существует. JWT имеет преимущество для работы cross-origin. Напротив, метод auth на основе сеанса с Cookies работает только для того же (Sub) -домена) и масштабируется не так хорошо.
Однако, Session легче признать недействительным, чем JWT. Так как вы все равно используете Spring-MVC, и я думаю, что масштабируемость не критична, просто выберите тот, который вам удобнее .


заключение: Поддержка сеансовзапросы только из одного источника, для аутентификации запросов между источниками предпочтительна аутентификация на основе токенов .

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Чаще всего это зависит от ваших клиентов. Например, для мобильных клиентов (например, полезная нагрузка JSON через HTTP) такой вещи, как Сессия, не существует.

JWT

  • JWT имеет преимущество передработать с разными источниками в разных доменах
  • Поэтому аутентификация на основе JWT лучше
  • очень популярна в эпоху одностраничных приложений (SPA) / веб-API
  • для защиты целостности с помощью подписи или MAC. Не разрешать использование незащищенных JWT: {"alg": "none"}

Session

  • , которые в основном используются вместе с веб-браузерами
  • Проще сделать недействительным (удалить) сеанс. JWT имеет только срок действия и действителен до истечения срока его действия
  • . Обратите внимание на следующие атрибуты cookie: secure;HttpOnly и для обеспечения некоторой защиты от атак подделки межсайтовых запросов: SameSite = Strict или SameSite = Lax

Другие подходы: Провайдеры идентификации с открытым исходным кодом, такие как Keycloak, например, traefik в качестве нагрузкиБалансировщики стали довольно популярными. Это дает преимущество в том, что новые маршруты могут работать без перезапуска какого-либо сервиса. Кроме того, в некоторых случаях это экономит время простоя приложений, вызванное чрезмерной скоростью вызовов API.

Вывод: многие дороги ведут в Рим. Это всегда зависит от конкретных требований, окружающей среды и навыков команды. Так как вы все равно используете Spring MVC, и я думаю, что масштабируемость не критична, просто выберите ту, которая вам удобнее ..

0 голосов
/ 25 октября 2019
  • Для приложения без сохранения состояния используйте JWT
  • Для сторонних приложений используйте OAuth2
  • Для приложения Statefull используйте Session + CSRF
...