Галоўная / Артыкулы / Стратэгія токена апдзейва для систем аўтанацыі Node.js

Стратэгія токена апдзейва для систем аўтанацыі Node.js

Выучыце, як проектаваць, роўнараваць, анулюваць і безпечна зберагаць токены апавяржэння ў Node.js, каб кража токенаў і выход з акаунта дзейнічалі так, як і планавалася.

2681 слоў

Калі проект на Node.js пачаткова прыўязвае процес аблогавання, можа здавацца, што задача практычна завершыта за короткі час.

Шаблон выглядае дастаткова простым: корыстнік адправляе свой электронны паштовы адрес і пароль, сервер пераканальвае ці звантыяўкі з базай дадзенаў, і як толькі яны паспаўляюць, выдаеся JWT, які падписуецца і вяртаецца кліенту. Гэты токен паследуючы з кожным наступным запитам. На першы погляд, гэта выглядае як завершаная система аутентыкаціі.

Але болей дакладны анаіз паказвае дужо длугі список запытанняў, на якія гэты просты процес ніколі не дае адказу:

  • Што будзе, калі токен выйдзе з часу дэйстывнасці?
  • Чакаецца, што корыстнік кожны раз пачынае аблогаванне значнага?
  • Якшо токен будзе вкрадзены, як дазго зловмешчык зможа яго вжываць?
  • Як на практыцы выглядае процес выключэння корыстніка з аблогавання?
  • Чы існуе спосаб развярнуць токен, які вже быў выданы?
  • Што будзе, як вкрадзены токен зноў будзе выкарыстоўвацца, нават пасля таго, як яго ўжо заўважна знішчылі?
  • Дзе воўсе трэба хаваць такі токен на кліянтскай стороне?
  • Ні адна з гэтых пытанняў не адпаведзена фразай «падпісаць JWT і пазней яго пераверыць». Зазвычай самэ гэтам моменту трэба перастаць слепа копіюваць інструкцыі з заходжэння і рэштацыйна разбіраць, як працююць токены апавяржэння.

    Чаму токены доступу не трываюць даволі дзяўна

    Короткага тэрміну дзейнасці токен доступу — не значэнне за замовчанням, якое хтось забыў зменіць; гэта свядома прынятая рашынка.

    Падумайце, што будзе, як токен доступу застанется чынным 30 дзён і потрапіць у неправыя руки: зловершальнік тады будзе маць доступ да адказу таго пользователя прыблізна месць. Гэта непрыемны компроміс. Самэ таму токены доступу зазвычай маюць тэрмін дзейнасці у хвілінах, а не у тыдзянюх — короткі тэрмін зменшае розмах уражэння, якщо токен калі-небудзь выцячуе.

    Адзінакавы выбор дизайна, пры тым, стварае свою сабэйную проблему. Якшто токен выгорае кожныя 15 хвілін, чы гэта значыць, што паўтараючы кожныя 15 хвілін, паўтараць трэба і пароль? Зрозумела, гэта немагчымая справа. Токены апавяржэння існуюць саме для таго, каб заполніць гэты прыемак.

    То што ж на самай працэ выканае токен апавяржэння?

    На першы погляд токен апавяржэння выглядае як проста ўсё той жа токен, але його ролі ў системе цэлкам іншая, чым у токена доступу.

    Процес зазвычай выглядае так:

    1. Паўтарыч пракрываеся.
    2. Сервер вяртае як токен доступу, так і токен апавяржэння.
    3. Токен доступу выкарыстоўваецца для адправкі запытак да API.
    4. Зрэшты токен доступу выгорае.
    5. Кліент адправляе токен апавяржэння на спецыяльны канецпункт апавяржэння.
    6. Якшто сервер яго успешна паўнажывае, ён выдае абліковы токен доступу.

    Канцэпцыя, якую трэба запамятаваць, — гэта тое, што токен апдэтавання ніколі не прагнеяць безпасебна з’язвацца з канчыкамі API. Яго ўзгалі елементарная задача — атрымаць новы токен доступу. Калі гэтыя две функцыі будуць чыста роздзеленыя ў свядомасці, рэшта проекта пачынае правільна функцыонаваць.

    Токен доступу проты токена апдэтавання, парадна

    Токен доступу викорыстоўваецца для з’язвання з захіщанымі API, тады як токен апдэтавання викорыстоўваецца толькі для атрымання новага токена доступу. Токен доступу мае короткі тэрмін дзейнасці; токен апдэтавання — дыяўальнейшы. Токен доступу адправляецца практычна з кожным запитам, тады як токен апдэтавання викорыстоўваецца толькі час ад часу. Якщо выцякае токен доступу, гэта пагана справа, але якщо выцякае токен апдэтавання, гэта ўжо горша, адколі яго можна викорыстаць для стварэння новых токенав доступу. Токен доступу пераказваецца ў кожным вызове API, тады як токен апдэтавання пераказваецца толькі праз спецыяльную логіку апдэтавання чы сесіі.

    Часта практыка — выдавати токен доступу на 15 хвілін, а токен понавтовлення — на 7 дзён, але ў гэтых цифрах няма нічага чародзейскага. Правильныя значэння залежыць абсалютна ад таго, што можа вытрымаць ваша прыкладна програма і ваші корыстувачы.

    Чаму токены понавтовлення заслуговуюць на большыя увагу, чым можа здавацца на першы погляд

    Токен понавтовлення можа эфектыва прытрымляць сесію жывойю наўсёле, пакуль ён застаецца чынным. Якщо хакер здобудзе такі токен, ён не толькі отрымае адзін період доступу — ён можа продаваць новыя токены доступу, пакуль гэты токен понавтовлення не выйдзе з чынносці або не будзе анульваны.

    Гэтая рэальнасць змінюе спосаб, яким трэба ставіцца да токена. Ён — не проста ўзэйны фрагмент дадзеных прыкладнай програмы; ён більш супамінае фізычны ключ ад дома. Такое ставленне значыць неабходнае рашэння такіх праблем, як:

    • выпаданне терміну чынносці
    • анулювання
    • зміна токена
  • Дзе і як ён зберагаецца
  • Як яго транспортуюць
  • Адказванне на падзею пераспісваў
  • Што на самай працэ павінен рабіць процес выйшчы з акаунта
  • Управлінне сесіяй у цэлы
  • Зазвычай саме тут, калі на першы погляд простая наладка JWT, пачынае адкрываць своія слабыя месца.

    Ротацыя: не дазволеныя вечныя токены

    Канцэпцыя, якая пераформулюея спосаб дзейства гэтай системы, — это ротацыя токенав на аднавленне. У зваротнасці да можлівасці несканчатленага пераспісваў аднаго токена на аднавленне, сервер выдае новы кожны раз, калі нынешній токен быў успешна выкарыстоўаны, а стары негайна знімаецца з эксплуатацыі.

    У зваротнасці да аднаго довгавечнага кредытнага дакумента, які циркулюець вечна, у нас выходзіць ланцоўка токенав, пры чым кожны з іх заменяе пакананнаго:

    Ўзваецца Токен А, што прыводзіць да выдачы Токена B, калі А ўжо не выкорыстоўваецца. Потым юзваецца Токен B, што прыводзіць да выдачы Токена C, калі B ўжо не выкорыстоўваецца. Гэты патэрн продолжаецца без канца, пры чым толькі самыя няўзабавна выданыя токены ў ланцугу застаюцца чыннымі.

    Чаму гэта насправды дапамагае

    Разглянем сцэнарый, калі зловмешчык яким-небудзь чынам атрымлея копію Токена А, у той час як законны юзер таксама яго мае.

    Якщо законны юзер випадкова выкарыстоўвае яго першы, Токен А стае пазначаным як выкарыстоўваны і фактычна «мертвым», а ў яго месцо выдаецца Токен B. Калі зловмешчык пазней прабуе выкарыстаць той самы Токен А, сервер адзначае яго як токен, які вже быў выкарыстоўаны, што ёсць явным сігналам аб падазроўанні. Залежна ад таго, насколькі строга настроены система, такая адзначка можа спрычыніць анулюванне всего ланцуга токенаў, прыяўязаных да той сесіі, а не толькі адзінаго скомпрометаванага.

    Это ставіць вас у наблыжэннае сильнейшае положэнне, чым у ситуацыі, калі той, хто першы захопляе токен, фактычна выграўа контроль назаўсёды.

    Анулюванне, таму што выход з акаунта павінен насправдзе значыць каляквіснае

    JWT-ы часта апісваюцца як безстановыя, і з тэхнічной точка зору гэта правды. Але кожная рэальная система патребуе прынеймна часткі стану, і выход з акаунта — гэта сама ясная сфера, дзе гэтыя патрэбны ўместы праявляюцца.

    Якщо корыстнік нажме «Выйсці» і ўсё, што адбуваецца, — гэта тое, што токен выдаліваецца з фронтэнду, сам токен застаецца абсалютна дыяўальным пакуль не істэць сама сабою. Сервер не мае жаданага уявлення пра тое, што корыстнік «выйшаў», у жадным значыцьным сэнсе, таму ён будзе і далей прымаць той самы токен, якщо ён зноў будзе представлены прычым да тэрміну його істэкання.

    Токены апдэтаў даёная рэальны механізм для выкарыстоўвання з бакэнду для стежыць за сесіямі і ўсунення іх. Да момента выйшчы з акаунта токен сесіі належыць да актыўных. Калі адбываецца выйшчы з акаунта, гэты токен павінен быць прызначаны як анульованны, і будзь-якае пасляэтапнае спроба выкарыстоўваць яго для апдэта мусі завершыцца нявдала. Саме так выглядае справжнія процес выйшчы з акаунта, а не той, які ўсё толькі візуальны.

    Выйшчы з акаунта павінна выконвацца на бакэндзе, а не толькі на фронтэндзе

    Спрасцаваная версія выйшчы з акаунта, яку часта рэалізуюць пачатківцы, — это проста выдаленне токена з локальнага хранэння або з таго месца, дзе кліент яго зберагае, а потым працэс завершваецца.

    Болей полны і адказвальны процес выйшчы з акаунта зазвычай выглядае так:

    1. Кліент адправляе запит POST /auth/logout
    2. Сервер выявляе, да якой сесіі належыць гэты запит
  • Сервер анулюе токен апдэтаў чы сесію, якая да ёнага прыязджана
  • Толькі тады кліент чыстае свой локальны стан
  • Ключовы момент, які варта падчеркнуць, — гэта тое, што выход з акаунту ў сутнасі являе сабою захоўнай прыемлівы ўдар на стороне сервера. Якщо ваша рэалізацыя выходу з акаунту вплывае толькі на тое, што зберагаецца на стороне кліента, вы на самай працоўцы не вывелі пользователя з акаунту, а проста заставілі ваш інтерфейс забыць, што такі пользователя існаваў.

    Адліквідацыя па канферэнцыі, дзе насправды трэба зберагваць гэты токен

    Выборы спосаба зберагчыка маюць большое значэнне, чым можа здавацца на першы пагляд. Для прыкладоў, якія работаюць у браузеры, распашчаны падход — гэта размешчэнне токена апдэтаў у кукі, налаштаванай з калькама спецыфічных атрыбутаў:

    • HttpOnly, які не дазволяе JavaScript на стороне кліента чытаць яго безпосередна
    • Secure, які абмежвае його перавозку толькі через HTTPS
  • SameSite — параметр, які скасоўвае рызык падвержэння певных категорый атак між сайтамі
  • Аднак жадны з гэтых налашчэнняў не робіць кукі автаматычна незаражанай. Вам яшчэ трэба врахоўваць заходы захоплення ад CSRF, спосаб працы домэна і шляху, правілы заканчэння тэрміна сесіі і тое, як процес выйшчы з системы взаімаецца з усімі гэтымі элементамі. Не існуе адного шаблона зберагчыка, які можна было б скопіяваць з інструкцыі і даваць яму абсалютную доверлівасць, не прыстосаваўшы його да архітэктуры вашай сыстэмы.

    Што будзе, якшо токен апавяржэння все-такі выцячыць

    Самэ гэты сценарый зробіў важлівым прыем періядычнага змененыя токенаў.

    Якщо як законны ўжыткар, так і зловершальнік яким-небудзь чынам атрымуюць однаковы токен апавяржэння, а ваша система дазволяе без ліміту перадаць гэты токен знову, то практычна немае можлівасці розразліцаваць гэтыя два суб’екты. З точкі зору сервера обе просьбы выглядаюць аднакова законнымі.

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

    Гэта ўласна галоўная прычына, чаму токены апавяржэння трэба спрыймать як проблему ў дизайне безпекі, а не як што-то, што можна рашыць проста стварэнням ўтолькі іншага JWT.

    Токены апдэта таксама павінны выгораць

    Это легкая деталь, якую часта занедбваюць, але токены апдэта таксама не павінны быць вечнымі. Без терміну выгорання крадзены токен апдэта фактычна стае «заднім варотам», якія ніколи не закрываюцца.

    Звычны пункт выйска — гэта, напрыклад, 15 хвілін для токенав доступу і 7 дзён для токенаў апдэта, хоць точныя цифры, якія вы выберазе, павінны адпраўляцься вашай сабестойкасці да рызыку, а не тым показнікам, якія з’яўляюцца ў першым туторыяле, які вы знайдзеце.

    Цікава будзе чыста псіхічна разліка межу трымстанам токена і трымстанам сесіі, адколі гэта не адна і тая ж сама концэпцыя. Сесія можа заставацца актыўной пра дзейны час завдяк павтаральным цыклам ротацыі, нават як кожны окремы токен жыве лишэнь каля короткага періоду часу.

    Памылкі, якія варта не выучваць або на якія варта зважаць

    • Токены адыянкі, які застаюцца актываўнымі пра дужы час, што падвайшвае рызык, якщо яны стануць відкрытымі
    • Токены апавяржэння, якія зовсама не маюць терміну выканання, і ўсёле даюць можлівасць несанкціонаванага доступу
    • Полное ігнораванне процеса ротацыі токенав, што значна ускладняе выяўленне крадзіжкі
    • Абсэнцыя механізма анулювання, якая не дае можлівасці завершыць сесію раней, чым яна сама заканчыцца
    • Розгляд процесу выйшчы з акаунта як чагось, што відбываецца толькі на фронтэндзе
    • Недбаласць у карыстоўванні секрэтнымі даннымі, якая прыводзіць да таго, што токены потрапляюць у логі, URL-адрэсы або сховышкі на стороне кліента, дзе яны не павінны быць
    • Ігнораванне адказвання на падазры на паўтарэнне викорыстоўвання токенав, адколькі ротацыя токенав без пераканальвання ў паўтарэнне насправды не дае значныя захопленасці

    Рэальная перацэнка процесу апавяржэння

    Процес аутентыкацыі патрабуе такога ж розмеру перацэнкі, як і будзь-якае інша критычная частка вашага прыёмніка. Чырвоныя паследованасці, якія варта працаваць:

    1. Зайсці ў систему і пераканаецца, што вы отрымалі як токен даступу, так і токен апавяржэння
    2. Апыліце захоўваную маршрут з дыяўальным токенам даступу і пераканаецца, што вы отрымалі код 200 OK
    3. Апыліце захоўваную маршрут з токенам даступу, які выйшаў з часу дзеяння, і пераканаецца, што вы отрымалі код 401
    4. Апыліце канечную точку апавяржэння і пераканаецца, што вы отрымалі новы токен даступу (а таксама новы токен апавяржэння, якщо ўвімкнута замена)
    5. Спробуйце падараваць стары токен апавяржэння, які вже быў заменены, і пераканаецца, што ён адхіліваецца
    6. Выйдзіце з системы, а потым спробуйце апавярзіць насупраць тэй сесыі, якая вже не дыяўальна, і пераканаецца, што ёй таксама адхіляюць

    Выяўленне проблем на гэтым этапе ў дзiesяць разоў дышэўлівей, чым іх адкрыць пасля таго, як дапынг стане доступным.

    Полная карціна

    Login
      ↓
    Access Token + Refresh Token issued
      ↓
    API requests using Access Token
      ↓
    Access Token expires
      ↓
    Refresh Token sent to refresh endpoint
      ↓
    Server validates session
      ↓
    Refresh Token rotated
      ↓
    New Access Token issued
      ↓
    API requests continue
    

    Якщо падае праварунак у будзь-ям моманцы гэтага последовальнасці апдэйта — токен выйшаў з часу дзейнасці, быў анульваны чы проста ёсць нэвалідным — адпаведнае рашчынанне будзе 401, і корыстніку паводзіцца занова заўходзіць з самага пачатку. Гэта раздзеленне між „короткачасным правам на вызов API“ і „дзейнасцю права заўсёды заўходзіць“ ёсць справжней ідэяй, стоячай за всім гэтым распадзелам, выказанай у адной фразе.

    Чакліст для прадзейнаўскага стадію

    Дизайн токенаў

    • Чы токены доступу дзейнаюць быстра?
    • Чы токены апдэйта таксама маюць свой час дзейнасці?
    • Чы токены апдэйта можна викорыстоўваць толькі на спецыяльным эндпоінтэ для апдэйта, а не на будзь-якіх іншых маршрутах?
    • Чы пакеты даных токенаў не містяць большай колькасці інфармацыі, чым трэба?

    Безпека

    • Чы ўсюды неабходны HTTPS?
  • Чы рэфреш-токены зберагаюцца ў безпечным месцы?
  • Чы секрэты зберагаюцца окольна вашай базы коду?
  • Чы токены вычысляюцца з логаў?
  • Чы захіст ад CSRF прыменяецца там, дзе гэта неабходна?
  • Адрабатка сэсій

    • Чы можна анулюваць рэфреш-токен за патрабавам?
    • Чы выход з акаунта відбываецца на серверы, а не толькі на кліянты?
    • Чы фактычна рэалізавана замена токену?
    • Чы можна выявіць, калі токен знова викорыстоўваецца?

    Прыкройка тэстаў

    • Валідны рэфреш-токен даўае успех
    • Аканчылыся тэрмін дзейнасці рэфреш-токену — неякшае рашыданне
    • Анульованы рэфреш-токен — неякшае рашыданне
    • Некоректны або валідны рэфреш-токен — неякшае рашыданне
    • Токен, які ўжо змěнены, — неякшае рашыданне
    • Правільны выход з акаунта завершае вялікую сэсію

    У чым усё гэта супакоюецца

    Автанацыя — гэта не проста парадактычна перакананне ў аідэнтыце чалавека ў момент яго заходу. Цэя процедура таксама включае прыняттые рашэнні ў тым, як давго гэта довяр’е должна застацца, і ўсуненне перашкод у яго падтрымцы.

    JWT-файлы спрощуюць частку, якая кансультуе пра перакананне ў тым, хто вы. Але яны не даюць безкоштовна кантролі сесый, можлівасці ўсунуць токены, правільнага выйшчы з системы, захавання ад крадзеных токенаў, выявлення ўжывання токену колькі разоў, безпечнага хранэння чы правямільных термінаў выканання. Кожны з гэтых аспектаў — это рашэнне, якое вы самі должны прыняць. Чым большай і популярней становіцца ваша прыкладная програма, тым больш значэнне набіраюць гэтыя рашэнні.

    Што будзе далей

    Колі токены доступу і апавяржэння нарэшце стануць зрозумелымі, наступны аспект, які варта дакладней розглядзець, — это кантроль сесый у большых масштабах:

    • Як следуе кераваць пользователям, який залишаецца залогаваным на пяці разных прыстроях?
  • Чы гэтыя корыстнікі павінны магчымаць адзіроўваць — і завершыць — свае сэсіі, якія ў яных актыўныя?
  • Чы можна выйсці з адной прыстрою, не заканчваючы ўсіх сэсій, якія у корыстніка є?
  • Як выглядае "падазроўная" сэсія, і як яе пазначыць?
  • Як правільна храніць сем’і токенав апавяржэння?
  • У які момент модель сэсій, апошнаваная базай дадзенаў, стае прыемнейшай, чым выкарыстоўванне толькі JWT-аў без стану?
  • Сам напісанне маршрута для заходжання можа займаць дзесят каленак коду. Стварэнне системы аутантыкацыі, якой можна справжнья ўпэўніцца, выклікае значна большыя зусилля.

    Спадні матэрыялы

  • Чаму дэкодаванне чакункаў буфера як тексту разбівае аплодаванні файлаў — Пасвячана таму, як пераклад чырвонавых дадзеных буфера як текста UTF-8 таямніча паспалюе аплодаваныя файлы, і паказвае правільную обработку на рэвэлі, каб гэтага ужо не было.
  • Сесіі проты JWT: Выбор правильнага модэлю аутантыкаціяў у Node.js — Дазволяе дакладна разумець, у чым розніця межа сесіямі і JWT-амі ў аутантыкацыі Node.js, дзе кожны з іх мае сваія слабасці, і як правільна выбраць адны з іх, каб пазней не шкадаваць.
  • Імплементацыя токэнаў доступу і падтрымкі разам у Node.js — Пасвячана таму, як у Node.js сумаваць токэны доступу з мянюючыміся токэнамі падтрымкі, каб досягнуць балансу межа безпекай і павольнага працывання сесій корыстувачаў.