Оформление
РК1: аутентификация, сессия и доступ к данным
РК1 про безопасность. Каждый студент команды — и фронтенды, и бэкенды — понимает, как в его проекте устроены аутентификация, сессия и авторизация доступа к данным, и может показать это в коде, DevTools и curl.
Требования РК1
- Авторизация с валидацией.
- Регистрация с валидацией.
- Страница файла, создание блоков в файле.
- Список файлов пользователя.
Пункты 1–2 покрывают пароли, сессию, CORS и CSRF; пункты 3–4 — доступ к данным: владение ресурсами и IDOR (access-control.md).
Обязательный минимум
Для любого варианта. Невыполнение любого пункта — РК не сдан.
- Пароли хешируются bcrypt или argon2id, не логируются, длина пароля ограничена.
- Ответ на неудачный вход не раскрывает, существует ли логин.
- Все входные данные валидируются на сервере; клиентская валидация — только UX.
- Токенов и
session_idнет вlocalStorage,sessionStorageи в cookie безHttpOnly. - Cookie с refresh-токеном или сессией:
HttpOnly,Secureна проде,SameSite=LaxилиStrict, узкийPath, где применимо. - Logout завершает сессию на сервере, а не только чистит cookie.
- Access-токен живёт не больше 15 минут (A, B); у сессии есть срок жизни (C).
- CORS: точный белый список origin, без
*вместе с credentials; preflight отвечает до авторизации. - Варианты A и C: CSRF-защита на изменяющих методах по минимуму Double Submit, отказ — 403.
- Каждая ручка с ресурсом проверяет владельца на бэке.
- На проде HTTPS; секреты (ключи JWT, CSRF) в переменных окружения, не в репозитории.
Как каждый пункт проверяют на защите — строки [минимум] в checklist.md. Что сверх минимума настойчиво рекомендуется для CSRF — в csrf.md.
Варианты сессии
Принимаются три варианта. Команда выбирает один и на защите объясняет компромиссы.
| A (рекомендуемый) | B (допустимый) | C (допустимый) | |
|---|---|---|---|
| Схема | access и refresh в HttpOnly-cookie + CSRF | access (Bearer) в памяти JS + refresh в HttpOnly-cookie | session_id в HttpOnly-cookie, сессии в Redis/БД + CSRF |
| Что получает XSS | действия от имени пользователя, пока вкладка открыта; токен унести нельзя | то же + может унести access-токен и пользоваться им со своей машины до истечения | как в A |
| CSRF | нужен | только для refresh-cookie: её закрывают Path и SameSite; от login CSRF — проверка Origin / Sec-Fetch-Site и только Content-Type: application/json (настойчиво рекомендуется) | нужен |
| Отзыв | refresh — сразу; access — по истечении TTL | как в A | сразу |
| Работа фронта | credentials: 'include', CSRF-заголовок, повтор после 401 | хранить токен в памяти, ставить Authorization, повтор после 401 | credentials: 'include', CSRF-заголовок |
Токены в localStorage — не вариант, а нарушение минимума (п. 4).
Как выбрать
- По умолчанию — A. Токены недоступны JS, refresh отзывается сразу, access проверяется без БД. Цена — CSRF-защита на каждой изменяющей ручке.
- C — если нужен мгновенный отзыв (logout, «выйти со всех устройств») и команда готова к обращению к Redis или БД на каждом запросе. Фронту проще всего: нет refresh и повтора запроса. CSRF-защита — как в A.
- B — только осознанно, например если API отдельный и им пользуются не только из браузера. На защите команда объясняет, чем B хуже A при XSS и почему пошла на это (variant-b.md).
Вариант один на команду: фронт и бэк реализуют одну и ту же схему.
Что читать
Студенту — по порядку:
- basics.md — аутентификация и авторизация, флаги cookie, site и origin, где хранить токен, JWT, хеширование паролей.
- cors.md — preflight, белый список, credentials, почему CORS не защищает от CSRF.
- Свой вариант: variant-a.md, variant-b.md или variant-c.md — cookie, потоки, что делают бэк и фронт.
- csrf.md — для A и C целиком; для B — разделы «Когда CSRF актуален» и «Login CSRF».
- access-control.md — владелец ресурса, IDOR,
404на чужое, серверная валидация. - pitfalls.md — частые ошибки и как их найти в DevTools и
curl. - checklist.md и questions.md — самопроверка перед защитой.
Ментору — checklist.md (приёмка на стенде) и questions.md (вопросы с критериями ответа).