Апранаванне слоўніку аутэнтыкацыі: ключы API, сесіі, JWT, OAuth2, OIDC, SSO
Дазвольце даклэ расумець, як ключы API, сесіі, JWT-ы, OAuth2, OpenID Connect і SSO адносуюцца адзін да другога, разгрупаваючы кожны з іх пад адной запыткай: хто выклікае, чым вони можаць займацца.
Разработчык дадзеў проекту опцыю „Увайсіць за дапамогою Google“, побачыў, што апынулася токен адзначэння прав, і счылаў задачу завершанай. Аднак колега задае просты вопыт: як сама програма фактычна з’яўляе, канкрэтна яны ёсць корыстнік? Часта чыстасловны адказ — што яна гэтага не з’яўляе, таму што была створана система делегавання прав, а не процэс увайшання. Такія тэрміны, як JWT, session, OAuth2, OIDC і SSO, зазвычай адгледваюцца поўна окрема, і самэ гэта прычына таго, што яны зліваюцца ў адно. У этай статыце кожны з іх практычна показаны на адной схеме, ў результате чаго можна з’ясавіць, якую самэ проблему рашае конкрэтны элемент вашай тэхнічной структуры, і выбраць правы инструмент для наступнага крока.
Два вопыты за кожным механізам аутэнтыкацыі
Практычна всё ў гэтай сфере адпавядае на адны з двух вопытаў.
- Аутантыкацыя спрашвае хто вы? Это процес пераканання аідэнтычнасці, чыя бы тая аідэнтычнасць належала чалавеку, сервісу у спадней частцы сеткі чы ў прыстрое.
- Автарызацыя спрашвае што вам дазволена робіць? Яна выконвуецца пасля таго, як аідэнтычнасць установлена, і вяршыць пра тое, якія рэсурсы і дзеянні є доступнымі.
HTTP уже кодуе гэты разлік у своіх кодах статусу. Адпаведна 401 Unauthorized адпаведзь значыць, што абэрнент не падтвердзіў, хто ён (незважаючы на падманлівае называнне, гэта стосуецца аутантыкацыі). Адпаведна 403 Forbidden адпаведзь значыць, што сервер точна ведае, хто абэрнуўся, і ўсё жа адмовляе ў запытэ. Якщо ваш API вяртае 403 з-за нехваткі токена чы 401 для пользователя, які не мае ролі, кліенты не можуць вядомаць, чы трэба запрашваць заходжанне чы паказваць прыведзенне "без даступу">.
Фізычны аналагія дапамагае. Блізу входу ў офіс страж няватоўвае вашу карточку працавальніка; гэта і ёсьце аутентыфікацыя. Калі вы ўжо ўсередзіне, ваш бейдж адкрывае дзеякія дверы, а не іншыя; гэта ўжо автарызацыя. Одна процедура паводлівае ідэнтычнасьць, другая — надае правыя; система можа прыняць першую, але адхіліць другую. Чырвоныя падробнейшае аб тым, дзе кожны пераказ патрабуецца ў коде прыемлівання, адзірніце аутентыфікацыю проты автарызацыі і тое, дзе кожная з іх патрабуецца.
Зберагаючы гэтыя два пытаньні ў галаве, вы лепей разумееце рэшту матрыцы. Кожны з наведзеных нижэй механізмаў стае зрозумелым, калі вы ведаеце, на якое з пытаньніў ён адпавядае.
Клучы API: ідэнтыфікацыя кліента, а не адзбыркі
Клучы API ўособліва проста форма аутэнтыкацыі кліента. Прадастальнік выдае вам унікальны рэчыск, який вы надаеце з кожнай запитам, а сервер практычна яго пораўнюе з клучамі, якія ён мае у своіх записах.
Authorization: Bearer your-api-key-here
Іншыя прадастальнікі викорыстоўваюць спецыяльны загалоўкі, такія як X-API-Key; ідея застаецца тая ж. Клуч не паводзіцься нікаму конкрэтнаму. Це незрозумелая значэнне, таму сервер павінен яго знайсці, каб дазнацца, який акаунт выканаў запит. У ёму няма вбудованага тэрміну дзейнасці, якщо толькі вы яго не зададзіце, і той, хто мае выкрадзены клуч, мае тыя ж правы на доступ, як і його законны власнік. Таму абавесця, адгакоўка тэрмінаў дзейнасці і схованне клучоў ёсць вашай адпаведнасцю.
HTTP Basic-аутантыляцыя, якая адправляе імя паведамчыка та пароль у кодаванні Base64 ў заголовку, таксама існуе. Base64 — это кодаванне, а не зашыфраванне, таму Basic-аутантыляцыя ў безпеці толькі через TLS, і яе важка адправаць паzaчынанням дужа простых внутраніх інструментаў. API-клучы є болей распашчаным і лёгкім выборам, і яны падходзяць, калі вы контролюеце оба канцы з’ѐеднання або калі сервіс выраховвае плата та обмежвае колькасць запытак на адну адказку.
Тыповыя месцы, дзе можна зустрэць API-клучы:
- API модэляў AI
- Шлюзы платежаў
- API даных пра пагоду та іншыя даны
- Запыткі между вашымі сабскрыпцыямі
Зверніце ўвагу, што не ўключана ў гэты список: канечныя корыстувальнікі, якіе заходзяць у вашае прыладдзе. API-клуч ідентыфікуе запытаючае прыладдзе або адказку, а не чалавека, які сядзіць за экранам.
Сесіі: стан сервера, які зберагаецца ў куку
Задоўга да таго, як JWT-ы сталі популярнымі, сесіі былі стандартным спосабам падтрымкі прыўязанасці корыстніка, і яны застаюцца эфектывным выборам для аплікацыяў, якія обробляюцца на сервере.
Процес просты: корыстнік адправляе свае упраўнення, сервер яны пераканальвае і стварае запис сесіі ў якомнебудзь хранільніку (памяці, Redis або базе дадзенаў), а у адпаведным адказе ставіцца кукі, якая містыць толькі ідэнтыфікатор сесіі. Пры кожным наступным запите браузер адправляе гэтую кукі назад, і сервер шукае ідэнтыфікатор, каб знайсці сесію і прыўязанага да яе корыстніка.
Такія рашэнні є залежнымі ад стану, але гэта таксама ўжо і ўсё якіх толькі их прынада. Сервер зберагчыць правдзівую інфармацыю, таму выключэнне корыстніка з системы або анулювання скомпрометаванай сесіі ўсё толькі адбываецца праз выдаленне відпаведнага запису. Сама кукі не несе нічога супернаватковага, кроме вялікай варыятывнасцю ідэнтыфікатора.
Косцы практычна з’яўляюцца, калі вы расшырываеце систему гораздка. Якщо кілька сервераў обробляюць трафік, усе яны павінны магчымаць доступ да адной і той жа базы дадзеных сэсій; іншаўя, паўтарна ўваходжэнне пользователя на іншы сервер будзе выглядаць як анонімныя дзеяння. У практыцы спакульная інстанцыя Redis добра рашае гэту проблему, але яна ўтварае ўсё больш элемент, які трэба разместіць, стежыць за якім і правільна налаштаваць, а неправільна налаштаваная база дадзеных сэсій — гэта тып проблем, якія выявляюцца самэ ў найгоршы момент пад час выпуску.
Сэсіі застаюцца выключным рашэнням для:
- Традыцыйных веб-дзеяноў, якія генеруюцца на серверах
- Панелей адзначэння стану системы
- Дзеяноў, дзе моментальнае анулювання мае большое значэнне, чым відсутнасць стану
JWT: самодастатні, падпісаны і чытальны
JSON Web Token — это падпісаны JSON-об’ект, які мае такія элементы, як ідэнтыфікатор пользователя, ролі та час заканчэння дзейнасці. Ён складаецца з трох частак, закодаваных у формате base64url, з’ѐеднаных крапкамі:
Header.Payload.Signature
У заголовку указваецца алгорытм падпісаў, у тэле знаходзяцца даны, якія неабходны для аутентыкацыі, а падпіс дазволяе серверу пераканацца, што ніякая з частак не была зменена без ключа падпісаў. Паколькі даны для аутентыкацыі знаходзяцца ўнутрь токена, сервер можа атрыбуцыяваць запит, пераканаўшыся ў падпісе і прачытавшы тэлу, без неабходнасці выкарыстоўвання базы дадзенаў. Самэ гэта якостнае асоблівасць робіць JWT падходзячымі для безстановых і распрашоўных систем.
Падпісанне не значыць секрэтнасць
Найбольшая памылка — гадка, што JWT скрывае свой адказ. Гэта не так. Стандартны JWT падпісваецца, але не шифруецца, і кожны, хто яго мае, можа расшыфраваць ўпакованы адказ за дапамою простага вызову base64. Ніколі не кладзіце пароў, персональных дадзеных, якія вы не хацеце паказваць корыстніку, або внутрашняя таёмнаць у элементах JWT, вырачоўваючы, што яны є прыватнымі. Калі выйшае інцыдент, звязаны з JWT, часта прычыной яго ёст тая хвораблівая гадка. (За спецыфікацыяй JWE існуюць шифруваныя токены, але яны ўтвараюць околічны формат і рэдка калі маюць на увазе тое, што пад «JWT» мае на увазе інструкцыя.)
Токены доступу і апавежэння
Паколькі JWT застаецца чынным да момента выгорэння, звычайная схема включае два токены:
- Токен доступу: короткага тыражу жыцця, зазвычай ад 15 хвілін да гадзіны, і надаецца з кожным запытам API.
Храніце токен апдэта ў кукі HttpOnly, а не ў localStorage, куды любы вставлены скрыпт могаў бы яго прачытаць. Короткая трымкі токена доступу обмежвае наследкі вылету даных, тады калі логіка анулювання можа знаходзіцца ў токене апдэта.
JWT-ы добра падходзяць для API, мобільных кліентаў, аплікацый з адной сторанай і распадзеленых служб. Яны не зробілі сэсіяў застарелымі; яны заменяюць лёгкае анулювання на отсутнасць стану, і правы выбор залежыць ад вашай архітэктуры. У параўнанні сэсіяў і JWT-аў як модэляў аутантыкацыі для Node.js дакладна расказваецца пра гэты компроміс.
OAuth 2.0: делегаваны доступ, а не увайс
OAuth 2.0 — это канцэпцыя, якая частаеўна патрапляе не туды. Цэе рамка автарызаціі, а не пратакол аутантыкаціі. Яе задача — дазволіць адной прыкладнай програме з доступам да рэсурсаў, якія знаходзяцца у іншай службе, дзеяць ад імені пользователя, без таго, каб пользователь паказваў свой пароль.
У стандартным процесе з кодам автарызаціі ваша прыкладная програма пераправляе пользователя на экран з падтрымкай ад прадаўцы, дзе ставіцца такое запитанне: "Дазволіць гэтай прыкладнай програме пераглядаць вашы файлы у Google Drive?". Якщо пользователь пагадаецца, прадаўца пераправляе яго зь тымчасовым кодам автарызаціі. Ваш бэкенд адмаенывае гэты код на токен даступу, а пасля выкарыстоўвае яго для вызову API прадаўцы.
Такі токены доступу парадызуюць права на адчыненне пэўных ресурсаў. Яны не ўтвараюць інформацыі пра тое, каму належы корыстнік, а спецыфікацыя OAuth2 не вказывае ўсунутую формату і не выклекчвае, каб ваша прыкладная програма магла яго чытаць. Спрытліванне прыбутку токена доступу як доказа таго, што корыстнік заўважаны, — гэта класычная памылка з першага сценарыю, якая створыла рэальныя вразломы, напрыклад, калі токен, выданы адной прыкладнай програме, прыймаецца як доказ ідэнтычнасці іншай.
OAuth2 створаны для адпаведзення на такія запитанні:
- Чы магчыма, каб гэтая прыкладная програма чытала файлы корыстніка ў Drive?
- Чы магчыма, каб гэтая прыкладная програма адчыняла репазітарыі корыстніка?
Ён не створаны для адпаведзення на запитанне: хто ёсць гэты корыстнік?
OpenID Connect: шар ідэнтычнасці на базе OAuth2
Якщо OAuth2 паведамляе, калі прыстрыё можа адзейсцаваць, OpenID Connect дадае нехватную інфармацыю пра тое, хто ўсё-такі яе власнік. OIDC — это просты шар ідэнтыфікацыі, створаны на базе OAuth2, які перадае його механізмы перенаправленняў і адмены токенаў. Калі вы нажмете «Увайсці за дапамогою Google», пад час гэтага процесу выкарыстоўваецца самэе OIDC, а не проста OAuth2.
Пасля таго, як корыстнік паверыцца, прадаўцу OIDC вяртаюць два токаны з разнымі функцыямі:
- Токан ID — это JWT, які описвае корыстніка: стабільны унікальны ідэнтыфікатор, а таксама зазвычай містить такія данні, як іме і электронная пашта.
- Токан адзейску — які дазволяе вашаму прыстрыю вызываць API ад імені корыстніка.
ID-токен являецца тым элементам, які аутентыфікуюць пользователя ў вашай працоўнай аплікацыі. Токен даступу дае права на выкананне наступных дзеянняў вашай аплікацыі. Яшчэ до таго, як паверыць у тыя даны, якія надае ID-токен, ваш бэкенд должен пераканацца ў падписе, выдавцы, аудыэнцыі і терміне дзейнасці токена, а таксама прыкрепіць аккаунты пользователяў да стабільнага ідэнтыфікатора, а не да адресы электронной пошты, якая можа зменіцца. Якща смотрэць так, OAuth2 сама по сабе не можа забезпечыць вход; OIDC дапамагае ў цім.
SSO: апыт, які реалізуецца за дапамогою протакалаў
Механізм адного входу часта плутаюць з протакаламі, якія яго реалізуюць. SSO — это шаблон апыту пользователя: аутентыфікацыя адной раз і падаленне межаў кальколька систем без неабходнасці занова входзіць. Вядомым прыкладам є Google: адной раз зайшоўшы, вы можете користацца Gmail, Drive, Calendar і YouTube без дадатковай аутентыфікацыі.
Два протакала выканаюць большую частку работ, якія лежачы за механізамом SSO:
- SAML: Апоўнена тэхналогія, яка базуецца на XML, і ёй прыходзіцца вялікую ролю ў корпаратыўных средах, такіх як корпоратыўныя порталы, панелі керування CRM і внутрашнія інструменты.
- OpenID Connect: Апоўнена тэхналогія, яка базуецца на JSON і JWT; ёй нейкі час, але яна ўжо стала стандартам для веб- і мобільных прыкладнікаў.
SAML є дыявольска складнойю для реалізацыі і дыягностыкі, таму для новых системаў OIDC зазвычай є простым выборам. SAML застаецца практычным рашэнням, калі трэба інтеграцыя з корпаратыўнымі сервісамі аутэнтыкацыі, якія не падтрымлівають OIDC, а такіх сервісаў яшчэ многа.
Калі хтось прасіць вас "дадаць SSO", першым крокам є выявленне таго, які протакол падтрымлівае ўпрабавач аутэнтыкацыі. Гэтае рашэння вплывае на выбор бібліятак, настройкі і процес тэставання.
Выбор механізма
Якщо ствараць апрымклівыя крэтынгі для выбору, то ён выглядае так:
- Ваша служба запускаецца іншымі праграмамі, а не людзьмі: ключы API, якія маюць адміністратываны час дзейнасці і зменшуюцца, або крантэнцыя кліента OAuth2, якщо вам патрэбны токены з заканчыць часу дзейнасці.
- Програма, якая обробляецца на серверы, або панель адміністрацыі з сае механізамам выхаджэння: сесіі з безпечным кукіем
HttpOnly. - Безстановыя API, мобільныя кліенты або больш заўсёды службы, якія пераканальваюць таго ж пользователя: токены доступу JWT з токанамі апавяржэння.
- Ваша програма патрэбуецца дзейсцаваць з дадзеннямі пользователя ў іншай службе: OAuth 2.0.
- Вы хачаце, каб пользователялі выхаджаліся праз існуючыя адказы, такія як Google: OpenID Connect.
- Саветнікі патрэбуецца адна сесія для выхаджання ў больш заўсёды внутраніх або SaaS інструментах: SSO через OIDC, або SAML, калі цэга прадастальніка ідэнтычнасці гэта выклеквае.
Этыя опцыі можаць быць сумаваныя. Тыповы продукт можа выкарыстоўваць OIDC для заходу, пасля чаго выдае свой сэанс або JWT, а таксама зберагае токены доступу OAuth2 для інтэграцыі з трэцімі сторонамі.
Частыя запытанні
Як у практыцы разлічаюцца аутентыкацыя і автарызацыя? Аутентыкацыя пераканальвае ідэнтычнасць і дае адмову з кодам HTTP 401; автарызацыя пераканальвае правыя на выконанне дзействаў і дае адмову з кодам 403. Цэлкава разныя крокі з рознымі кодамі адмовы, і ўжыванне іх разам прыводзіць да сэрйозных прынтасоў у безпеці.
Чы трэба выкарыстоўваць JWT чы сэансы? Сэансы ёсць выгодныя для аплікацый, якія обробляюцца на сервере і можаць дзеліцца базай сэансаў. JWT ёсць болей падходячыя для безстановых API, мобільных кліентаў і распадзеленых систем. Выбірайце на адной заснове вашай архітэктуры і патрабаванняў да анулювання, а не на тым, калькі варыянт здаецца савременнейшым.
Ci ўтварае OAuth2: аутантыкацыя чы разрашэнне? Разрашэнне. Ён дазваляе дапрыямоўкам выходзіць на рэсурсы ад імені пользователя без паўтарнага падтверджэння, хто ён. Для аўтентыкацыі выкорыстоўваецца OpenID Connect, яны ўскладнюе OAuth2 самэй для гэтай меты.
Галоўныя выводы
- Усе механізмы трэба класіфікаваць па аднаму пытанню: хто выклікае? чы шта ён можа рабіць?
- Клучы API ідэнтыфікуюць кліентскія дапрыямоўкі; яны не несу інформацыі пра аўтентыкацыю пользователя і трэбуюць вашага контролю за терміном дзейнасці і замены.
- Сесіі зберагаюць стан на сервере, што спрыяе лёгкай ануляцыі, але на великіх масштабах выказывае патрэбу ў спяльнай базе дадзеных.
- JWT-ы ўсунуты падпісам, а не зашыфраваны; таёмныя даны трэба выкарыстоўваць не ў пакете дадзеных, а токены апавяржэння — не ў
localStorage. - OAuth2 надае дазвол на делегаваны доступ; OIDC дагаўляе токен ID, які фактычна абмежвае доступ пользователя.
Большая частка плутання ў гэтай сфере, укладаючы ў сябе памылку з пункту прыветства «Уваходзіце за дапамою Google», вынікае з аднараджэння гэтых двух пытанняў. Трэба раздзеляць ідэнтыфікацыю і правыя на доступ, тады выбор межа гэтымі інструментамі стане праблемай прыладкі кожнага з іх да пытання, на якое ён быў створаны.