(создан из этого потока, поскольку это действительно вопрос отдельный, а не специфический для NodeJS и т. д.)
Я реализую сервер REST API с аутентификацией, и я успешно реализовал обработку токена JWT, чтобы пользователь мог войти в систему через конечную точку / login с именем пользователя / паролем, после чего токен JWT создается из секрета сервера и возвращается в клиент. Затем токен передается от клиента к серверу в каждом аутентифицированном запросе API, после чего секрет сервера используется для проверки токена.
Тем не менее, я пытаюсь понять передовой опыт того, как именно и в какой степени токен следует проверять, чтобы создать действительно безопасную систему. Что именно должно быть задействовано для «проверки» токена? Достаточно ли того, что подпись может быть проверена с использованием секрета сервера, или я должен также перепроверить токен и / или полезную нагрузку токена с некоторыми данными, хранящимися на сервере?
Система аутентификации на основе токенов будет настолько безопасной, насколько безопасна передача имени пользователя и пароля в каждом запросе при условии, что получить токен так же или сложнее, чем получить пароль пользователя. Однако в примерах, которые я видел, единственная информация, необходимая для создания токена, - это имя пользователя и секрет на стороне сервера. Разве это не означает, что если предположить на минуту, что злоумышленник узнает секрет сервера, он теперь может производить токены от имени любого пользователя, тем самым имея доступ не только к одному данному пользователю, как это было бы, если бы пароль был получается, а по сути для всех учетных записей пользователей?
Это подводит меня к вопросам:
1) Должна ли проверка токена JWT ограничиваться проверкой подписи самого токена, полагаясь только на целостность секрета сервера, или с отдельным механизмом проверки?
В некоторых случаях я видел совместное использование токенов и сеансов сервера, когда после успешного входа в систему через конечную точку / login устанавливается сеанс. Запросы API проверяют токен, а также сравнивают декодированные данные, найденные в токене, с некоторыми данными, хранящимися в сеансе. Однако использование сеансов означает использование файлов cookie и в некотором смысле противоречит цели использования подхода на основе токенов. Это также может вызвать проблемы у некоторых клиентов.
Можно представить себе, что сервер хранит все токены, которые в настоящее время используются в кэше памяти или аналогичном, чтобы гарантировать, что даже если секрет сервера будет скомпрометирован, чтобы злоумышленник мог произвести «действительные» токены, только точные токены, которые были сгенерированы через конечную точку / login будет принято. Это разумно или просто избыточно?
2) Если проверка подписи JWT является единственным средством проверки токенов, а это означает, что целостность секрета сервера является критической точкой, как следует управлять секретами сервера? Считывать из переменной среды и создавать (случайным образом?) Один раз для каждого развернутого стека? Периодически обновляется или обновляется (и если да, то как обрабатывать существующие действительные токены, которые были созданы до вращения, но должны быть проверены после вращения; возможно, этого достаточно, если сервер хранит текущий и предыдущий секреты в любой момент времени) ? Что-то другое?
Может быть, я просто чрезмерно параноик, когда дело касается риска компрометации секрета сервера, что, конечно, является более общей проблемой, которую необходимо решать во всех криптографических ситуациях ...
RSAPrivateKey privateKey
??