Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!22.01.2025
Непорозуміння про JWT
JSON Web Token припинили бути модною технологією ще, мабуть, років 5 тому, але тепер вони стали чимсь таким звичним, що наче має сенс для автентифікації. Зокрема, вони “вигідно” відрізняються від просто випадкового ключа сесії тим, що всередину можна запхати якісь дані, та ще і якась криптографія присутня, тож це ж, мабуть, ще й безпечніше?
Ні. Головне, що треба усвідомити - JWT не є зашифрованим, а тільки підписаним! Який ти алгоритм не обирай для створення JWT, це впливає тільки на зміст підпису. Дані ж лише закодовані в Base64 - певно, щоб полегшити транспортування. (Власне, JWT складається з трьох рядків у Base64, зʼєднаних крапками: заголовок, зміст, підпис.)
Тому у JWT не можна класти ніякі секретні дані. Можна думати про JWT як квиток на концерт: на ньому зазначене твоє місце, а також є печатка каси. На концерті білетер — вже без каси! - може перевірити печатку та пропустити тебе в зал. В цьому і є весь зміст існування JSON Web Token.
Так само для JWT є тільки одне місце: коли треба передати не дуже таємні дані з одного сервісу в інший через відкритий канал. Типове використання — якщо в складній інфраструктурі авторизацією займається окремий сервіс. Тоді у JWT сидить ID користувача та, можливо, інші необхідні атрибути — можливо, навіть права доступу.
Практично обовʼязково JWT повинний мати термін дійсності, бо він є самодостатнім носієм інформації, та його неможливо відкликати (а якщо технічно можливо, то ймовірно, JWT в такій архітектурі зайві.)
Що краще взяти замість JWT? На мою думку, кукі з ключем сесії та HttpOnly все ще ідеальний варіант, якщо ми можемо його собі дозволити.