«Хватит использовать JWT» встречает тех, кто крутит JWT в проде

Gist советует отказаться от JWT в пользу обычных сессионных кук. А потом пришли люди из AWS и identity-платформ и напомнили: этот стандарт тихо аутентифицирует половину их инфраструктуры.

Вкратце

Главный тезис gist: JWT создавались под токены на ~5 минут, а не под логины, и «они не предназначены для этого, они небезопасны». Используйте сессионные куки или PASETO для подписанных токенов.

Повторяющаяся оговорка из обсуждения: это верно для браузерных сессий — и почти только для них.

Разворот: один комментатор предложил сломать AssumeRoleWithWebIdentity в AWS STS, если JWT и правда так небезопасны. Желающих не нашлось.

Категоричный приговор стандарту, на котором держится облако

Gist, всплывший снова после утечки в FIFA, ставит вопрос ребром: «JWT не должны использоваться для того, чтобы держать пользователя залогиненным. Они для этого не предназначены, они небезопасны». Аргументация: JWT рассчитаны на короткоживущие (~5 минут) токены, настоящая stateless-схема безопасно недостижима, а самой спецификации «не доверяют эксперты по безопасности». Рекомендуемое решение неброское: обычные сессии на куках, с express-session и хранилищем вроде connect-session-knex для Node, и PASETO, когда подписанный токен действительно нужен.

«Для браузерных пользовательских сессий» — недостающие четыре слова

Самый заплюсованный ответ не спорил с тезисом о безопасности. Он его ограничил:

«Необходимая оговорка: для браузерных пользовательских сессий. У JWT хватает хороших применений в коммуникации между сервисами.» — инженер по инфраструктуре с 8 тыс. кармы

Тот же инженер бросил вызов в обсуждении: если JWT настолько чудовищно небезопасны, опубликуйте взлом AssumeRoleWithWebIdentity в AWS STS, «или не публикуйте, а просто используйте дыру и запустите криптомайнеры в каждом продакшен-аккаунте AWS из Fortune 500». Желающих не нашлось.

Арифметика отзыва работает в обратную сторону

Самый сильный довод gist в том, что нельзя отозвать отдельный JWT. Но фрилансер-фуллстек развернул это в аргумент за JWT:

«У JWT есть ограниченный срок жизни, поэтому список отзыва нужно держать только для ещё не истёкших токенов… ваш список действующих сессий, скорее всего, на порядки больше списка отзыва.» — фрилансер-разработчик на TypeScript и .NET из Германии

Короткий список отзыва ещё не истёкших токенов запрашивать дешевле, чем полную таблицу всех действующих сессий. Другие заметили, что страшилка про XSS бьёт в обе стороны: куки при XSS тоже утекают, так что «если ваш сайт уязвим к XSS, это уже ваша проблема».

Настоящая претензия к пугалу, а не к токену

Самая острая реплика была не за и не против JWT. Она была против категоричности:

«Они безопасны, если укладываются в ваш профиль рисков; огульное заявление вроде этого — просто дезинформация. Не держите коллег за идиотов.» — комментатор против запугивания вместо аргументов

Если убрать вызов и контр-арифметику, обсуждение сходится к скучной правде, которую заголовок не удержит: «хватит использовать JWT» верно для того, чтобы держать браузер залогиненным, и неверно для всего остального, а именно там JWT в основном и живут. Баг не в токене. Баг в том, чтобы применять инструмент к задаче, под которую его никогда не проектировали.

Получайте такие разборы каждый день

Главные истории Hacker News — на email, в Telegram или RSS.

Следующая новость · 12 из 23 Читать дальше
🚀Tech

256 КБ кода, чтобы обнулить 64 КБ памяти — починили прямо в эмуляции

Компилятор развернул цикл инициализации стека в 65 536 отдельных инструкций записи байта. Команду эмулятора x86 это так возмутило, что они научили транслятор распознавать шаблон и тихо сворачивать его обратно в цикл.

★ 478 · 💬 158 · devblogs.microsoft.com · 3 мин