solovyov.net

JWT: скільки вже можна?

Ще перший раз, як я зустрів згадку JWT, мене трохи дивував пафос, з яким давно відомому підходу — підписанним кукам — вигадали нову назву. Стандартизували так кльово, наплодили дір по всьому інтернету — особливо кльово було, коли бездумно юзали джавну лібу, а в неї по дефолту користувач міг сам сказати alg=none і хобана, нічого не треба підписувати, просто скажи мені свій user_id! Phantastic!

Так от, знаєте, чим JWT відрізняється від підписанної куки? Нічим! Це просто загальноприйнятий формат підписанної куки. Чим це погано, окрім загальних для всіх вразливостей?

Ти не знаєш, скільки в користувача сесій. Тобто ти напевно через аналітику це можеш дізнатися, але які шанси, що ти довів вже аналітику свою до стану, коли можеш легко через неї кількість сесій дізнатися? Тобто коли когось зламають, тобі буде важко навіть знайти, кого.

І, авжеж, ти знайшов, кого зламали, але не можеш його розлогінити! Ну окей, зламали тітку Валентину, щось натворили, ти їй скинув пароль (бо був qwerty тощо). Що ти будеш робити, щоби викинути ті сесії? Допилювати умови “всім сесіям користувача 90210 старше за 12 грудня — відмовляти”? Glorious future!

Тобто історія, як в телеграмі, коли тобі показується список сесії з інформацією про те, звідки вони — просто неможлива.

Хвате вже цю хрінь юзати. Є ж звичайні токени. Записав в базу сесію з інформацією про неї (ip, user-agent, шо там ще можна вигадати), віддав у кукі її айдішник, і все, будь щасливий. І не просто щасливий, а ще й забезпечений можливостями апгрейдити сек’юріті у майбутньому без вилогінювання всіх користувачів — за яке вони тебе зненавидять і видалять твою апку.

P.S. Як я хочу видалити апку OLX, але не можу, бо їх сайт ще гірше. 🤣

P.P.S. Читайте коментарі, там є опис цікавого юзкейсу про використання JWT всередині інфраструктури (не у user-facing сценаріях).

(@ tg)