JWT & OAuth2 - хранит ли токен сервер? & Как они защищены/безопасны для хакеров?

Я полный нуб, когда дело доходит до безопасности, стратегий аутентификации. Поэтому я читал эту статью о "Аутентификации на основе токенов": https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication

У меня есть 2 вопроса:

  1. Я не понимаю, почему посредник (или хакер) не сможет увидеть токен, отправленный клиентом, и использовать его для олицетворения этого клиента/человека для получения ресурсов? Что делает аутентификации на основе JSON Web Tokens/OAuth2 более безопасными в этом смысле? Если бы мы каждый раз использовали токен только для одноразового использования, я бы понял, что даже если хакер сможет прочитать токен, он не сможет использовать его для другого запроса. Но так как токен остается неизменным до истечения срока его действия, насколько безопаснее стратегия аутентификации?

  2. Как сервер узнает, что токен, отправленный клиентом, является действительным, то есть чем-то, что сервер обменял с клиентом во время входа в систему. Сохраняет ли сервер токен, сгенерированный в базе данных или где-то еще, и продолжает обновлять "метку времени последнего доступа" или что-то в этом роде и продолжает удалять токены, где last_accessed_time> 1 час назад, чтобы продолжать истекать после 1 часа бездействия?

Ответ 1

Я не понимаю, почему посредник (или хакер) не сможет увидеть маркер, отправленный клиентом, и использовать его для олицетворения в качестве этого клиента/человека для извлечения ресурсов?

JWT не защищает вас от атаки "человек-в-середине" (MITM). Если злоумышленник получает действительный токен, он может эффективно выдавать себя за него. Даже если содержимое зашифровано.

JWT следует использовать с подключением SSL/TLS, чтобы избежать MITM

Что делает аутентификацию на основе JSON Web Tokens/OAuth2 более безопасной в этом смысле?

JWT - это токеновый формат, а oauth2 - протокол. oauth2 может использовать jwt. Oauth2 более безопасен для пользователя с использованием стороннего сайта, поскольку учетные данные отправляются только от пользователя на главный сайт, а затем сайт выдает токен, который может использоваться сторонним сайтом для аутентификации пользователя. На стороннем сайте никогда не отображаются учетные данные пользователя

Но как токен остается неизменным до истечения срока его действия, как это безопасная стратегия аутентификации?

Прочитайте выше. Вам нужно защитить свои жетоны, чтобы их не украли: в основном используйте HTTPS или смягчайте его эффекты: храните в файлах cookie с HttpOnly (если вам не нужно получать доступ к содержимому JWT на стороне клиента), установите время истечения срока действия коротким, поверните маркеры...

Как сервер знает, что токен, отправленный клиентом, действителен, то есть что-то, что сервер обменивал с клиентом во время входа в систему.

Третья часть JWT, такая как hhhh.pppp.ssss, является сигнатурой. Подпись выполняется с закрытым ключом сервера по заголовку и полезной нагрузке (hhhh.pppp), защищает содержимое. Если злоумышленник изменяет содержимое или подпись, сервер будет обнаруживать его, проверяя подпись и отклоняя аутентификацию.

Сохраняет ли сервер токен, сгенерированный в базе данных или где-то, и продолжает обновлять "последнюю доступную временную метку" или что-то подобное и продолжает удалять токены, где last_accessed_time > 1 час назад, чтобы истечь его через 1 час бездействия?

Это не нужно. Подпись упакована в сам токен (ssss), поэтому сказано, что JWT является самодостаточным

Сервер имеет криптографический секретный ключ или пару ключей, public и privete. Маркер подписан и проверен с помощью секретного ключа (для симметричных ключей HMAC) или подписан с закрытым ключом и проверен с помощью соответствующего открытого ключа (для асимметричных ключей RSA)

Ответ 2

Все дело в подписи токена, а не в шифровании токена. Сервер просто проверяет подпись, JWT не шифруется (если вы ее не реализуете). Не храните конфиденциальные данные в токене, потому что по умолчанию они не зашифрованы.