Ответ
Основные механизмы авторизации для веба:
-
Cookie-based (Session-based) Authentication
- Как работает: После проверки логина/пароля сервер создает запись сессии (например, в БД или Redis) и отправляет её уникальный ID клиенту в cookie.
- Пример установки cookie:
HTTP/1.1 200 OK Set-Cookie: session_id=s3cr3tS3ss10nId; HttpOnly; Secure; SameSite=Lax - Почему это важно:
HttpOnlyзащищает от кражи через XSS,Secureгарантирует передачу только по HTTPS,SameSiteпомогает против CSRF-атак.
-
Token-based Authentication (часто с JWT)
- Как работает: Токен (обычно JWT) хранится на клиенте (в
localStorageилиsessionStorage) и отправляется в заголовкеAuthorization. - Пример запроса с JWT:
fetch('/api/data', { headers: { 'Authorization': 'Bearer ' + localStorage.getItem('jwt_token') } }); - Почему это важно: Позволяет строить SPA (Single Page Applications) и мобильные клиенты, независимые от серверных сессий. Однако требует защиты от XSS для безопасного хранения токена.
- Как работает: Токен (обычно JWT) хранится на клиенте (в
-
OAuth 2.0 / OpenID Connect (OIDC)
- Как работает: Пользователь перенаправляется на страницу провайдера (Google, GitHub), где дает согласие. После успеха провайдер перенаправляет обратно с
authorization_codeили сразуaccess_token. - Почему это важно: Пользователям не нужно создавать новый пароль. Приложение получает ограниченный доступ к данным пользователя на стороннем сервисе.
- Как работает: Пользователь перенаправляется на страницу провайдера (Google, GitHub), где дает согласие. После успеха провайдер перенаправляет обратно с
-
Basic Authentication
- Как работает: Браузер отобрачает стандартное диалоговое окно для ввода логина и пароля, которые затем передаются в каждом запросе.
- Почему это важно: Крайне редко используется для пользовательских веб-приложений из-за низкой безопасности и плохого UX. Может применяться для защиты административных или внутренних панелей.
Ключевые аспекты безопасности для веба:
- Всегда использовать HTTPS.
- Для cookie: флаги
HttpOnly,Secure,SameSite. - Для токенов в JS: осознавать риски XSS и использовать короткое время жизни токена (JWT
expclaim) с механизмом обновления. - Защита от CSRF (например, с помощью токенов CSRF или политики
SameSiteдля cookie). - Защита от XSS, так как она может привести к краже сессионных cookie или токенов.
Ответ 18+ 🔞
Ну, слушай, раз уж зашла речь про то, как пользователей в вебе пускать, а кого — нахуй, давай разложим по полочкам, как это устроено в реальной жизни. А то ведь некоторые думают, что это магия какая-то, а на деле — простая, хоть и важная, хуйня.
1. Сессии через куки (Старая добрая классика) Представь: пользователь ввёл логин-пароль, сервер их проверил и думает: «Окей, чувак, ты свой». Но сервер — он же не слон, чтобы помнить каждого. Он создаёт в своей памяти (или в БД, или в Redis) запись — сессию. А клиенту в ответ суёт бумажку с номерком этой сессии. Эта бумажка — кука.
HTTP/1.1 200 OK
Set-Cookie: session_id=s3cr3tS3ss10nId; HttpOnly; Secure; SameSite=Lax
Вот эти флаги — они не просто так, это бронежилет для куки. HttpOnly — чтобы какой-нибудь ебучий XSS-скрипт не утянул её, Secure — летает только по HTTPS, SameSite — защита от CSRF, чтобы с других сайтов не прилетали левые запросы от твоего имени. Просто, но надёжно, как топор.
2. Токены (JWT и прочая современная хуета) Тут философия другая. Сервер не хранит хуя. Всё состояние зашито в сам токен (обычно JWT). Клиент получает эту зашифрованную строку и таскает её с собой в каждом запросе, обычно в заголовке.
fetch('/api/data', {
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('jwt_token')
}
});
Удобно для SPA и мобилок — серверу похуй, он просто проверяет подпись токена. Но есть нюанс, ёпта: токен обычно лежит в localStorage. А это значит, что если на сайте найдётся XSS-дыра — токен уплывёт, и злоумышленник сможет им пользоваться, пока срок жизни не истечёт. Поэтому короткий exp и механизм refresh-токенов — твои лучшие друзья.
3. OAuth 2.0 / OpenID Connect (Давайте жить дружно) Это когда твоё приложение такое: «Э, пользователь, не хочешь ли ты войти через Гугл?». Пользователь идёт к Гуглу, тот спрашивает: «Ты уверен, что хочешь дать доступ этому подозрительному сайту?». Пользователь говорит «Да», и Гугл выдаёт тебе токен доступа к его данным (в рамках разрешённого). Пользователь счастлив — пароль новый придумывать не надо. Ты счастлив — часть логики аутентификации на тебе не висит. Все в плюсе, кроме параноиков, которые никому не доверяют.
4. Basic Authentication (Каменный век) Браузер показывает то самое стандартное окошко «Введите логин и пароль». Эти креденшиалы потом кодируются в base64 и пихаются в заголовок каждого запроса. Выглядит страшно и небезопасно. Для публичных веб-приложений — полный пиздец и моветон. Может сгодиться разве что для какой-нибудь внутренней админки, закрытой от всего интернета.
А теперь про безопасность, без которой всё это — говно:
- HTTPS — обязательно. Без него все твои куки и токены летят по сети как голые по проспекту.
- Для кук:
HttpOnly,Secure,SameSite. Выучи как «Отче наш». - Для токенов в JS: помни про XSS. Короткий срок жизни (
exp) + refresh-токен, хранимый максимально безопасно. - CSRF: либо используй
SameSite=Lax/Strictдля кук, либо генерируй CSRF-токены. - XSS: если его не победить, то всё остальное — ебаная профанация. Любой скрипт сможет украсть сессию или токен. Санитайзация, экранирование, Content Security Policy (CSP) — твои главные инструменты.
Вот и вся магия. Ничего сверхъестественного, но если накосячить в основах — будет очень больно и стыдно.