(породжена з цієї теми, оскільки це справді питання власне і не характерне для NodeJS тощо)
Я реалізую сервер API REST з аутентифікацією, і я успішно реалізував обробку токенів JWT, щоб користувач міг увійти через кінцеву точку / входу з ім'ям користувача / паролем, після чого маркер JWT генерується з секрету сервера і повертається до клієнт. Потім маркер передається від клієнта до сервера в кожному аутентифікованому запиті API, після чого секрет сервера використовується для перевірки маркера.
Однак я намагаюся зрозуміти кращі практики для того, як саме і в якій мірі маркер повинен бути затверджений, щоб зробити справді безпечну систему. Що саме має бути залучено до "перевірки" жетону? Чи достатньо, щоб підпис можна було перевірити за допомогою секрету сервера, чи я також повинен перехресно перевірити маркер та / або корисний набір токена на деякі дані, що зберігаються на сервері?
Система аутентифікації на основі лексеми буде настільки ж безпечною, як передача імені користувача / пароля в кожному запиті, за умови, що отримати маркер так само або складніше, ніж отримати пароль користувача. Однак у наведених нами прикладах єдина інформація, необхідна для створення маркера, - це ім'я користувача та секрет на стороні сервера. Чи це не означає, що якщо припустити, що зловмисний користувач здобуває знання серверної таємниці, він тепер може виробляти жетони від імені будь-якого користувача, тим самим маючи доступ не лише до одного даного користувача, як це було б фактом, якби пароль був отримані, але насправді для всіх облікових записів користувачів?
Це підводить мене до питань:
1) Чи слід обмежувати перевірку токена JWT лише перевіркою підпису самого маркера, покладаючись лише на цілісність секрету сервера, або супроводжуватися окремим механізмом перевірки?
У деяких випадках я бачив комбіноване використання жетонів і сеансів на сервері, де при успішному вході через / логін вхід встановлюється сеанс. API запитів перевіряє маркер, а також порівнює декодовані дані, знайдені в маркері, з деякими даними, що зберігаються в сеансі. Однак використовувати сеанси означає використовувати файли cookie, і в деякому сенсі це перемагає мету використання підходу на основі лексеми. Це також може спричинити проблеми для певних клієнтів.
Можна було б уявити, як сервер зберігає всі маркери, які зараз використовуються, у мемаш-пам'яті чи подібних, щоб гарантувати, що навіть якщо секрет сервера порушений, щоб зловмисник міг видавати "дійсні" жетони, лише ті токени, які були згенеровані через кінцеву точку / вхід буде прийнято. Це розумно чи просто зайве / зайве?
2) Якщо перевірка підпису JWT є єдиним засобом перевірки маркерів, тобто цілісність секрету сервера є точкою розриву, як слід керувати секретами сервера? Читання із змінної середовища та створене (рандомізоване?) Раз на розгорнутий стек? Періодично повторно нові або повертаються (і якщо так, як поводитися з існуючими дійсними маркерами, які були створені перед обертанням, але їх потрібно перевірити після обертання, можливо, цього достатньо, якщо сервер тримається за поточний та попередній секрет у будь-який момент часу) ? Щось ще?
Можливо, я просто надмірно параноїчний, коли йдеться про ризик порушити секрет сервера, що, звичайно, є більш загальною проблемою, яку потрібно вирішити у всіх криптографічних ситуаціях ...
RSAPrivateKey privateKey
??