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