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