Вы не должны включать защиту CSRF только для клиентов ajax - это не имеет никакого смысла. Как вы можете отличить «ajax» клиента от «нормального» клиента? Если это будет сделано, например, по некоторому параметру запроса злоумышленник может просто использовать эту «обычную» ссылку для совершения плохих действий.
Когда вы используете аутентификацию на основе токенов, злоумышленник не может просто использовать общий URL-адрес для прозрачной аутентификации вашего запроса. Вот почему только аутентификация на основе сеанса требует, чтобы в запрос был включен действительный токен CSRF.
Так что по соображениям безопасности есть 2 варианта:
- либо использует аутентификацию на основе сеанса, но затем вам нужно отправлять cookie-файл аутентификации и токен CSRF с каждым запросом;
- или используйте аутентификацию на основе токенов, что проще, поскольку вам нужно только предоставить аутентификационный токен, например, в качестве параметра запроса.
Могу ли я использовать аутентификацию токена, которая получает токен из стандартной таблицы django_session? просто использовать это как токен?
Теоретически вы можете достичь этого, написав некоторое специальное промежуточное программное обеспечение для аутентификации, которое будет использовать токен из параметра запроса и сопоставлять его с таблицей сеансов, но в целом это плохая идея.
Во-первых, при использовании еще одной таблицы нет таких больших затрат, но без этого вы затрудняете чтение и обслуживание системы.
Во-вторых, это также сделает систему более хрупкой. Поскольку сеансы и токены - это 2 совершенно разные сущности, они могут иметь, например, другая жизнь. Сессии могут быть сброшены, их TTL может быть короче / длиннее, чем TTL токена. Например, TTL сеанса django по умолчанию составляет 2 недели. Хотите усложнить логику удаленного сервера, чтобы получать новые токены каждые 2 недели? Или представьте ситуацию, когда токен скомпрометирован. Вы также хотите заставить ajax-клиента выйти из системы?